Compare commits

...

290 Commits

Author SHA1 Message Date
Jakub Steiner
6865dbdd1b spinner: use a 60fps spinner
- sync with gtk+ and provide a fluid spinner

https://bugzilla.gnome.org/show_bug.cgi?id=753064
2015-08-05 13:43:22 +02:00
Carlos Soriano
741c84bc41 modalDialog: Match gtk+ buttons style
Follow the design we have in gtk+ for buttons dialogs,
which are at the bottom and they expand full width, having
the same amount of space for each one.

Also, since this removes any space for non-button widgets
in the button area, move the spinner present in the auth prompt
dialog next to the password entry.

https://bugzilla.gnome.org/show_bug.cgi?id=746108
2015-08-01 02:32:04 +02:00
Florian Müllner
e92f43b83e shell: Fix C99'ism 2015-07-31 20:26:47 +02:00
Florian Müllner
fed79ce4e6 appDisplay: Handle non-UTF8 filename encodings more gracefully
It may be 2015, but users still stumble upon the occasional .desktop
file that uses a filename encoding other than UTF-8. We currently
fail quite spectacularly in that case by not displaying any apps at
all - handle this case more gracefully, by only filtering out the
offending apps.

https://bugzilla.gnome.org/show_bug.cgi?id=651503
2015-07-31 16:52:42 +02:00
Florian Müllner
fc45cf03bf windowMenu: Use CHECK ornament rather than DOT
The dot suggests a radio action, while the items are actually toggles;
in the app menu we use checkmarks in that case, so do the same here.
2015-07-30 18:11:43 +02:00
Florian Müllner
efde11a0f3 theme: Make menu ornament slightly wider
The existing width works well enough for a narrow character like the dot,
but doesn't leave any whitespace for a wider one like the checkmark.

https://bugzilla.gnome.org/show_bug.cgi?id=741366
2015-07-30 17:31:33 +02:00
Kjartan Maraas
fb951ff9b5 Updated Norwegian bokmål translation. 2015-07-30 11:36:32 +02:00
Rui Matos
f5865e895e magnifier: Avoid caret/focus viewport changes while the pointer moves
If there's a caret or focus move we should delay it until the pointer
is stationary for a little while so as to avoid jittery and spurious
viewport movements.

https://bugzilla.gnome.org/show_bug.cgi?id=752138
2015-07-27 18:04:44 +02:00
Marek Černocký
b8c2d4c6c7 Updated Czech translation 2015-07-24 22:04:34 +02:00
Ray Strode
778ad49ab4 authPrompt: allow cancellation before verification starts
The user should be allowed to cancel if verification hasn't
started yet and they're typing in their username. This
commit changes the authPrompt cancel function to not
ignore such requests.

https://bugzilla.gnome.org/show_bug.cgi?id=752739
2015-07-24 09:44:24 -04:00
Ray Strode
fe7dd1305f authPrompt: don't allow next if entry is empty
Normally the user isn't allowed to proceed passed
the username question until they've filled it in.
To ensure this, the authprompt code desensitizes
the next button when the number of characters change to
zero.

Unfortunately it fails to desensitize the next button
up front when the entry starts out empty.

This commit addresses that bug.

https://bugzilla.gnome.org/show_bug.cgi?id=752739
2015-07-24 09:44:23 -04:00
Ray Strode
378a3df5ea authPrompt: set next button to next when asking for username
If the next button ever gets set to Sign In, it won't
get reset to next until the next question asked by pam.

This commit ensures it gets reset to Next when asking
for the username.

https://bugzilla.gnome.org/show_bug.cgi?id=752739
2015-07-24 09:44:21 -04:00
Bastien Nocera
e63b81d69c keyboard: Don't watch D-Bus services we won't use
ff1b76f4c7 made gnome-shell stop looking
at the org.gnome.SettingsDaemon.Cursor service's property values, but we
still monitored the service itself.

https://bugzilla.gnome.org/show_bug.cgi?id=752779
2015-07-23 15:07:10 +02:00
Florian Müllner
c2fa2cdd8a Bump version to 3.17.4
Update NEWS.
2015-07-23 12:48:58 +02:00
Florian Müllner
6f215427f8 overview: Move comment 2015-07-23 12:43:28 +02:00
Florian Müllner
67ed4e0570 overview: Remove unused variable 2015-07-23 12:42:45 +02:00
Daniel Martinez
8a15178557 Update Aragonese translation 2015-07-23 12:16:58 +02:00
Carlos Garnacho
f3ecfab378 windowManager: Add TouchpadWorkspaceSwitchAction
This object (not really a Clutter.GestureAction) sets up a captured-event
handler, which exclusively looks for 4 finger touchpad swipes, emitting
an ::activated signal under the same terms than WorkspaceSwitchAction.

https://bugzilla.gnome.org/show_bug.cgi?id=752250
2015-07-22 21:19:51 +02:00
Carlos Garnacho
804563d5b2 windowManager: refactor WorkspaceSwitchAction callback into separate function
This will be used by the touchpad-specific "action" too, so put it in a
shared place.

https://bugzilla.gnome.org/show_bug.cgi?id=752250
2015-07-22 21:19:33 +02:00
Florian Müllner
c3e5d983b9 st: Replace deprecated key symbols 2015-07-22 16:00:56 +02:00
Florian Müllner
d21edcfed5 st: Replace deprecated macros 2015-07-22 16:00:55 +02:00
Mario Sanchez Prada
9b69a45eee Update gvc submodule to the latest commit from master
This avoids unnecessary calls to match_card_port_with_existing_device()
when connecting to a bluetooth device from the shell's top panel.

https://bugzilla.gnome.org/show_bug.cgi?id=752675
2015-07-21 16:11:01 +01:00
Jasper St. Pierre
7424ee755a shell-app: Stay consistent about application states
When the last interesting window of an app-backed window is removed,
we'll transition it back to STOPPED, but we transition the state and
send out the signal before we clear the running state.

This means that any listeners to the state-changed signal might
encounter a window-backed app that has a running state, but no
windows. If they call, e.g. shell_app_get_name, while in this state,
they'll encounter an assertion fail.
2015-07-16 17:09:39 -07:00
Jasper St. Pierre
ff664fd1d8 shell-app: Track the starting state correctly
Apps that are starting might have uninteresting windows like splash
screens pop up and then go away (like LibreOffice), even when
startup-notification hasn't completed yet. In those cases, we don't
want to transition the app back to stopped -- it should remain in
the running state.
2015-07-16 15:21:57 -07:00
Ray Strode
fd3f03580d gdm: unconditionally cancel auth user verifier on reset
We currently only cancel the user verifier on reset if
verifying, but that means we don't properly cancel it when
asking for a username at the Not Listed screen.

The object already handles getting called when there is
nothing to cancel, so just cancel it unconditionally.

https://bugzilla.gnome.org/show_bug.cgi?id=752438
2015-07-16 09:41:39 -04:00
Yosef Or Boczko
a09150846a Updated Hebrew translation 2015-07-16 13:29:05 +03:00
Piotr Drąg
f2a9c55637 Fix translator comment
https://bugzilla.gnome.org/show_bug.cgi?id=659969
2015-07-15 22:43:23 +02:00
Alexandre Franke
eaa3f83e46 Add translator comment
https://bugzilla.gnome.org/show_bug.cgi?id=659969
2015-07-15 12:37:37 +02:00
Daniel Mustieles
e786cc1454 Updated Spanish translation 2015-07-13 10:35:40 +02:00
Jakub Steiner
cd0c632fcb theme: make app icons less fuzzy
- force 16x16px
- re-render SASS brings in some changes from
  gnome-shell-sass

https://bugzilla.gnome.org/show_bug.cgi?id=747932
2015-07-08 18:09:46 +02:00
Matej Urbančič
d5f248cb82 Updated Slovenian translation 2015-07-08 15:47:02 +02:00
Fabio Tomat
6a800abe06 Updated Friulian translation 2015-07-06 13:13:04 +00:00
Jasper St. Pierre
fe265554a7 windowManager: Connect to size-changed signal
Whoops, forgot this one.
2015-07-05 23:10:51 -07:00
Jasper St. Pierre
7305466765 Adapt to new size-change API
We don't implement any maximize transitions (yet??), but we still have
the skeleton there. Let's keep it up to date.
2015-07-05 23:09:24 -07:00
Pedro Albuquerque
9ac55a98f1 Updated Portuguese translation 2015-07-04 05:40:46 +00:00
Florian Müllner
a1149fb6ad build: Bump GIO requirement
... for g_settings_schema_list_keys().

https://bugzilla.gnome.org/show_bug.cgi?id=751921
2015-07-03 22:42:37 +02:00
Florian Müllner
dfc4cc4aaf windowManager: Handle missing overrides settings
shell_global_get_overrides_settings() may return %NULL in case of
custom shell modes (i.e. not the default and classic ones); while
this is not officially encouraged, we should still handle it rather
than throw an error.

https://bugzilla.gnome.org/show_bug.cgi?id=751921
2015-07-03 22:25:29 +02:00
Benjamin Steinwender
ef7541291b Updated German translation 2015-07-03 17:25:53 +00:00
Florian Müllner
248a3e6b7e Bump version to 3.17.3
Update NEWS.
2015-07-02 14:07:14 +02:00
Adel Gadllah
6b1e381750 windowAttentionHandler: Fix whitespace 2015-07-01 19:14:13 +02:00
Adel Gadllah
feaf6108f9 windowAttentionHandler: Allow extensions to disconnect the signal
That way extensions can easily disable / remove the "is ready"
notification.

https://bugzilla.gnome.org/show_bug.cgi?id=748846
2015-07-01 19:04:21 +02:00
Pedro Albuquerque
9ad104585d Updated Portuguese translation 2015-06-29 22:26:47 +00:00
Cosimo Cecchi
7c44af3616 osdMonitorLabeler: avoid tweening the labels
The control center will call this method when the configuration dialog
for a display opens/closes, which will cause the same labels to quickly
fade out and in again, looking like it's flickering.

This commit fixes the issue by removing the tweens altogether.

https://bugzilla.gnome.org/show_bug.cgi?id=751599
2015-06-29 14:57:03 -07:00
Dušan Kazik
0599bf41b0 Updated Slovak translation 2015-06-29 10:41:59 +00:00
Florian Müllner
eac303f84c app-system: Improve StartupWMClass heuristics
Our StartUpWMClass heuristics use a StartupWMClass -> .desktop ID
mapping built from the list of all installed applications. In case
of multiple .desktop files setting the same StartupWMClass, we
currently simply pick the last one returned by g_app_info_get_all (),
which can be a bit surprising:
A window with WM_CLASS 'emacs', launched through a .desktop file
named 'emacs.desktop' with a StartupWMClass of 'emacs' maps to ...
'emacsclient.desktop'!
Make this case a bit less random by preferring the app info whose
ID matches the StartupWMClass.

https://bugzilla.gnome.org/show_bug.cgi?id=751541
2015-06-26 19:21:46 +02:00
Rui Matos
7bdd1c625c AllView: prevent accessing a NULL effect
In some cases we might be allocated a size such that
this._grid.topPadding and this._grid.bottomPadding are both 0 which
means that the ScrollView fade effect gets removed. In that case don't
try to access the effect since it will be NULL.

https://bugzilla.gnome.org/show_bug.cgi?id=750714
2015-06-26 18:09:17 +02:00
Ray Strode
0003760fd9 gdm: fix banner allocation computation
The code to figure how how much room that banner had was wrong.
This commit fixes it.

https://bugzilla.gnome.org/show_bug.cgi?id=751517
2015-06-25 16:04:14 -04:00
Victor Ibragimov
eafb8c8e38 Updated Tajik translation 2015-06-25 05:43:44 +00:00
Stas Solovey
60c8105559 Updated Russian translation 2015-06-23 21:29:03 +00:00
Balázs Úr
54626c6f7e Updated Hungarian translation 2015-06-23 11:13:06 +00:00
Ron Yorston
cca528a630 windowMenu: Reinstate left/right window movement
The menu items to move a window to the left/right workspaces were
removed when the window menu was implemented in GNOME Shell.  This
is OK for the default vertical layout but not for alternatives.

https://bugzilla.gnome.org/show_bug.cgi?id=751344
2015-06-22 17:57:01 -07:00
Florian Müllner
530193a3a2 windowManager: Replace deprecated g_settings_list_keys() 2015-06-19 14:05:32 +02:00
Florian Müllner
52e3149040 main: Replace deprecated g_settings_list_keys() 2015-06-19 14:05:32 +02:00
Florian Müllner
ad297ea9dc main: Fix a memory leak
We are pointlessly calling g_settings_list_keys() twice, without
freeing the result from the first call.
2015-06-19 14:05:32 +02:00
Wim Taymans
2015fc97dc shell-recorder-src: rework queue handling
Use our own locking and queue instead of async_queue.
Implement unlock and unlock_stop to make the create function return
FLUSHING. This is important to be able to pause the pipeline after some
error occured in the pipeline.
Implement start/stop to clear the queue and its state.
2015-06-16 09:03:30 +02:00
Michael Biebl
35889a0f7d Update configure.ac to check for libsystemd
https://bugzilla.gnome.org/show_bug.cgi?id=751016
2015-06-15 22:02:54 +02:00
Benjamin Steinwender
dcd84a4b53 Updated German translation 2015-06-13 18:07:18 +00:00
Florian Müllner
01374989b1 messageTray: Remove _fixMarkup() function
Commit 053e54f944 copied it to calendar, and since commit 15e42c4d5,
the original is no longer used.
2015-06-11 14:41:34 +02:00
Florian Müllner
f300462003 tests: Remove format test
The format() function was moved to gjs a long time ago.
2015-06-11 14:33:21 +02:00
Stas Solovey
1e4da1b99c Updated Russian translation 2015-06-09 23:10:55 +00:00
Muhammet Kara
e1de6cb98d Updated Turkish translation 2015-06-09 17:11:52 +00:00
Watson Yuuma Sato
59a18c4ead ShellKeyringPrompt: Strip out mnemonics indicators from labels
Currently GNOME Shell doesn't support mnemonics and prompters may
send labels with it.

Remove the mnemonics indicator for now.

Signed-off-by: Stef Walter <stefw@redhat.com>
 * Fixed style issue

https://bugzilla.gnome.org/show_bug.cgi?id=750465
2015-06-09 11:45:47 +02:00
Dimitris Spingos
b881e4b62a Updated Greek translation 2015-06-08 10:36:16 +03:00
Sebastian Rasmussen
7060ae077b Updated Swedish translation 2015-06-05 09:33:07 +00:00
Rui Matos
a7b0910566 Revert "Revert "keyboard: Handle touch events""
And make these only handled on wayland. There's a plethora of issues
around touch passive grab and touch/pointer doubly handling to use
these right away on X11, so we stick to single-touch/pointer there.

This reverts commit 032a688a72.

https://bugzilla.gnome.org/show_bug.cgi?id=750287
2015-06-02 17:57:55 +02:00
Florian Müllner
60706f72d4 Bump version to 3.17.2
Update NEWS.
2015-05-27 10:29:07 +02:00
Bastien Nocera
2e77f6b34b system: Use iio-sensor-proxy to detect accelerometer
Instead of using gnome-settings-daemon's D-Bus interface's presence.
iio-sensor-proxy now offers a D-Bus interface, which will exported
"HasAccelerometer = true" when an accelerometer is present.

https://bugzilla.gnome.org/show_bug.cgi?id=749671
2015-05-27 10:13:38 +02:00
Daniel Mustieles
50d5030949 Updated Spanish translation 2015-05-26 19:30:20 +02:00
Carlos Garnacho
03dbb0f931 windowManager: Redo WorkspaceSwitchAction to be a Clutter.SwipeAction
Just reuse this gesture rather than implementing edge detection ourselves.
As a plus, we might get touchpad swipe support when Clutter handles it.

https://bugzilla.gnome.org/show_bug.cgi?id=749742
2015-05-26 19:06:45 +02:00
Ting-Wei Lan
249619fabd build: Fix the path of perl for data-to-c.pl
https://bugzilla.gnome.org/show_bug.cgi?id=749490
2015-05-22 19:03:44 +08:00
Florian Müllner
60d1f7797c windowMenu: Close when corresponding window goes away
The menu is clearly associated with a particular window, so keeping
it around when the window is gone doesn't make sense - in case of
the window menu, it is actually harmful as every action will act on
the invalidated window and result in a crash. So just dismiss the
menu when the menu is unmanaged.

https://bugzilla.gnome.org/show_bug.cgi?id=749529
2015-05-21 18:20:39 +02:00
Florian Müllner
dc4b8c876e layout: Set initial visibility of fullscreen-tracking chrome
When chrome is added with the trackFullscreen parameter, the actor's
visibility will be updated automatically whenever its monitor's
fullscreen state changes. However as we currently ignore the fullscreen
state at the time the chrome is added, the initial visibility may well
be incorrect - fix this by updating the initial visibility as necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=749383
2015-05-21 13:58:49 +02:00
Matej Urbančič
1724723e63 Updated Slovenian translation 2015-05-17 20:44:06 +02:00
Bruno Ramalhete
02455b1e28 Updated Portuguese translation 2015-05-17 16:02:06 +00:00
Kjartan Maraas
47a9b97f8b Updated Norwegian bokmål translation. 2015-05-14 15:39:43 +02:00
Florian Müllner
0aa29daa72 messageTray: Emit signal when notifications are enabled/disabled
Since the introduction of per-source notification policy in commit
098bd4509b, the NotificationPolicy::enable-changed signal has been
used to track the 'enable' setting. However as we never actually
emitted that signal, this never worked without a restart - oops.

https://bugzilla.gnome.org/show_bug.cgi?id=749279
2015-05-14 15:14:52 +02:00
Rui Matos
182b1c1941 ScreenShield: only inhibit suspend if we're the active session
If we aren't the active session clutter can't animate and thus we
can't expect the shield to be shown before releasing the suspend
inhibitor so we should release it immediately when becoming inactive.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-14 15:11:19 +02:00
Rui Matos
bbc8010de3 ScreenShield: tie the suspend inhibitor to our isActive property
The whole point of holding a suspend inhibitor is to be able to lock
before suspending.

Currently, when resuming we immediately take the inhibitor without
checking that we're locked which means that we won't be able to
release this inhibitor if we don't unlock at least once.

To prevent that and to better match the inhibitor's intention in the
first place, we can tie the inhibitor with not being locked. In
practice, we also want to let the locking animation finish before
suspending, so we'll tie the inhibitor with not being active
instead.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-14 15:11:18 +02:00
Rui Matos
15baa56584 ScreenShield: ensure we don't leak logind inhibitors
This could happen if we are VT switched away and an animated
activation is requested because we're preparing to enter sleep. Since
we don't animate in this case we'd never reach
_completeLockScreenShown() before coming out of sleep, at which point
we _inhibitSuspend() again and would leak the previous inhibitor.

https://bugzilla.gnome.org/show_bug.cgi?id=749228
2015-05-14 15:11:16 +02:00
Dušan Kazik
a72683707f Updated Slovak translation 2015-05-13 08:52:58 +00:00
Jakub Steiner
f4baa4ddf8 make expanders more visible for alt-tab
https://bugzilla.gnome.org/show_bug.cgi?id=745058
2015-05-11 15:11:05 +02:00
Cédric Valmary
f9eb36434f Updated Occitan translation 2015-05-11 07:43:02 +00:00
Gábor Kelemen
bc5e16bcea Updated Hungarian translation 2015-05-09 12:34:39 +00:00
Florian Müllner
86e04048ff st: Remove StTable
Alas, the last use of StTable is not gone, so we can finally remove
our copy of the widget.

https://bugzilla.gnome.org/show_bug.cgi?id=703833
2015-05-05 16:37:41 +02:00
Victor Ibragimov
d7c0ff5e89 Updated Tajik translation 2015-05-05 04:52:05 +00:00
Felipe Braga
51e1efa277 Updated Brazilian Portuguese translation 2015-05-04 16:35:56 +00:00
sun
67f636cc68 update zh_CN translation 2015-05-03 10:10:11 +08:00
Yosef Or Boczko
fcdfebd0e7 Updated Hebrew translation 2015-05-01 11:37:15 +03:00
Florian Müllner
069ec3b910 Bump version to 3.17.1
Update NEWS.
2015-04-30 18:27:31 +02:00
Florian Müllner
1092f55b54 panel: Set up 'open-state-changed' handler on menu changes
Commit 08690d658f generalized the banner-blocking behavior of the
dateMenu to all menus that would obscure the banner. However setting
up the 'open-state-changed' handler only when an indicator is added
does not work for indicators that change their entire menu (like the
app menu) - we currently end up with menus with no connected signal
handler, and throw an error when trying to disconnect an invalid
signal ID.
To address this, add a new PanelButton::menu-set signal and use that
to set up the 'open-state-changed' handler.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-30 18:12:52 +02:00
Jasper St. Pierre
8a8abf12f9 layout: Track which barriers have been hit
For barriers like the hot corner which are made up of multiple axis
barriers, make sure that all the barriers have been left before
resetting the barrier.
2015-04-28 17:49:52 -07:00
laurent Soleil
f044e29526 Added Occitan translation 2015-04-28 13:20:04 +00:00
Rui Matos
4f703019ca shell-global: Mark the sync pointer motion event as synthetic
This allows mutter to ignore these events for the purpose of keeping
idle time.

https://bugzilla.gnome.org/show_bug.cgi?id=748541
2015-04-27 19:47:39 +02:00
Marek Černocký
0e6baec350 Updated Czech translation 2015-04-25 12:01:46 +02:00
Meet Parikh
08690d658f panel: Block banners when opening menus that would overlap
We currently block banners while the time+date menu is open, as it
would obscure the notification. However it is not necessarily the
only menu for which this is the case, so generalize the behavior
to all menus that would overlap banners when open.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-25 09:56:05 +02:00
Meet Parikh
674325e96c panel: Move notification banners below time+date dropdown
As notifications appear in the time+date dropdown's message list, there's
a strong relationship between notification banners and the menu. However
while the time+date menu is centered by default, which matches the banner
position, its actual position depends on the session mode - in particular
it is moved to the right in classic mode.
Reinforce the relationship in these cases by moving notification banners
underneath the time+date menu.

https://bugzilla.gnome.org/show_bug.cgi?id=745910
2015-04-25 09:56:05 +02:00
Sveinn í Felli
f8aa486ad1 Updated Icelandic translation 2015-04-24 13:40:37 +00:00
Mario Sanchez Prada
be78f0f36a misc: Add missing check on reply from systemd's CanSuspend D-Bus method
According to systemd logind's documentation, the CanSuspend() method
"returns 'na' in case "the operation is not available because hardware,
kernel or drivers do not support it", while "'no' is returned if the
operation is available but the user is not allowed to execute it".

See http://www.freedesktop.org/wiki/Software/systemd/logind

Thus, we need to return true here when the reply for the CanSuspend
method is neither 'no' nor 'na', or we would providing false positives
in cases where suspension is simply unsupported.

https://bugzilla.gnome.org/show_bug.cgi?id=748338
2015-04-22 23:17:45 +01:00
Florian Müllner
9917f05be8 messageTray: Make notification banners unfocusable
Unlike entries in the calendar's message list, banners are not subject
to the normal keynav chain, and making the banner actor itself unfocusable
allows for the focus to be moved to the action area when expanded.

https://bugzilla.gnome.org/show_bug.cgi?id=747205
2015-04-16 18:31:18 +02:00
Jakub Steiner
d23228522c HighContrast: provide more contrasty switches
https://bugzilla.gnome.org/show_bug.cgi?id=747912
2015-04-15 19:35:51 +02:00
Jakub Steiner
8c9896561e calendar: make day with events more prominent
https://bugzilla.gnome.org/show_bug.cgi?id=747715
2015-04-15 13:05:01 +02:00
Jakub Steiner
23cdb2125e theme: dark $selected_bg_color for toggle switches
https://bugzilla.gnome.org/show_bug.cgi?id=746294
2015-04-15 13:04:20 +02:00
acgtyrant
43fc598bd5 windowMenu: Add option to move different monitor
The window menu has all those workspace related options, but with multiple
monitors, it is much more interesting to quickly move a window 'over' to the
other monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=633994
2015-04-14 23:19:05 +02:00
Meet Parikh
2105d2f952 Add Display Settings to Background Menu.
https://bugzilla.gnome.org/show_bug.cgi?id=697346
2015-04-14 23:18:49 +02:00
Florian Müllner
d18ec919dd Bump version to 3.16.1
Update NEWS.
2015-04-14 23:10:16 +02:00
Florian Müllner
da3e5f9746 legacyTray: Decrease visible width when concealed
Now that the tray is shown temporarily when a tray icon appears,
we can decrease its visible width when concealed to interfere less
with window content without hurting discoverability.

https://bugzilla.gnome.org/show_bug.cgi?id=746787
2015-04-14 21:57:55 +02:00
Florian Müllner
594a227bc1 legacyTray: Temporarily reveal tray when icons are added
There is a balance to hit between discoverability and getting out
of the way, and the legacy tray currently fails in both regards.
To address the first issue, temporarily reveal the tray when a
new icon is added.

https://bugzilla.gnome.org/show_bug.cgi?id=746025
2015-04-14 21:57:54 +02:00
Florian Müllner
7277744dc0 calendar: Allow to dismiss resident notifications
Resident notifications are not really a thing anymore with the new
design, so all the user sees are some notifications that mysteriously
cannot be closed. That's utterly confusing, stop doing that.

https://bugzilla.gnome.org/show_bug.cgi?id=746860
2015-04-14 21:57:54 +02:00
Ting-Wei Lan
e4718d3f7f shell_global_reexec_self: add support for FreeBSD
https://bugzilla.gnome.org/show_bug.cgi?id=747788
2015-04-15 02:50:19 +08:00
Rui Matos
5afd04781c keyboard: Add a way to use the OSK on shell chrome in wayland sessions
libcaribou was designed to generate X events which works under wayland
sessions for X clients but obviously doesn't work for wayland clients
and for shell chrome.

This patch adds a simple caribou display adapter which inherits from
its X display adapter and allows us to continue to work for X clients
and at the same time makes the OSK work on shell text entries by
sending key events directly to the focused text actor.

Making the OSK work for wayland clients requires much bigger changes
at various levels in the stack and either not using libcaribou or
re-working it substantially so that's left for future work.

https://bugzilla.gnome.org/show_bug.cgi?id=747274
2015-04-14 19:34:13 +02:00
Florian Müllner
a0868bac6b telepathyClient: Keep source alive while channel is open
Sources are destroyed with their last notification. This is usually the
correct behavior, however in case of chat sources, the corresponding
telepathy channel might still be open, and any further messages that
should trigger a notification are lost because chat sources are only
created when telepathy's channel dispatcher notifies us about a channel
(via ObserveChannels).
Loosing messages like this is unexpected, so keep chat sources around
even without notifications while the channel is open.

https://bugzilla.gnome.org/show_bug.cgi?id=747636
2015-04-11 22:53:42 +02:00
Florian Müllner
265b1f0292 telepathyClient: Disentangle source and notification
Currently the lifetime of a chat source and its single notification
are tied together. While this apparently makes sense, it means we
will lose all follow-up notifications when a source is destroyed
with the corresponding telepathy channel left open. We will fix this
soon by tying the source to the channel's lifetime rather than the
notification, prepare for this by recreating the notification if
necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=747636
2015-04-11 22:53:35 +02:00
Florian Müllner
2c12f3a509 telepathyClient: Fix removal of timestamp timeout source
Timestamps were always handled by the notification rather than the source,
so that code never worked.
2015-04-10 16:10:02 +02:00
Florian Müllner
0141a2be9e messageTray: Remove dead code
The "clearable" concept is no longer relevant with the new design, not
to mention that resident sources are no longer a thing either ...
2015-04-10 14:59:24 +02:00
Shivam Mishra
6660342d2f authPrompt: Fix hang if user types password really fast
It's possible for a user to type their password so quickly
that GDM hasn't even had time to ask for the password yet,
much less have time to process the answer.
In that situation, we tuck the user response away as
_preemptiveAnswer, and pass it along to GDM when GDM is finally
ready for it.
The problem is, there's a bug in the code, where we send
null for the service name in the answer, instead of the right
service name (say "gdm-password").
This commit addresses the bug by making sure we don't pass the
answer along, until the service name is properly set in
_queryingService. To ensure that, answering query (answerQuery)
based on _preemptiveAnswer has been shifted right below
this._queryingService = serviceName;

https://bugzilla.gnome.org/show_bug.cgi?id=737586
2015-04-07 16:02:21 -04:00
Owen W. Taylor
92667e3b7f gtkactionmuxer.c: Pass the platform data when activating actions as well
The code from a6a2cea414 only passed a timestamp when changing an action
state, but the timestamp also to be passed when activating actions.

https://bugzilla.gnome.org/show_bug.cgi?id=747323
2015-04-07 10:44:55 -04:00
Owen W. Taylor
a0632e3e02 Unrevert gtkactionmuxer: Reintroduce the passing of event timestamps
Fix an accidental revert of a6a2cea414 - a patch that hacked
the cut-and-pasted code from GTK+ to pass timestamps when activating
remote actions.

https://bugzilla.gnome.org/show_bug.cgi?id=747323
2015-04-07 10:26:34 -04:00
Rūdolfs Mazurs
c6d2946ce6 Updated Latvian translation 2015-04-03 20:33:51 +03:00
Hannie Dumoleyn
86304418a9 Updated Dutch translation 3.16 2015-04-03 11:20:40 +02:00
Rui Matos
2f228e21da status/keyboard: Backup the whole MRU list while in password mode
Instead of saving only the current input source when entering password
mode, let's save the whole MRU list so that we can restore it when
returning to normal mode.

This is closer to user expectations since password mode is a transient
and short lived state.

https://bugzilla.gnome.org/show_bug.cgi?id=746605
2015-03-30 17:51:18 +02:00
Florian Müllner
8521556723 Update style 2015-03-30 17:40:21 +02:00
Stas Solovey
9f5ac0e6d5 Updated Russian translation 2015-03-29 18:12:15 +00:00
Stas Solovey
cc38dd1d49 Updated Russian translation 2015-03-29 18:00:56 +00:00
Yuri Myasoedov
66a5c0c094 Fixed Russian translation 2015-03-29 09:00:00 +03:00
Clément Guérin
8e802fd32f gdm: use integer coordinates for login dialog actors
If the login screen actors aren't placed at pixel
boundaries then they will show up blurred with fuzzy
text.

This commit ensures all actor allocations are floored
to integer coordinates.

https://bugzilla.gnome.org/show_bug.cgi?id=746912
2015-03-27 17:25:06 -04:00
Giovanni Campagna
e87656af16 WorkspacesView: remove unused GSettings
https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:12:25 -07:00
Giovanni Campagna
8327dbd611 System: update lock screen at construction
Will make sure that change notifications are enabled by reading
the value at least once

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:12:25 -07:00
Giovanni Campagna
e1b575dddc System: remove unused GSettings
https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:12:22 -07:00
Giovanni Campagna
018025dada dash: use global settings instead of own settings object
Makes it easier to reason about change notifications

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
49fe0335ee status/a11y: invert connection to changes and initial read
If there is no signal connected to changed, get_value() will
not subscribe to notifications and we might miss changes.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
bbe417121c Magnifier: invert connection to settings changes and initial read
If there is no signal connected to changed for a key, get_value()
will not subscribe to changes.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
0068098996 Background: add a comment for questionable GSettings usage
BackgroundSource relies on Background to watch its own settings.
Add a comment to explain that.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
36d9cc329d ExtensionPrefs: remove unused GSettings object
Each ExtensionRow has its own

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
1f2e53dd15 AppDisplay: use global settings object
We don't need a different GSettings object for each app or
favorite item.

While it practice it does not change much (AddMatch is still
obviously sent out), it minimally reduces the overhead on
changes, and makes for cleaner code.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
048a14f1f3 Search: use the same settings object for loading search providers
In recent glib, change notifications don't actually happen unless all
keys have been read, in an effort to reduce unnecessary dbus
traffic for shortlived GSettings object and avoid AddMatch calls.
But we care about changes here, so we need to make sure we're
subscribed, and an easy way to do so is to reuse the same object
to watch for changes and to load the active providers at startup.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
fd6ef482f0 Search: watch for changes to enabled as well
When introducing support for "default disabled" search providers
this part was overlooked, so enabling a default disabled provider
would be ignored until the next login.

https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:11:22 -07:00
Giovanni Campagna
d8926b96e2 Telepathy: hide chat notifications when focusing the app
When the chat app is focused, we should hide all banners immediately.
A good way to do so, without tracking which app is focused, is
to look for messages that are acked when the banner is unexpanded,
which implies they were acked by some other telepathy client.

https://bugzilla.gnome.org/show_bug.cgi?id=746364
2015-03-27 13:10:52 -07:00
Giovanni Campagna
934ec3c3fe TelepathyClient: fix ackowledging chat messages
ChatSource relies on the 'expanded' signal on the banner to
ack messages, but no code ever emits that.

https://bugzilla.gnome.org/show_bug.cgi?id=746364
2015-03-27 13:10:52 -07:00
Rui Matos
216e996f66 st-theme-node: Unconditionally apply style margins on the actor
We currently don't have any code either in gnome-shell or
gnome-shell-extensions setting margins directly with the Clutter API.

On the other hand, the current behavior doesn't allow us to remove a
style class with margins and have that be reflected, so removing this
special casing seems like the right thing to do at this point.

https://bugzilla.gnome.org/show_bug.cgi?id=746902
2015-03-27 18:06:13 +01:00
Dušan Kazik
a4b5583995 Updated Slovak translation 2015-03-27 15:47:12 +00:00
Adel Gadllah
b00a1d6b7f Revert "Revert "Give user 48ms to read each character of a PAM message, earlier it was 16ms""
I mean't to attach that to the bug not revert it.

This reverts commit 23a9fb0314.
2015-03-27 14:36:05 +01:00
Adel Gadllah
d24abab4a8 Revert "Revert "windowManager: Block dynamic workspace updates while showing the popup""
This was an accident.

This reverts commit 5e26d0c90c.
2015-03-27 14:34:28 +01:00
Adel Gadllah
23a9fb0314 Revert "Give user 48ms to read each character of a PAM message, earlier it was 16ms"
Seriously there has to be a better way to deal with this then slowing down
login for messages that hardly anyone cares about.

https://bugzilla.gnome.org/show_bug.cgi?id=720885

This reverts commit 8897385714.
2015-03-27 14:33:52 +01:00
Adel Gadllah
5e26d0c90c Revert "windowManager: Block dynamic workspace updates while showing the popup"
This reverts commit aeb971c33a.

https://bugzilla.gnome.org/show_bug.cgi?id=720885
2015-03-27 14:32:27 +01:00
Shivam Mishra
aeb971c33a windowManager: Block dynamic workspace updates while showing the popup
Pause dynamic workspace management while workspaceSwitcherPopup
is shown so as to eliminate infinite creation and destruction of
workspaces, thus preventing stuttering while trying to move a
window to last workspace.
Add _isWorkspacePrepended flag to make sure only a single workspace
is prepended at a time thus preventing the possibility of prepending
infinite workspaces while dynamic workspace management is on pause.
Prepend a new workspace by creating a new workspace instead of only
shifting the windows to next workspace so that the workspaceSwitcherPopup
may appear in sync with what's happening behind the scene and display
correct number of workspaces.

https://bugzilla.gnome.org/show_bug.cgi?id=712778
2015-03-27 14:13:27 +01:00
Sarvjeet
8897385714 Give user 48ms to read each character of a PAM message, earlier it was 16ms
User read time per character has been changed from 16ms to 48ms because the
message of information about last login is displayed for half a sec that is not
a good user experience. So time to read a character is increased to 48ms from 16ms.

https://bugzilla.gnome.org/show_bug.cgi?id=720885
2015-03-26 18:42:00 -05:00
Devyani Kota
e2a17fa8b4 workspacesView: Allow switching workspaces in overview with pageUp/Down
To switch workspace by keyboard in the overview, the user currently
has to use the normal keybinding. However as the vertical alignment
of workspaces makes them very similar to pages in the app picker, it
makes sense to also support the standard pageUp/pageDown keys.

https://bugzilla.gnome.org/show_bug.cgi?id=742581
2015-03-26 21:58:59 +01:00
Florian Müllner
14da6b68dc windowManager: Don't allow move-to-workspace for always-sticky windows
"Moving" a window to another workspace doesn't make sense when it cannot
be unstuck, and is potentially confusing if a new workspace is added at
the start/end - just don't do anything in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=746782
2015-03-26 12:19:33 +01:00
Florian Müllner
9a01a7ae07 workspacesView: Add missing semicolon 2015-03-26 00:05:38 +01:00
Rui Matos
c3bf4a325d Refresh all background instances after suspend if needed
NVIDIA drivers don't preserve FBO contents across suspend / resume
cycles which results in broken backgrounds. We can work around that by
forcing a refresh when coming out of suspend.

https://bugzilla.gnome.org/show_bug.cgi?id=739178
2015-03-24 11:45:04 +01:00
Khaled Hosny
2d71456944 Minor fixes the the file header 2015-03-23 21:31:27 +02:00
Florian Müllner
9934529a0b loginDialog: Move long session-list menus to the side
Currently the menu position below the button means that the menu
can extend to roughly half the screen height before ending up partly
off-screen. This is plenty of space for commonly installed sessions,
but some users have a significantly higher number of sessions in the
list. Move the menu to the side of the button in that case to maximize
the vertical space the menu may take up.

https://bugzilla.gnome.org/show_bug.cgi?id=734352
2015-03-23 20:25:21 +01:00
Florian Müllner
ef6e8f5bb2 legacyTray: Remove pointer barrier when the tray is hidden
https://bugzilla.gnome.org/show_bug.cgi?id=746579
2015-03-23 20:23:01 +01:00
Florian Müllner
2ce7a3baa6 legacyTray: Stack tray below modal dialogs
System modal dialogs should disable other UI while open, so make
sure the legacy tray does not appear on top of them.

https://bugzilla.gnome.org/show_bug.cgi?id=746323
2015-03-23 20:20:52 +01:00
Florian Müllner
c0d224e200 Bump version to 3.16.0
Update NEWS.
2015-03-23 19:45:34 +01:00
Jiro Matsuzawa
4b2e5a4375 l10n: Update Japanese translation 2015-03-23 02:48:15 +09:00
Bernd Homuth
fbecbca9a0 Updated German translation 2015-03-22 15:56:19 +00:00
Khaled Hosny
c312891774 Update Arabic translation 2015-03-22 15:56:46 +02:00
Muhammet Kara
486d4dfb68 Updated Turkish translation 2015-03-22 14:00:49 +00:00
Florian Müllner
169b00aa64 gtk-embed: Handle unmap/map of the embedded window
The current code assumes that an embedded window will correspond to
a single MetaWindow over the entire lifetime of the icon, which is
incorrect - the embedded window is unmanaged on Unmap and a new
MetaWindow will be created the next time the embedded window is
mapped. As we currently ignore the new MetaWindow completely, it
will be shown normally in the scene instead of the embedded clone
as intended.
Fix this by setting up clone and window actor each time the embedded
window is mapped rather than once in shell_gtk_embed_set_window().

https://bugzilla.gnome.org/show_bug.cgi?id=745824
2015-03-22 09:33:33 +01:00
Florian Müllner
f2c1a416bf legacyTray: Pass on keyboard events to the icon
There is currently no way to trigger an icon's right-click menu by
keyboard. While there's a good chance that the icon will ignore
<shift>F10 and similar shortcuts, passing on key events will at
least make it work for some icons ...

https://bugzilla.gnome.org/show_bug.cgi?id=746487
2015-03-22 09:33:33 +01:00
Florian Müllner
28ef88911c legacyTray: Try to set an accessible name for status icons
While legacy status icons lack a proper accessible name of their own,
we can try to find the corresponding application or the icon's window
title - hopefully most status icons provide at least one, so they
don't show up completely "blank" in screen readers.

https://bugzilla.gnome.org/show_bug.cgi?id=746487
2015-03-22 09:33:33 +01:00
Inaki Larranaga Murgoitio
e2161f385d Updated Basque language 2015-03-21 12:19:10 +01:00
Florian Müllner
f0c0687b43 gtk-embed: Fix typo in comment 2015-03-20 02:32:01 +01:00
Kjartan Maraas
e76e874093 Updated Norwegian bokmål translation. 2015-03-19 20:57:03 +01:00
Jordi Mas
d2a0cfb6d4 Update Catalan translation 2015-03-19 01:21:11 -04:00
Ray Strode
e5270cb6ec Revert "loginDialog: Don't arbitrarily pick a random session for the user"
This reverts commit 6d40cb98e7.

https://bugzilla.gnome.org/show_bug.cgi?id=740142
2015-03-18 12:44:37 -04:00
Ray Strode
ee360d8749 Revert "loginDialog: Better handle setting the active session"
This reverts commit 681861c8c7.

https://bugzilla.gnome.org/show_bug.cgi?id=740142
2015-03-18 12:44:37 -04:00
Andika Triwidada
bb4e6fd2da Updated Indonesian translation 2015-03-18 15:29:28 +00:00
Fran Dieguez
651600ac19 Updated Galician translations 2015-03-18 00:44:46 +01:00
Sebastian Rasmussen
67f4cf3cff Updated Swedish translation 2015-03-17 21:33:26 +00:00
Daniel Martinez
9b76e9f90a Update Aragonese translation 2015-03-17 19:50:34 +01:00
Florian Müllner
ba919b9c6a Bump version to 3.15.92
Update NEWS.
2015-03-17 19:05:09 +01:00
Rui Matos
4da2862f8f status/keyboard: Add a system settings concept to be used under GDM
g-s-d has been taking care of this for us but in a very hackish way
that causes dconf writes on every startup and also doesn't handle
dynamic updates to locale1's properties which has become a problem now
that GDM keeps its greeter session running in parallel with users'.

To take care of this properly, this commit introduces a settings
abstraction with both system and session implementations. The session
implementation just wraps access to the existing gsettings while the
system one gets its values from org.freedesktop.locale1's properties.

https://bugzilla.gnome.org/show_bug.cgi?id=746288
2015-03-17 18:13:02 +01:00
Ray Strode
b1de1ada25 gdm: fix empty user list on user switching
There's some vestigial code for hiding the user list
that runs at the same time its parent is hidden.

Only the parent should be hidden, at this point, so
there's situations where the user list hides and
never comes back.

This commit fixes that, by deleting the vestigial code.

https://bugzilla.gnome.org/show_bug.cgi?id=719418
2015-03-17 12:22:06 -04:00
Florian Müllner
1002bbc212 calendar: Fix body alignment for RTL locales
Since commit 75745fc23f, the bodyStack itself is no longer start-aligned
to not break custom body actors like chat notifications. However we still
want "normal" body actors start-aligned to get the correct RTL behavior.
2015-03-17 16:46:08 +01:00
Florian Müllner
15e42c4d5f messageTray: Stop including an actor with Notifications
We now stopped using notification actors directly for anything, so
we can simplify the Notification class significantly by turning it
into a purely informational object others can use to built their UI
representation from.

https://bugzilla.gnome.org/show_bug.cgi?id=746343
2015-03-17 16:07:17 +01:00
Florian Müllner
bb61dd4b44 telepathyClient: Provide a custom banner implementation
Since we stopped special-casing chat notifications to use the old
notification actor, we need to provide a notification banner to
maintain the inline chat functionality, so split out the UI from
the existing ChatNotification class.

https://bugzilla.gnome.org/show_bug.cgi?id=746343
2015-03-17 16:06:52 +01:00
Florian Müllner
2d4ba30ba2 messageTray: Always destroy banners when done displaying
Special-casing banners of resident notifications was really a
thinly veiled special case for chat notifications, as those were
still using the old notification actor which coupled the life-time
of the notification to its actor. This is no longer the case, so
we can do the sane thing and destroy banners once they are no
longer needed.

https://bugzilla.gnome.org/show_bug.cgi?id=746343
2015-03-17 15:48:37 +01:00
Florian Müllner
54f46e8486 Revert "messageTray: Special-case chat notifications to use the old actor"
This was really just a temporary hack to buy us more time to properly port
chat notifications to the new banners ...

This reverts commit cd5318baa7.

https://bugzilla.gnome.org/show_bug.cgi?id=746343
2015-03-17 15:48:37 +01:00
Florian Müllner
0ee762263a telepathyClient: Don't remove body on updates
Passing null as body always meant clearing the existing one. While this
mattered less with the old message tray which used the expanded actor,
the new message list in the calendar uses the unexpanded body. We clearly
don't want that to disappear on icon changes, so pass the existing one.

https://bugzilla.gnome.org/show_bug.cgi?id=746343
2015-03-17 15:48:37 +01:00
Florian Müllner
826682cc07 theme: Style .selected menu items instead of :focus/:hover
The .selected style class indicates the "active" menu item, which
is generally the last hovered or focused one (whichever happened
last). Styling that instead of :focus and :hover directly guarantees
that only a single item will be selected at a time, which removes
ambiguity and matches the behavior of GTK+ menus.

https://bugzilla.gnome.org/show_bug.cgi?id=745246
2015-03-17 15:47:27 +01:00
Florian Müllner
8b6e566728 popupMenu: Use .selected class for active item
Currently it uses .active, which matches the code more closely, but
is confusingly close to :active; so .selected it is ...

https://bugzilla.gnome.org/show_bug.cgi?id=745246
2015-03-17 15:43:49 +01:00
Chao-Hsiung Liao
e4a20e51e2 Updated Chinese (Taiwan) translation 2015-03-17 12:39:36 +00:00
Yosef Or Boczko
173ff91640 Updated Hebrew translation 2015-03-17 11:11:53 +02:00
Milo Casagrande
438d0d4feb Updated Italian translation 2015-03-17 08:08:20 +00:00
Florian Müllner
8f275a79a9 Update style
Subscription messages were removed in 38a2f26e44.
2015-03-17 06:04:52 +01:00
Florian Müllner
a504dd866b calendar: Minor cleanup
Commit b61cb92053 added a close method, use that instead of
explicitly emitting the corresponding signal.
2015-03-17 05:34:14 +01:00
Florian Müllner
dfc51ef243 messageTray: Minor cleanup
Chain up to the parent instead of setting up a second signal connection.
2015-03-17 05:34:14 +01:00
Florian Müllner
a25d2dc256 telepathyClient: Remove some more dead code 2015-03-17 04:14:44 +01:00
Florian Müllner
b2ae945cf2 telepathyClient: Remove some dead code
This has been unused ever since we stopped logging presence changes in
commit 4448b65a18 ...
2015-03-17 03:29:42 +01:00
Jasper St. Pierre
681861c8c7 loginDialog: Better handle setting the active session
We currently use the setActiveSession method to both mark a menu item as
selected, and also tell gdm about the current session the user selected.

Since gdm is ultimately in charge of the state, we should decouple this
and simply ask gdm to set the session, and have the menu item reflect
what gdm thinks is the current session.

This prevents state getting mismatched and oscillations from happening,
where we get in a loop of constantly telling gdm what the session is.

https://bugzilla.gnome.org/show_bug.cgi?id=740142
2015-03-16 17:47:27 -04:00
Jasper St. Pierre
6d40cb98e7 loginDialog: Don't arbitrarily pick a random session for the user
gdm should be in charge of telling us the default session, and it
should pick one for the user if she doesn't already have one.

https://bugzilla.gnome.org/show_bug.cgi?id=740142
2015-03-16 17:47:27 -04:00
Stas Solovey
81d7ab1e49 Updated Russian translation 2015-03-16 19:29:02 +00:00
Daniel Mustieles
2212b4ea71 Updated Spanish translation 2015-03-16 19:02:54 +01:00
Ray Strode
5650355da5 gdm: fix handling of removed smartcard at startup
If a smartcard is missing from the reader when we start up,
and the system is configured to disable password authentication,
then we need to ask the user to insert their smartcard.

This commit fixes that.

https://bugzilla.gnome.org/show_bug.cgi?id=740143
2015-03-16 13:45:50 -04:00
Alexander Shopov
20a9206919 Updated Bulgarian translation 2015-03-16 18:36:03 +02:00
Stas Solovey
3533b2a8bc Updated Russian translation 2015-03-15 22:41:39 +00:00
Alexandre Franke
b8d2238ff0 Updated French translation 2015-03-15 22:09:29 +00:00
Florian Müllner
96c8870820 viewSelector: Mirror open-app-view edge drag gesture for RTL
It makes sense for the gesture to reflect the position of the
activities button / dash. In RTL locales, those are located on
the right rather than the left, so make the gesture apply to
the opposite edge in that case.

https://bugzilla.gnome.org/show_bug.cgi?id=737502
2015-03-15 19:41:44 +01:00
Tom Tryfonidis
177e9316b0 Updated Greek translation 2015-03-15 18:09:29 +00:00
Ask Hjorth Larsen
27b7e6ef4b Updated Danish translation 2015-03-15 16:59:57 +01:00
Matej Urbančič
32d686d90f Updated Slovenian translation 2015-03-15 10:26:15 +01:00
Cosimo Cecchi
f812e9be7d ShellApp: use st_icon_set_fallback_icon_name() to specify app fallback
We can now safely pass a NULL GIcon to st_icon_set_gicon(), and specify
a more generic fallback using the new API we just introduced.

https://bugzilla.gnome.org/show_bug.cgi?id=746219
2015-03-14 17:31:07 -07:00
Cosimo Cecchi
c7185d597b StIcon: add a fallback-icon-name property
This can be used when the lookup for the specified icon fails, in case
the client doesn't want an empty texture.

https://bugzilla.gnome.org/show_bug.cgi?id=746219
2015-03-14 17:31:07 -07:00
Clément Guérin
6380526c12 screenshot: fix off-by-one selection size
Selecting the whole screen made a (scr_w-1,scr_h-1) sized screenshot.

https://bugzilla.gnome.org/show_bug.cgi?id=746223
2015-03-14 16:04:23 -07:00
Clément Guérin
fa4f6c4561 screenshot: use integer coordinates
This fixes the shivery selection rectangle when making a region
screenshot.

https://bugzilla.gnome.org/show_bug.cgi?id=746223
2015-03-14 16:04:23 -07:00
Cosimo Cecchi
a5b7eaec1a legacyTray: add a pointer barrier to activate the tray
Allows easier access to the tray by just pushing the cursor against the
edge.

https://bugzilla.gnome.org/show_bug.cgi?id=746026
2015-03-14 14:26:29 -07:00
Balázs Úr
d165295c83 Updated Hungarian translation 2015-03-14 19:55:14 +00:00
Aurimas Černius
5f5874f8ca Updated Lithuanian translation 2015-03-14 21:01:26 +02:00
Daniel Korostil
ab5e950cd0 Updated Ukrainian translation 2015-03-14 12:09:45 +02:00
Victor Ibragimov
3e760f5ca6 Updated Tajik translation 2015-03-14 04:51:54 +00:00
A S Alam
9e8a24467e Translation pa updated for Gnome 2015-03-13 21:37:10 -05:00
Trần Ngọc Quân
d84d1f79a0 Updated Vietnamese translation
Signed-off-by: Trần Ngọc Quân <vnwildman@gmail.com>
2015-03-14 07:53:45 +07:00
Changwoo Ryu
024ec36cc0 Updated Korean translation 2015-03-14 09:40:05 +09:00
Marek Černocký
51b1258866 Updated Czech translation 2015-03-14 00:04:01 +01:00
Carlos Garnacho
ff1b76f4c7 keyboard: Listen to MetaBackend::last-device-changed for OSK changes
Instead of listening to a dbus property exported by g-s-d, listen to the
MetaBackend signal telling the last interacted device, and make sure we
only show the keyboard for touchscreens.

https://bugzilla.gnome.org/show_bug.cgi?id=745977
2015-03-13 21:08:51 +01:00
Enrico Nicoletto
0389ae5299 Updated Brazilian Portuguese translation 2015-03-13 19:33:05 +00:00
Piotr Drąg
35ab60b712 Updated Polish translation 2015-03-13 19:05:31 +01:00
Dušan Kazik
0ea15f70c3 Updated Slovak translation 2015-03-13 16:46:21 +00:00
Baurzhan Muftakhidinov
f1c7a36dde Updated Kazakh translation 2015-03-13 16:35:25 +00:00
Florian Müllner
cc9093f118 legacyTray: Minor style update
- move whitespace into buttons for Fitts'ability
 - add focus/hover highlights

https://bugzilla.gnome.org/show_bug.cgi?id=746022
2015-03-13 17:15:29 +01:00
Florian Müllner
775a2ea051 legacyTray: Add to ctrl-alt-tab
While legacy status icons are notoriously bad with regard to
accessibility (well, among many other things), we should still
make them available via ctrl-alt-tab ...

https://bugzilla.gnome.org/show_bug.cgi?id=746022
2015-03-13 17:12:10 +01:00
Florian Müllner
cb3d5c2b51 Use dedicated icons for top bar/windows in ctrl-alt-tab
The previously used ones were quite a stretch, so now that we got
dedicated ones, let's use them.
2015-03-13 17:12:10 +01:00
Samir Ribic
dc1c31d704 Added Bosnian translation 2015-03-13 15:47:39 +00:00
Florian Müllner
777616d8b0 calendar: Permanently hide dismissed events
Currently dismissed events will simply reappear when browsing
back and forth between dates, which is clearly broken. Instead,
hide events that have been dismissed permanently. For now, we
simply store a list of ignored IDs ourselves, until we get API
in evolution-data-server to reliably store custom per-event
properties.

https://bugzilla.gnome.org/show_bug.cgi?id=744927
2015-03-13 15:53:41 +01:00
Florian Müllner
8aeebbbf78 calendar-server: Give each event an unambiguous ID
Each event returned by GetEvents includes the (currently unused)
UID, which is not always enough to unambiguously identify an event
(different calendar sources, recurring events, ...).
As we will start using the property to record events that have been
dismissed and should be persistently hidden from the calendar, change
it to a truly unique ID.

https://bugzilla.gnome.org/show_bug.cgi?id=744927
2015-03-13 15:53:41 +01:00
Trần Ngọc Quân
dade67ba5a Updated Vietnamese translation
Signed-off-by: Trần Ngọc Quân <vnwildman@gmail.com>
2015-03-13 07:49:42 +07:00
Piotr Drąg
921a9071a1 NetworkAgent: use existing strings to avoid breaking the string freeze 2015-03-12 22:23:57 +01:00
Giovanni Campagna
90a08ba0b6 NetworkAgent: differentiate between user-initiated actions and automatic connections
If the action was initiated by the user, we want to show the
modal dialog immediately, while if the action was initiated by
NM autoconnection policy we first show a notification and then
show the dialog when needed.

https://bugzilla.gnome.org/show_bug.cgi?id=660293
2015-03-12 13:33:38 -07:00
Rui Matos
4e52ed9df7 status/keyboard: When per-window, choose the first IS for new windows
This was libgnomekbd's behavior and seems to be prefered by users.

https://bugzilla.gnome.org/show_bug.cgi?id=746037
2015-03-12 17:55:47 +01:00
Florian Müllner
01b51cd081 calendar: Only allow closing events on the current day
The design calls for differentiating between dismissable reminders
and permanent events, based on whether the selected date is "today"
or some other day.

https://bugzilla.gnome.org/show_bug.cgi?id=744927
2015-03-12 17:10:11 +01:00
Florian Müllner
d1efc274e5 calendar: Factor out a proper EventMessage class
While messages in the EventsSection are currently simple enough to
use the generic Message baseclass, the design calls for events to
only be dismissable on the current day. We will need a subclass to
implement this behavior cleanly, so add one.

https://bugzilla.gnome.org/show_bug.cgi?id=744927
2015-03-12 17:10:11 +01:00
Florian Müllner
d48d787c1e calendar: Minor cleanup
As the design calls for slightly different behavior for the current
day, move the _isToday() function out of MessageListSection to have
it available elsewhere as well ...

https://bugzilla.gnome.org/show_bug.cgi?id=744927
2015-03-12 17:10:11 +01:00
Florian Müllner
e4ad31a5dd calendar: Close messages on clear
Currently the clear action in the section header simply removes all
messages from the section. While the result looks exactly as if the
close button of each individual message had been clicked, the messages
are not actually closed - after a restart (or some other condition that
triggers a reload), the messages simply reappear, which is confusing.
Do the expected thing instead, and make clear close all messages in the
section.

https://bugzilla.gnome.org/show_bug.cgi?id=746027
2015-03-12 17:10:11 +01:00
Florian Müllner
b61cb92053 calendar: Add public close() method
Currently a message can only be closed by its close button. However
as we want to make a section's clear action synonymous with clicking
the close button of each individual message in the list, we will need
to expose the close action, so add a corresponding method.

https://bugzilla.gnome.org/show_bug.cgi?id=746027
2015-03-12 17:10:11 +01:00
Florian Müllner
e72450f5d8 calendar: Only show close button on messages that can be cleared
Currently closing all messages is subtly different from clearing
a section, which is confusing. Start making the behavior more
predictable by only showing a close button in the message when
the section's clear button would remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=746027
2015-03-12 17:10:11 +01:00
Jakub Steiner
d9211b8e20 theme: update sass submodule 2015-03-12 16:15:52 +01:00
Stas Solovey
c16b83fc3e Updated Russian translation 2015-03-11 21:33:55 +00:00
Giovanni Campagna
8b5a44e119 Search: be resilient against buggy search providers
If a search provider returns a meta without a name, don't crash
constructing the actor.

https://bugzilla.gnome.org/show_bug.cgi?id=745861
2015-03-11 13:47:48 -07:00
Giovanni Campagna
b0be6b8678 RemoteSearch: don't complete a search that was cancelled
This closes a race between setTerms and a slow GetInitialResultSet.
The bug manifests as follows:
- initial search for a short string
- previous results === undefined, call GetInitialResultSet
- user types more, cancel previous search in setTerms()
- mainloop, then _gotResults([])
- previous results === [], !!previous results === true
- therefore call GetSubsearchResultSet with an empty list of results
- _gotResults() from GetSubsearchResultSet is empty
- much later, return from GetInitialResultSet is discarded by
  cancellable
- user unhappy because what he searched for is not there

After this fix, the flow is:
- initial search for a short string
- previous results === undefined, call GetInitialResultSet
- user types more, cancel previous search in setTerms()
- mainloop, but no _gotResults
- previous results === undefined, call GetInitialResultSet again with
  longer string
- some time later, return from first GetInitialResultSet is discarded
  by cancellable
- soon after, return from second GetInitialResultSet comes with good
  results
- user happy

https://bugzilla.gnome.org/show_bug.cgi?id=745861
2015-03-11 13:47:48 -07:00
Florian Müllner
bb73547acf calendar: Sync pointer after a message is removed
If a different message ends up underneath the pointer at the end
of the removal animation, it won't receive an enter event until
the pointer is moved, and thus its hover state will not be correct.
Fix it up manually with an explicit pointer sync.

https://bugzilla.gnome.org/show_bug.cgi?id=746019
2015-03-11 21:15:53 +01:00
Alexander Shopov
d8fc58e174 Updated Bulgarian translation 2015-03-11 20:55:38 +02:00
Jiri Grönroos
b9fdffbb62 Finnish translation update 2015-03-11 17:01:29 +02:00
Frédéric Péters
e48a83fcfc po: remove leading space from French date translation 2015-03-11 10:31:06 +01:00
Florian Müllner
4c7eae7ef2 calendar: Also update expanded body if necessary
As we use two separate body actors for expanded and unexpanded
notifications, updating only one of them on notification updates
is not enough - if the notification has already been expanded,
we need to update the second label as well.
2015-03-11 01:47:49 +01:00
Florian Müllner
75745fc23f calendar: Do not left-align bodyStack
It's its contents that should be aligned, the stack itself should
fill the available width.
2015-03-11 01:23:02 +01:00
Florian Müllner
82479db084 telepathyClient: Close overview and panel when activated
There's a strong expectation that delegating or presenting a channel
will result in a window being activated, so close both overview and
calendar as we do elsewhere.
2015-03-11 01:17:57 +01:00
Florian Müllner
9becb3985d calendar: Guard against null passed to setBody() 2015-03-10 23:57:04 +01:00
Muhammet Kara
4cb7df67b7 Updated Turkish translation 2015-03-10 22:54:53 +00:00
Bernd Homuth
e0a12f55b9 Updated German translation 2015-03-10 22:54:18 +00:00
Florian Müllner
b18240370d calendar: Filter out newlines when unexpanded
Enabling line-wrapping of the unexpanded body is not enough to enforce
a single line when the text has embedded newlines, so replace these with
spaces (this is similar to setting ClutterText:single-line-mode, however
that would use a paragraph separator glyph instead).
2015-03-10 23:44:35 +01:00
Florian Müllner
4253df6463 main: Close calendar on activateWindow()
If activateWindow() is called as the result of activating an item
in the Time & Date drop-down (most likely a notification), it should
behave as other items and close the calendar.
2015-03-10 22:41:52 +01:00
Jordi Mas
d8b43865a2 Update Catalan translation 2015-03-10 17:24:55 -04:00
Florian Müllner
3eb8b9ef68 calendar: Fix thinko
Without an explicit index, messages should be added at the end of
the list.

https://bugzilla.gnome.org/show_bug.cgi?id=745988
2015-03-10 21:10:14 +01:00
Jakub Steiner
f96077bd0f theme: consistent focus & hover for system menu & popup menu
- while I'd prefer to use the selected_bg_color for menus,
  we need to be somewhat consistent with the choice

https://bugzilla.gnome.org/show_bug.cgi?id=745246
2015-03-10 21:05:21 +01:00
Jakub Steiner
741846d1ff theme: render css & update submodule 2015-03-10 20:38:05 +01:00
Florian Müllner
f36d7bd078 Update submodule 2015-03-10 19:50:44 +01:00
Ray Strode
bd51c92d65 Update submodule 2015-03-10 14:48:51 -04:00
Jakub Steiner
2aed6ade79 theme: modal dialog headlines
https://bugzilla.gnome.org/show_bug.cgi?id=745687
2015-03-10 19:16:28 +01:00
Jakub Steiner
83e5ea4827 Revert "theme: use a global headline class"
This reverts commit 5915348396.
2015-03-10 18:27:43 +01:00
Jakub Steiner
5915348396 theme: use a global headline class
https://bugzilla.gnome.org/show_bug.cgi?id=745687
2015-03-10 17:45:04 +01:00
Jakub Steiner
567dc70c9b theme: top bar in classic needs some tweaks
https://bugzilla.gnome.org/show_bug.cgi?id=745686
2015-03-10 12:24:53 +01:00
Claude Paroz
8323891294 Fixed date format error in French translation
Fixes bug #745916. Thanks Arnaud Bonatti for the report.
2015-03-10 08:29:02 +01:00
Victor Ibragimov
5bf8695295 Updated Tajik translation 2015-03-10 06:20:13 +00:00
Jakub Steiner
7012437929 theme: modal dialog heading visible for classic
https://bugzilla.gnome.org/show_bug.cgi?id=745687
2015-03-09 19:37:09 +01:00
Kjartan Maraas
83ad98d640 Updated Norwegian bokmål translation from Åka Sikrom. 2015-03-09 19:29:47 +01:00
Daniel Mustieles
1816f763d2 Updated Spanish translation 2015-03-08 21:26:27 +01:00
Matej Urbančič
1a01f07b2c Updated Slovenian translation 2015-03-08 21:24:15 +01:00
Aurimas Černius
23d48fb334 Updated Lithuanian translation 2015-03-08 19:21:20 +02:00
Ross Lagerwall
dada0420b1 mount-operation: Handle multi-line questions
Don't discard multiple lines when updating the message label.

https://bugzilla.gnome.org/show_bug.cgi?id=745713
2015-03-08 11:31:44 +00:00
Daniel Korostil
17a336c795 Updated Ukrainian translation 2015-03-08 12:58:25 +02:00
IWAI, Masaharu
8c347965d7 l10n: Update Japanese translation 2015-03-07 22:35:15 +09:00
Florian Müllner
e1816cd228 popupMenu: Center separators vertically 2015-03-06 19:01:46 +01:00
Florian Müllner
3614da6845 messageTray: Fix custom notification icons
NotificationMessages set the icon either from the corresponding
notification's gicon property, or fall back to the source icon.
Except that we never actually set a notification's gicon property to
the provided icon, so we currently just always fall back, whoops!
2015-03-06 18:28:19 +01:00
Florian Müllner
8aa1765f24 windowManager: Allow toggle-message-tray action in overview
The corresponding action mode was dropped accidentally in commit 08d2e61
when changing the shortcut to open the calendar drop-down instead.
2015-03-06 18:07:19 +01:00
Florian Müllner
8eb0782f25 loginDialog: Pass-through UserWidget's label-actor
https://bugzilla.gnome.org/show_bug.cgi?id=729603
2015-03-06 17:24:13 +01:00
Adel Gadllah
5f6aba7f4b legacyTray: Allow extensions to hijack the tray-icon-added/removed signals 2015-03-06 13:47:47 +01:00
Balázs Úr
986b14fb1b Updated Hungarian translation 2015-03-05 23:11:38 +00:00
Мирослав Николић
7c03b88b74 Updated Serbian translation 2015-03-05 22:41:50 +01:00
Florian Müllner
1f277ebcb9 theme: Update style 2015-03-05 17:12:34 +01:00
Baurzhan Muftakhidinov
8c54bc68e0 Updated Kazakh translation 2015-03-05 15:50:42 +00:00
Florian Müllner
6e39be5b19 popupMenu: Remove unused import 2015-03-05 13:49:28 +01:00
Florian Müllner
cf71ea016f theme: Update sass submodule ...
... to point to the correct source from commit 8536f9312c.
2015-03-05 13:49:28 +01:00
Florian Müllner
4affa5528a dash: Fix show-apps button drop target
Fallout from commit e69cc20fc7 ...

https://bugzilla.gnome.org/show_bug.cgi?id=745666
2015-03-05 12:34:17 +01:00
Jakub Steiner
8536f9312c theme: no selected color for hover in popovers
treat shell popups as gtk popovers, not menus
2015-03-05 12:12:38 +01:00
Jakub Steiner
a0e8456cb5 Revert "theme: have a separate state for hover and focus"
As per discussion in bug #745246 this reverts
commit 8a732d3c13.
2015-03-05 12:02:06 +01:00
Milo Casagrande
77074b5646 Updated Italian translation 2015-03-05 08:01:17 +00:00
Changwoo Ryu
cd68ed8297 Updated Korean translation 2015-03-05 11:09:34 +09:00
Piotr Drąg
eaef067b3e Updated Polish translation 2015-03-04 23:14:08 +01:00
147 changed files with 27948 additions and 27176 deletions

151
NEWS
View File

@@ -1,3 +1,154 @@
3.17.4
======
* Fix fuzziness of app menu icon [Jakub; #747932]
* Implement 4 finger swipe gesture for touchpads [Carlos; #752250]
* Misc. bug fixes [Florian, Alexandre, Piotr, Ray, Mario; #751921, #659969,
#752438, #752675]
Contributors:
Piotr Drąg, Alexandre Franke, Carlos Garnacho, Florian Müllner,
Mario Sanchez Prada, Jakub Steiner, Jasper St. Pierre, Ray Strode
Translations:
Benjamin Steinwender [de], Pedro Albuquerque [pt], Fabio Tomat [fur],
Matej Urbančič [sl], Daniel Mustieles [es], Yosef Or Boczko [he],
Daniel Martinez [an]
3.17.3
======
* Handle touch events in OSK on wayland [Rui; #750287]
* Reinstate left/right movement to window menu [Ron; #751344]
* Allow extensions to disable "Window is ready" notification [Adel; #748846]
* Misc. bug fixes [Watson, Michael, Ray, Rui, Florian, Cosimo; #750465,
#751016, #751517, #750714, #751541, #751599]
Contributors:
Michael Biebl, Cosimo Cecchi, Adel Gadllah, Rui Matos, Florian Müllner,
Ray Strode, Wim Taymans, Ron Yorston, Watson Yuuma Sato
Translations:
Sebastian Rasmussen [sv], Dimitris Spingos [el], Muhammet Kara [tr],
Stas Solovey [ru], Benjamin Steinwender [de], Balázs Úr [hu],
Victor Ibragimov [tg], Dušan Kazik [sk], Pedro Albuquerque [pt]
3.17.2
======
* Remove StTable widget [Florian; #703833]
* Increase visibility of expanders in alt-tab popup [Jakub; #745058]
* Ensure suspend inhibitors are released when VT switched away [Rui; #749228]
* Use iio-sensor-proxy directly for orientation lock [Bastien; #749671]
* Misc. bug fixes [Florian, Lan, Carlos; #749279, #749383, #749529, #749490,
#749742]
Contributors:
Carlos Garnacho, Ting-Wei Lan, Rui Matos, Florian Müllner, Bastien Nocera,
Jakub Steiner
Translations:
Yosef Or Boczko [he], sun [zh_CN], Felipe Braga [pt_BR],
Victor Ibragimov [tg], Gábor Kelemen [hu], Cédric Valmary [oc],
Dušan Kazik [sk], Kjartan Maraas [nb], Bruno Ramalhete [pt],
Matej Urbančič [sl], Daniel Mustieles [es]
3.17.1
======
* Add Display Settings entry to background menu [Meet; #697346]
* Add window menu option to move to different monitor [Isaac; #633994]
* Improve switch style in default/highContrast themes [Jakub; #746294, #747912]
* Make event highlight in calendar more prominent [Jakub; #747715]
* Fix keyboard focus when focusing a notification banner [Florian; #747205]
* Move notification banners below the dateMenu [Meet, Florian; #745910]
* Misc. bug fixes [Mario, Rui; #748338, #748541]
Contributors:
Isaac Ge, Rui Matos, Florian Müllner, Meet Parikh, Mario Sanchez Prada,
Jakub Steiner, Jasper St. Pierre
Translations:
Sveinn í Felli [is], Marek Černocký [cs], laurent Soleil [oc]
3.16.1
======
* gdm: Move long session chooser menus to the side [Florian; #734352]
* Work around background corruption with NVIDIA driver [Rui; #739178]
* Don't allow move-to-workspace for always-sticky windows [Florian; #746782]
* Allow switching workspaces with PgUp/PgDown in overview [Devyani; #742581]
* Bump time PAM messages are displayed [Sarvjeet; #720885]
* Fix "stutter" when moving window past the last workspace [Shivam; #712778]
* Fix blurred text on login screen [Clément; #746912]
* keyboard: Restore whole MRU list after password mode [Rui; #746605]
* Pass event timestamps when activating remote actions [Owen; #747323]
* Fix hung login screen when password is typed too quickly [Shivam; #737586]
* Make on-screen keyboard work for shell chrome on wayland [Rui; #747274]
* Implement reexec_self() for FreeBSD [Ting-Wei; #747788]
* Allow to dismiss resident notifications [Florian; #746860]
* Temporarily reveal legacy tray when icons are added [Florian; #746025]
* Make concealed tray smaller to minimize overlap with apps [Florian; #746787]
* Misc. bug fixes [Florian, Rui, Giovanni; #746323, #746579, #746902, #746364,
#746509, #747636]
Contributors:
Sarvjeet, Giovanni Campagna, Adel Gadllah, Clément Guérin, Devyani Kota,
Ting-Wei Lan, Rui Matos, Shivam Mishra, Florian Müllner, Owen W. Taylor
Translations:
Khaled Hosny [ar], Dušan Kazik [sk], Yuri Myasoedov [ru], Stas Solovey [ru],
Hannie Dumoleyn [nl], Rūdolfs Mazurs [lv]
3.16.0
======
* Revert erroneous login dialog changes [Ray; #740142]
* Improve accessibility of legacy tray [Florian; #746487]
* Fix legacy status icons leaking into other monitors [Florian; #745824]
Contributors:
Florian Müllner, Ray Strode
Translations:
Daniel Martinez [an], Sebastian Rasmussen [sv], Fran Dieguez [gl],
Andika Triwidada [id], Jordi Mas [ca], Kjartan Maraas [nb],
Inaki Larranaga Murgoitio [eu], Muhammet Kara [tr], Khaled Hosny [ar],
Bernd Homuth [de], Jiro Matsuzawa [ja]
3.15.92
=======
* gdm: Fix user list accessibility [Florian; #729603]
* Handle multiline questions in mount operations [Ross; #745713]
* Improve classic theme [Jakub; #745686, #745687]
* Fix ordering of calendar events [Florian; #745988]
* Pick first input source for new windows when per-window [Rui; #746037]
* networkAgent: Show a notification for non-user-initiated password requests
[Giovanni; #660293]
* Fix dismissing calendar events [Florian; #744927]
* Add legacy tray to ctrl-alt-tab popup [Florian; #746022]
* Manage on-screen-keyboard visibility in gnome-shell [Carlos; #745977]
* Add pointer barriers to legacy tray [Cosimo; #746026]
* Use fallback when app icon cannot be resolved [Cosimo; #746219]
* Fix handling of removed smartcard at startup [Ray; #740143]
* gdm: Don't pick a random session for the user [Jasper; #740142]
* Make menu selection behavior consistent with GTK [Florian; #745246]
* gdm: Fix empty user list on user switching [Ray; #719418]
* Misc bug fixes [Florian, Giovanni, Clément, Rui; #745666, #746019, #745861,
#746027, #746223, #737502, #746343, #746288]
Contributors:
Giovanni Campagna, Cosimo Cecchi, Piotr Drąg, Adel Gadllah, Carlos Garnacho,
Clément Guérin, Ross Lagerwall, Rui Matos, Florian Müllner, Jakub Steiner,
Jasper St. Pierre, Ray Strode
Translations:
Piotr Drąg [pl], Changwoo Ryu [ko], Milo Casagrande [it],
Baurzhan Muftakhidinov [kk], Мирослав Николић [sr, sr@latin], Balázs Úr [hu],
IWAI, Masaharu [ja], Daniel Korostil [uk], Aurimas Černius [lt],
Matej Urbančič [sl], Daniel Mustieles [es], Kjartan Maraas [nb],
Victor Ibragimov [tg], Claude Paroz [fr], Jordi Mas [ca], Bernd Homuth [de],
Muhammet Kara [tr], Frédéric Péters [fr], Jiri Grönroos [fi],
Alexander Shopov [bg], Stas Solovey [ru], Trần Ngọc Quân [vi],
Samir Ribic [bs], Dušan Kazik [sk], Enrico Nicoletto [pt_BR],
Marek Černocký [cs], A S Alam [pa], Ask Hjorth Larsen [da],
Tom Tryfonidis [el], Alexandre Franke [fr], Yosef Or Boczko [he],
Chao-Hsiung Liao [zh_TW]
3.15.91
=======
* Don't disable all shortcuts while non-panel menus are open [Florian; #745039]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.15.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.17.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -63,8 +63,8 @@ AC_ARG_ENABLE([systemd],
[enable_systemd=$enableval],
[enable_systemd=auto])
AS_IF([test x$enable_systemd != xno], [
AC_MSG_CHECKING([for libsystemd-journal])
PKG_CHECK_EXISTS([libsystemd-journal],
AC_MSG_CHECKING([for libsystemd])
PKG_CHECK_EXISTS([libsystemd],
[have_systemd=yes
AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
[have_systemd=no])
@@ -76,9 +76,9 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.21.5
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.15.91
MUTTER_MIN_VERSION=3.17.4
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.37.0
GIO_MIN_VERSION=2.45.3
LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.13.90
TELEPATHY_GLIB_MIN_VERSION=0.17.5
@@ -106,7 +106,7 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION
gcr-base-3 >= $GCR_MIN_VERSION"
if test x$have_systemd = xyes; then
SHARED_PCS="${SHARED_PCS} libsystemd-journal"
SHARED_PCS="${SHARED_PCS} libsystemd"
fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)

View File

@@ -32,8 +32,10 @@
<file>summary-counter.svg</file>
<file>toggle-off-us.svg</file>
<file>toggle-off-intl.svg</file>
<file>toggle-off-hc.svg</file>
<file>toggle-on-us.svg</file>
<file>toggle-on-intl.svg</file>
<file>toggle-on-hc.svg</file>
<file>ws-switch-arrow-up.png</file>
<file>ws-switch-arrow-down.png</file>
</gresource>

View File

@@ -51,6 +51,7 @@
</key>
<key name="looking-glass-history" type="as">
<default>[]</default>
<!-- Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass -->
<_summary>History for the looking glass dialog</_summary>
</key>
<key name="always-show-log-out" type="b">

View File

@@ -10,11 +10,11 @@
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="29"
height="29"
width="24"
height="24"
id="svg10621"
version="1.1"
inkscape:version="0.48.2 r9819"
inkscape:version="0.91 r13725"
sodipodi:docname="calendar-today.svg">
<defs
id="defs10623">
@@ -118,17 +118,6 @@
fx="51"
fy="30"
r="42" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient34508-1-3"
id="radialGradient3113"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.72146227,0,0,0.27484277,14.205424,21.754717)"
cx="51"
cy="30"
fx="51"
fy="30"
r="42" />
</defs>
<sodipodi:namedview
id="base"
@@ -137,22 +126,23 @@
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="15.839192"
inkscape:cx="20.652108"
inkscape:cy="11.839084"
inkscape:zoom="8"
inkscape:cx="-23.537329"
inkscape:cy="-31.442864"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
showgrid="false"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0"
inkscape:window-width="1280"
inkscape:window-height="741"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true">
inkscape:window-width="2133"
inkscape:window-height="1241"
inkscape:window-x="238"
inkscape:window-y="88"
inkscape:window-maximized="0"
borderlayer="true"
inkscape:showpageshadow="false">
<inkscape:grid
type="xygrid"
id="grid3109"
@@ -169,7 +159,7 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
@@ -177,28 +167,12 @@
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-469.08263,-532.99307)">
<path
sodipodi:type="arc"
style="opacity:0.4625;color:#000000;fill:url(#radialGradient3113);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path34506-3"
sodipodi:cx="51"
sodipodi:cy="30"
sodipodi:rx="42"
sodipodi:ry="16"
d="M 9,29.999999 A 42,16 0 0 1 93,30 l -42,0 z"
sodipodi:start="3.1415927"
sodipodi:end="6.2831853"
transform="matrix(0.43692393,0,0,1.3783114,461.29951,517.6437)"
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/motion/textures/panel.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<rect
style="fill:#ffffff;fill-opacity:0.50196078;stroke-width:0.43599999;stroke-miterlimit:4;stroke-dasharray:none"
id="rect2996"
width="31"
height="3"
x="468.08264"
y="558.99304" />
transform="translate(-469.08263,-537.99307)">
<circle
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#ffffff;fill-opacity:0.23756906;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="path7305"
cx="481.57138"
cy="559.4649"
r="1.5" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

View File

@@ -37,14 +37,13 @@ stage {
icon-shadow: 0 1px black; }
.button:focus {
color: #eeeeec;
border-color: #215d9c;
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black; }
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.button:insensitive {
color: #7f7f7f;
color: gray;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 68, 0.7);
background-color: rgba(62, 67, 69, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
@@ -52,9 +51,46 @@ stage {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button {
border-right-width: 1px;
color: #eeeeec;
background-color: #2e3436;
border-color: rgba(0, 0, 0, 0.7);
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
padding: 12px; }
.modal-dialog-linked-button:insensitive {
color: gray;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 69, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button:active {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button:focus {
color: #eeeeec;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.modal-dialog-linked-button:first-child {
border-radius: 0px 0px 0px 6px; }
.modal-dialog-linked-button:last-child {
border-right-width: 0px;
border-radius: 0px 0px 6px 0px; }
.modal-dialog-linked-button:first-child:last-child {
border-right-width: 0px;
border-radius: 0px 0px 6px 6px; }
/* Entries */
StEntry {
@@ -71,8 +107,8 @@ StEntry {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
border-color: rgba(166, 166, 166, 0.5); }
StEntry:insensitive {
color: #7f7f7f;
border-color: #0d0d0d;
color: gray;
border-color: #0e0e0e;
box-shadow: none; }
StEntry StIcon.capslock-warning {
icon-size: 16px;
@@ -80,12 +116,13 @@ StEntry {
padding: 0 4px; }
/* Scrollbars */
StScrollView.vfade {
-st-vfade-offset: 68px; }
StScrollView.hfade {
-st-hfade-offset: 68px; }
StScrollBar {
padding: 0; }
StScrollBar.vfade {
-st-vfade-offset: 68px; }
StScrollBar.hfade {
-st-hfade-offset: 68px; }
StScrollView StScrollBar {
min-width: 14px;
min-height: 14px; }
@@ -94,10 +131,10 @@ StScrollBar {
background-color: transparent; }
StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
border-radius: 8px;
background-color: #000;
background-color: #999999;
margin: 3px; }
StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
background-color: #1a1a1a; }
background-color: #cccccc; }
StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
background-color: #215d9c; }
@@ -105,7 +142,7 @@ StScrollBar {
.slider {
height: 1em;
-slider-height: 0.3em;
-slider-background-color: #0d0d0d;
-slider-background-color: #0e0e0e;
-slider-border-color: black;
-slider-active-background-color: #215d9c;
-slider-active-border-color: #184472;
@@ -159,11 +196,12 @@ StScrollBar {
background-color: white; }
.modal-dialog {
border-radius: 5px;
border-radius: 9px;
color: #eeeeec;
background-color: rgba(23, 25, 26, 0.95);
border: 3px solid rgba(238, 238, 236, 0.5);
padding: 24px; }
border: 3px solid rgba(238, 238, 236, 0.5); }
.modal-dialog .modal-dialog-content-box {
padding: 24px; }
.modal-dialog .run-dialog-entry {
width: 20em;
margin-bottom: 6px; }
@@ -178,10 +216,6 @@ StScrollBar {
color: #d6d6d1;
padding-bottom: .4em; }
.button-dialog-button-box {
spacing: 18px;
padding-top: 48px; }
.show-processes-dialog-subject,
.mount-question-dialog-subject,
.end-session-dialog-subject {
@@ -323,7 +357,7 @@ StScrollBar {
.prompt-dialog-headline {
font-weight: bold;
color: #b3b3b3; }
color: #b2b2a9; }
.prompt-dialog-description:rtl {
text-align: right; }
@@ -392,19 +426,14 @@ StScrollBar {
background-color: black;
box-shadow: inset 0 1px 0px #0d0d0d;
font-weight: bold; }
.popup-menu .popup-menu-item:focus {
background-color: #215d9c;
color: #ffffff; }
.popup-menu .popup-menu-item:hover {
.popup-menu .popup-menu-item.selected {
background-color: rgba(255, 255, 255, 0.1);
color: #fff; }
.popup-menu .popup-menu-item:active {
background-color: #1c5187;
background-color: #215d9c;
color: #ffffff; }
.popup-menu .popup-menu-item:insensitive {
color: rgba(255, 255, 255, 0.5); }
.popup-menu .active {
background-color: #215d9c; }
.popup-menu .popup-inactive-menu-item {
color: #fff; }
.popup-menu .popup-inactive-menu-item:insensitive {
@@ -415,7 +444,7 @@ StScrollBar {
.popup-menu-ornament {
text-align: right;
width: 1em; }
width: 1.2em; }
.popup-menu-boxpointer,
.candidate-popup-boxpointer {
@@ -492,10 +521,9 @@ StScrollBar {
.switcher-arrow {
border-color: transparent;
color: black; }
.switcher-arrow:highlighted {
color: #fff; }
color: rgba(255, 255, 255, 0.8); }
.switcher-arrow:highlighted {
color: #fff; }
.input-source-switcher-symbol {
font-size: 34pt;
@@ -565,7 +593,7 @@ StScrollBar {
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
-panel-corner-border-color: #256ab1; }
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-cornerunlock-screen {
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-corner.unlock-screen {
-panel-corner-radius: 0;
-panel-corner-background-color: transparent;
-panel-corner-border-color: transparent; }
@@ -707,15 +735,16 @@ StScrollBar {
border-left-width: 1px; }
.calendar-nonwork-day {
color: #7f7f7f; }
color: gray; }
.calendar-today {
font-weight: bold;
border: 1px solid rgba(0, 0, 0, 0.5); }
.calendar-day-with-events {
color: #f2f2f2;
font-weight: bold; }
color: white;
font-weight: bold;
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); }
.calendar-other-month-day {
color: rgba(255, 255, 255, 0.15);
@@ -794,12 +823,12 @@ StScrollBar {
padding: 13px;
border: 1px solid #0d0d0d; }
.system-menu-action:hover, .system-menu-action:focus {
color: #ffffff;
background-color: #215d9c;
background-color: rgba(255, 255, 255, 0.1);
color: #fff;
border: none;
padding: 14px; }
.system-menu-action:active {
background-color: #1c5187;
background-color: #215d9c;
color: #ffffff; }
.system-menu-action > StIcon {
icon-size: 16px; }
@@ -820,7 +849,7 @@ StScrollBar {
.popup-menu-icon {
icon-size: 1.09em; }
.window-close, .notification-close {
.window-close {
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
background-size: 32px;
height: 32px;
@@ -831,12 +860,6 @@ StScrollBar {
.window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
.notification-close {
-shell-close-overlap-x: 14px;
-shell-close-overlap-y: -12px; }
.notification-close:rtl {
-shell-close-overlap-x: -14px; }
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
@@ -844,7 +867,8 @@ StScrollBar {
min-width: 470px; }
.nm-dialog-content {
spacing: 20px; }
spacing: 20px;
padding: 24px; }
.nm-dialog-header-hbox {
spacing: 10px; }
@@ -1026,7 +1050,7 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.app-view-control:first-child {
@@ -1157,7 +1181,7 @@ StScrollBar {
/* NOTIFICATIONS & MESSAGE TRAY */
.url-highlighter {
link-color: #215d9c; }
link-color: #2a76c6; }
.notification-banner {
font-size: 11pt;
@@ -1192,32 +1216,6 @@ StScrollBar {
.notification-banner .notification-button:hover, .notification-banner .notification-buttonfocus {
background-color: #292f30; }
.notification {
font-size: 11pt;
width: 34em;
margin: 5px;
border-radius: 6px;
color: #eeeeec;
background-color: #2e3436;
border: 1px solid black;
spacing-rows: 4px;
padding: 8px;
spacing-columns: 10px; }
.notification-unexpanded {
min-height: 48px;
height: 48px; }
.notification-with-image {
min-height: 159px; }
.notification-body {
spacing: 5px; }
.notification-actions {
paddinf-top: 18px;
spacing: 6px; }
.summary-source-counter {
font-size: 10pt;
font-weight: bold;
@@ -1231,36 +1229,20 @@ StScrollBar {
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
border-radius: 0.9em; }
.notification-scrollview {
max-height: 18em;
-st-vfade-offset: 24px; }
.notification-scrollview:ltr > StScrollBar {
padding-left: 6px; }
.notification-scrollview:rtl > StScrollBar {
padding-right: 6px; }
.notification-button {
height: 24px; }
.notification-icon-button {
border-radius: 5px;
padding: 5px;
height: 24px;
width: 24px; }
.notification-icon-button > StIcon {
icons-size: 16px;
width: 16px;
height: 16px;
padding: 2px; }
.secondary-icon {
icon-size: 1.09em; }
.chat-body {
spacing: 5px; }
.chat-response {
margin: 5px; }
.chat-log-message {
color: #e6e6e6; }
.chat-empty-line {
font-size: 4px; }
.chat-new-group {
padding-top: 1em; }
.chat-received {
padding-left: 4px; }
@@ -1284,12 +1266,6 @@ StScrollBar {
padding-left: 0;
padding-right: 4px; }
.chat-notification-scrollview {
max-height: 22em; }
.subscription-message {
font-style: italic; }
.hotplug-transient-box {
spacing: 6px;
padding: 2px 72px 2px 12px; }
@@ -1340,12 +1316,23 @@ StScrollBar {
border-radius: 6px 0 0 0;
border-right-width: 0; }
.legacy-tray-handle StIcon {
icon-size: 24px; }
.legacy-tray-handle,
.legacy-tray-icon {
padding: 6px; }
.legacy-tray-handle StIcon,
.legacy-tray-icon StIcon {
icon-size: 24px; }
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
.legacy-tray-icon:hover,
.legacy-tray-icon:focus {
background-color: rgba(255, 255, 255, 0.1); }
.legacy-tray-icon-box {
padding: 6px;
spacing: 12px; }
.legacy-tray-icon-box:ltr {
padding-left: 12px; }
.legacy-tray-icon-box:rtl {
padding-right: 12px; }
.legacy-tray-icon-box StButton {
width: 24px;
height: 24px; }
@@ -1382,10 +1369,9 @@ StScrollBar {
color: white; }
.keyboard-key:focus {
color: #eeeeec;
border-color: #215d9c;
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black; }
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.keyboard-key:hover, .keyboard-key:checked {
color: white;
border-color: rgba(0, 0, 0, 0.7);
@@ -1397,7 +1383,7 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.keyboard-key:grayed {
@@ -1454,10 +1440,12 @@ StScrollBar {
/* Auth Dialogs & Screen Shield */
.framed-user-icon {
background-size: contain;
border: 2px solid black;
border: 2px solid #eeeeec;
color: #eeeeec;
border-radius: 3px; }
.framed-user-icon:hover {
border-color: #4d4d4d; }
border-color: white;
color: white; }
.login-dialog-banner-view {
padding-top: 24px;
@@ -1488,13 +1476,13 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #1c5187;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.login-dialog .modal-dialog-button:default:insensitive {
color: #7f7f7f;
color: gray;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(62, 67, 68, 0.7);
background-color: rgba(62, 67, 69, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
@@ -1554,9 +1542,10 @@ StScrollBar {
color: #ffffff; }
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
height: 2px;
background-color: transparent; }
margin: 2px 0 0 0;
background-color: #eeeeec; }
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
background-color: #2e3436; }
background-color: #ffffff; }
.login-dialog-username,
.user-widget-label {
@@ -1740,3 +1729,11 @@ StScrollBar {
stage {
-st-icon-style: symbolic; }
.toggle-switch {
width: 48px; }
.toggle-switch-us, .toggle-switch-intl {
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg"); }
.toggle-switch-us:checked, .toggle-switch-intl:checked {
background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }

View File

@@ -6,3 +6,9 @@
stage {
-st-icon-style: symbolic;
}
.toggle-switch { width: 48px; }
.toggle-switch-us, .toggle-switch-intl {
background-image: url("resource:///org/gnome/shell/theme/toggle-off-hc.svg");
&:checked { background-image: url("resource:///org/gnome/shell/theme/toggle-on-hc.svg"); }
}

View File

@@ -37,14 +37,13 @@ stage {
icon-shadow: 0 1px black; }
.button:focus {
color: #eeeeec;
border-color: #215d9c;
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black; }
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.button:insensitive {
color: #939695;
color: #949796;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 71, 73, 0.7);
background-color: rgba(66, 72, 73, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
@@ -52,9 +51,46 @@ stage {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button {
border-right-width: 1px;
color: #eeeeec;
background-color: #2e3436;
border-color: rgba(0, 0, 0, 0.7);
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
padding: 12px; }
.modal-dialog-linked-button:insensitive {
color: #949796;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 72, 73, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button:active {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.modal-dialog-linked-button:focus {
color: #eeeeec;
text-shadow: 0 1px black;
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.modal-dialog-linked-button:first-child {
border-radius: 0px 0px 0px 6px; }
.modal-dialog-linked-button:last-child {
border-right-width: 0px;
border-radius: 0px 0px 6px 0px; }
.modal-dialog-linked-button:first-child:last-child {
border-right-width: 0px;
border-radius: 0px 0px 6px 6px; }
/* Entries */
StEntry {
@@ -71,8 +107,8 @@ StEntry {
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.4);
border-color: rgba(154, 154, 142, 0.5); }
StEntry:insensitive {
color: #939695;
border-color: #323636;
color: #949796;
border-color: #333636;
box-shadow: none; }
StEntry StIcon.capslock-warning {
icon-size: 16px;
@@ -80,12 +116,13 @@ StEntry {
padding: 0 4px; }
/* Scrollbars */
StScrollView.vfade {
-st-vfade-offset: 68px; }
StScrollView.hfade {
-st-hfade-offset: 68px; }
StScrollBar {
padding: 0; }
StScrollBar.vfade {
-st-vfade-offset: 68px; }
StScrollBar.hfade {
-st-hfade-offset: 68px; }
StScrollView StScrollBar {
min-width: 14px;
min-height: 14px; }
@@ -94,10 +131,10 @@ StScrollBar {
background-color: transparent; }
StScrollBar StButton#vhandle, StScrollBar StButton#hhandle {
border-radius: 8px;
background-color: #393f3f;
background-color: #a6a8a7;
margin: 3px; }
StScrollBar StButton#vhandle:hover, StScrollBar StButton#hhandle:hover {
background-color: #515a5a; }
background-color: #cacbc9; }
StScrollBar StButton#vhandle:active, StScrollBar StButton#hhandle:active {
background-color: #215d9c; }
@@ -105,7 +142,7 @@ StScrollBar {
.slider {
height: 1em;
-slider-height: 0.3em;
-slider-background-color: #323636;
-slider-background-color: #333636;
-slider-border-color: #1c1f1f;
-slider-active-background-color: #215d9c;
-slider-active-border-color: #184472;
@@ -159,11 +196,12 @@ StScrollBar {
background-color: white; }
.modal-dialog {
border-radius: 5px;
border-radius: 9px;
color: #eeeeec;
background-color: rgba(23, 25, 26, 0.95);
border: 3px solid rgba(238, 238, 236, 0.5);
padding: 24px; }
border: 3px solid rgba(238, 238, 236, 0.5); }
.modal-dialog .modal-dialog-content-box {
padding: 24px; }
.modal-dialog .run-dialog-entry {
width: 20em;
margin-bottom: 6px; }
@@ -178,10 +216,6 @@ StScrollBar {
color: #d6d6d1;
padding-bottom: .4em; }
.button-dialog-button-box {
spacing: 18px;
padding-top: 48px; }
.show-processes-dialog-subject,
.mount-question-dialog-subject,
.end-session-dialog-subject {
@@ -323,7 +357,7 @@ StScrollBar {
.prompt-dialog-headline {
font-weight: bold;
color: #a6a69b; }
color: #b2b2a9; }
.prompt-dialog-description:rtl {
text-align: right; }
@@ -392,19 +426,14 @@ StScrollBar {
background-color: #343a3a;
box-shadow: inset 0 1px 0px #282c2c;
font-weight: bold; }
.popup-menu .popup-menu-item:focus {
background-color: #215d9c;
color: #ffffff; }
.popup-menu .popup-menu-item:hover {
.popup-menu .popup-menu-item.selected {
background-color: rgba(238, 238, 236, 0.1);
color: #eeeeec; }
.popup-menu .popup-menu-item:active {
background-color: #1c5187;
background-color: #215d9c;
color: #ffffff; }
.popup-menu .popup-menu-item:insensitive {
color: rgba(238, 238, 236, 0.5); }
.popup-menu .active {
background-color: #215d9c; }
.popup-menu .popup-inactive-menu-item {
color: #eeeeec; }
.popup-menu .popup-inactive-menu-item:insensitive {
@@ -415,7 +444,7 @@ StScrollBar {
.popup-menu-ornament {
text-align: right;
width: 1em; }
width: 1.2em; }
.popup-menu-boxpointer,
.candidate-popup-boxpointer {
@@ -492,10 +521,9 @@ StScrollBar {
.switcher-arrow {
border-color: transparent;
color: #1c1f1f; }
.switcher-arrow:highlighted {
color: #eeeeec; }
color: rgba(238, 238, 236, 0.8); }
.switcher-arrow:highlighted {
color: #eeeeec; }
.input-source-switcher-symbol {
font-size: 34pt;
@@ -565,7 +593,7 @@ StScrollBar {
-panel-corner-border-color: transparent; }
#panel .panel-corner:active, #panel .panel-corner:overview, #panel .panel-corner:focus {
-panel-corner-border-color: #256ab1; }
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-cornerunlock-screen {
#panel .panel-corner.lock-screen, #panel .panel-corner.login-screen, #panel .panel-corner.unlock-screen {
-panel-corner-radius: 0;
-panel-corner-background-color: transparent;
-panel-corner-border-color: transparent; }
@@ -707,15 +735,16 @@ StScrollBar {
border-left-width: 1px; }
.calendar-nonwork-day {
color: #939695; }
color: #949796; }
.calendar-today {
font-weight: bold;
border: 1px solid rgba(28, 31, 31, 0.5); }
.calendar-day-with-events {
color: #e2e2df;
font-weight: bold; }
color: white;
font-weight: bold;
background-image: url("resource:///org/gnome/shell/theme/calendar-today.svg"); }
.calendar-other-month-day {
color: rgba(238, 238, 236, 0.15);
@@ -794,12 +823,12 @@ StScrollBar {
padding: 13px;
border: 1px solid #282c2c; }
.system-menu-action:hover, .system-menu-action:focus {
color: #ffffff;
background-color: #215d9c;
background-color: rgba(238, 238, 236, 0.1);
color: #eeeeec;
border: none;
padding: 14px; }
.system-menu-action:active {
background-color: #1c5187;
background-color: #215d9c;
color: #ffffff; }
.system-menu-action > StIcon {
icon-size: 16px; }
@@ -820,7 +849,7 @@ StScrollBar {
.popup-menu-icon {
icon-size: 1.09em; }
.window-close, .notification-close {
.window-close {
background-image: url("resource:///org/gnome/shell/theme/close-window.svg");
background-size: 32px;
height: 32px;
@@ -831,12 +860,6 @@ StScrollBar {
.window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0, 0, 0, 0.5); }
.notification-close {
-shell-close-overlap-x: 14px;
-shell-close-overlap-y: -12px; }
.notification-close:rtl {
-shell-close-overlap-x: -14px; }
/* NETWORK DIALOGS */
.nm-dialog {
max-height: 500px;
@@ -844,7 +867,8 @@ StScrollBar {
min-width: 470px; }
.nm-dialog-content {
spacing: 20px; }
spacing: 20px;
padding: 24px; }
.nm-dialog-header-hbox {
spacing: 10px; }
@@ -1026,7 +1050,7 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.app-view-control:first-child {
@@ -1157,7 +1181,7 @@ StScrollBar {
/* NOTIFICATIONS & MESSAGE TRAY */
.url-highlighter {
link-color: #215d9c; }
link-color: #2a76c6; }
.notification-banner {
font-size: 11pt;
@@ -1192,32 +1216,6 @@ StScrollBar {
.notification-banner .notification-button:hover, .notification-banner .notification-buttonfocus {
background-color: #292f30; }
.notification {
font-size: 11pt;
width: 34em;
margin: 5px;
border-radius: 6px;
color: #eeeeec;
background-color: #2e3436;
border: 1px solid #1c1f1f;
spacing-rows: 4px;
padding: 8px;
spacing-columns: 10px; }
.notification-unexpanded {
min-height: 48px;
height: 48px; }
.notification-with-image {
min-height: 159px; }
.notification-body {
spacing: 5px; }
.notification-actions {
paddinf-top: 18px;
spacing: 6px; }
.summary-source-counter {
font-size: 10pt;
font-weight: bold;
@@ -1231,36 +1229,20 @@ StScrollBar {
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.5);
border-radius: 0.9em; }
.notification-scrollview {
max-height: 18em;
-st-vfade-offset: 24px; }
.notification-scrollview:ltr > StScrollBar {
padding-left: 6px; }
.notification-scrollview:rtl > StScrollBar {
padding-right: 6px; }
.notification-button {
height: 24px; }
.notification-icon-button {
border-radius: 5px;
padding: 5px;
height: 24px;
width: 24px; }
.notification-icon-button > StIcon {
icons-size: 16px;
width: 16px;
height: 16px;
padding: 2px; }
.secondary-icon {
icon-size: 1.09em; }
.chat-body {
spacing: 5px; }
.chat-response {
margin: 5px; }
.chat-log-message {
color: #d6d6d1; }
.chat-empty-line {
font-size: 4px; }
.chat-new-group {
padding-top: 1em; }
.chat-received {
padding-left: 4px; }
@@ -1284,12 +1266,6 @@ StScrollBar {
padding-left: 0;
padding-right: 4px; }
.chat-notification-scrollview {
max-height: 22em; }
.subscription-message {
font-style: italic; }
.hotplug-transient-box {
spacing: 6px;
padding: 2px 72px 2px 12px; }
@@ -1340,12 +1316,23 @@ StScrollBar {
border-radius: 6px 0 0 0;
border-right-width: 0; }
.legacy-tray-handle StIcon {
icon-size: 24px; }
.legacy-tray-handle,
.legacy-tray-icon {
padding: 6px; }
.legacy-tray-handle StIcon,
.legacy-tray-icon StIcon {
icon-size: 24px; }
.legacy-tray-handle:hover, .legacy-tray-handle:focus,
.legacy-tray-icon:hover,
.legacy-tray-icon:focus {
background-color: rgba(238, 238, 236, 0.1); }
.legacy-tray-icon-box {
padding: 6px;
spacing: 12px; }
.legacy-tray-icon-box:ltr {
padding-left: 12px; }
.legacy-tray-icon-box:rtl {
padding-right: 12px; }
.legacy-tray-icon-box StButton {
width: 24px;
height: 24px; }
@@ -1382,10 +1369,9 @@ StScrollBar {
color: white; }
.keyboard-key:focus {
color: #eeeeec;
border-color: #215d9c;
box-shadow: inset 0 1px #454f52;
text-shadow: 0 1px black;
icon-shadow: 0 1px black; }
icon-shadow: 0 1px black;
box-shadow: inset 0px 0px 0px 1px #215d9c; }
.keyboard-key:hover, .keyboard-key:checked {
color: white;
border-color: rgba(0, 0, 0, 0.7);
@@ -1397,7 +1383,7 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #222728;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.keyboard-key:grayed {
@@ -1454,10 +1440,12 @@ StScrollBar {
/* Auth Dialogs & Screen Shield */
.framed-user-icon {
background-size: contain;
border: 2px solid #1c1f1f;
border: 2px solid #eeeeec;
color: #eeeeec;
border-radius: 3px; }
.framed-user-icon:hover {
border-color: #656f6f; }
border-color: white;
color: white; }
.login-dialog-banner-view {
padding-top: 24px;
@@ -1488,13 +1476,13 @@ StScrollBar {
color: white;
border-color: rgba(0, 0, 0, 0.7);
background-color: #1c5187;
box-shadow: none;
box-shadow: inset 0 0 black;
text-shadow: none;
icon-shadow: none; }
.login-dialog .modal-dialog-button:default:insensitive {
color: #939695;
color: #949796;
border-color: rgba(0, 0, 0, 0.7);
background-color: rgba(66, 71, 73, 0.7);
background-color: rgba(66, 72, 73, 0.7);
box-shadow: none;
text-shadow: none;
icon-shadow: none; }
@@ -1554,9 +1542,10 @@ StScrollBar {
color: #ffffff; }
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
height: 2px;
background-color: transparent; }
margin: 2px 0 0 0;
background-color: #eeeeec; }
.login-dialog-user-list-item:focus .login-dialog-timed-login-indicator {
background-color: #2e3436; }
background-color: #ffffff; }
.login-dialog-username,
.user-widget-label {

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 98 KiB

View File

@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-off-hc.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-6.1820581"
inkscape:cy="-16.463788"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1364"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="true">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
transform="matrix(1.5323214,0,0,1.2413968,-324.76058,489.69039)"
id="toggle-off"
inkscape:label="#g8477">
<circle
cy="1033.993"
cx="571.95966"
id="path8444"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
r="7" />
<rect
ry="2.0108337"
rx="1.9562569"
y="1031.9885"
x="565.0083"
height="4.0216675"
width="34.850178"
id="rect8461"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#555753;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" />
</g>
<g
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,491.16456)"
id="toggle-on"
inkscape:label="#g8481">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect8475"
width="34.850178"
height="4.0216675"
x="565.0083"
y="1070.9279"
rx="1.9562569"
ry="2.0108337" />
<circle
transform="scale(-1,1)"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="circle8463"
cx="-591.0213"
cy="1072.9402"
r="9" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.1 KiB

113
data/theme/toggle-on-hc.svg Normal file
View File

@@ -0,0 +1,113 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="48"
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-hc.svg">
<defs
id="defs2859">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective2865" />
<inkscape:perspective
id="perspective2843"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:path-effect
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#000000"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-222.95215"
inkscape:cy="3.9378433"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1364"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
showborder="true">
<inkscape:grid
type="xygrid"
id="grid12954"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<metadata
id="metadata2862">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-444.64286,-781.36218)">
<g
transform="matrix(0.6526046,0,0,0.80554422,99.592644,-636.32172)"
id="g37994">
<g
transform="matrix(1.5323214,0,0,1.2413968,-324.85635,441.50868)"
id="toggle-on"
inkscape:label="#g8481">
<rect
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="rect8475"
width="34.850178"
height="4.0216675"
x="565.0083"
y="1070.9279"
rx="1.9562569"
ry="2.0108337" />
<circle
transform="scale(-1,1)"
style="color:#000000;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#3465a4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
id="circle8463"
cx="-591.0213"
cy="1072.9402"
r="9" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -14,7 +14,7 @@
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.48.5 r10040"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-intl.svg">
<defs
id="defs2859">
@@ -52,7 +52,7 @@
<stop
id="stop77465"
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
style="stop-color:#205b9a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
@@ -88,14 +88,14 @@
borderopacity="1.0"
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="32"
inkscape:cx="17.255148"
inkscape:cy="8.9252639"
inkscape:zoom="1"
inkscape:cx="37.410841"
inkscape:cy="16.009314"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="true"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -14,7 +14,7 @@
height="22"
id="svg2857"
version="1.1"
inkscape:version="0.48.5 r10040"
inkscape:version="0.91 r13725"
sodipodi:docname="toggle-on-us.svg">
<defs
id="defs2859">
@@ -32,28 +32,6 @@
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461"
id="linearGradient77551"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
id="linearGradient77461"
inkscape:collect="always">
<stop
id="stop77463"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
<stop
id="stop77465"
offset="1"
style="stop-color:#204a87;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient76469-7-7-4"
@@ -80,6 +58,38 @@
effect="spiro"
id="path-effect77541-4"
is_visible="true" />
<linearGradient
id="linearGradient77461-1"
inkscape:collect="always">
<stop
id="stop77463-1"
offset="0"
style="stop-color:#182f4c;stop-opacity:1" />
<stop
id="stop77465-4"
offset="1"
style="stop-color:#205b9a;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient77551-6-5"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.8527367,0,0,0.80554422,-969.41608,-778.00299)"
x1="1164.7644"
y1="962.93695"
x2="1164.7644"
y2="970.51404" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient77461-1"
id="linearGradient11198"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-1066.3709,794.25325)"
x1="1322.5831"
y1="-312.51855"
x2="1322.5831"
y2="-306.53461" />
</defs>
<sodipodi:namedview
id="base"
@@ -89,13 +99,13 @@
inkscape:pageopacity="1"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="33.380898"
inkscape:cy="6.9658271"
inkscape:cx="-26.798898"
inkscape:cy="5.3753009"
inkscape:document-units="px"
inkscape:current-layer="g37994"
showgrid="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-height="1376"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
@@ -152,7 +162,7 @@
height="25"
width="98"
id="rect38000"
style="color:#000000;fill:url(#linearGradient77551);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
style="color:#000000;fill:url(#linearGradient11198);fill-opacity:1;fill-rule:nonzero;stroke:#182f4c;stroke-width:1.37920964;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;filter-blend-mode:normal;filter-gaussianBlur-deviation:0;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto" />
</g>
<g
transform="translate(2.0625,-2)"

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -35,7 +35,6 @@
<xi:include href="xml/st-bin.xml"/>
<xi:include href="xml/st-box-layout.xml"/>
<xi:include href="xml/st-scroll-view.xml"/>
<xi:include href="xml/st-table.xml"/>
</chapter>
<chapter id="styling">

View File

@@ -54,7 +54,6 @@ const Application = new Lang.Class({
this._startupUuid = null;
this._loaded = false;
this._skipMainWindow = false;
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
},
_extensionAvailable: function(uuid) {

View File

@@ -14,7 +14,7 @@ const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
const UserWidget = imports.ui.userWidget;
const DEFAULT_BUTTON_WELL_ICON_SIZE = 24;
const DEFAULT_BUTTON_WELL_ICON_SIZE = 16;
const DEFAULT_BUTTON_WELL_ANIMATION_DELAY = 1.0;
const DEFAULT_BUTTON_WELL_ANIMATION_TIME = 0.3;
@@ -194,17 +194,15 @@ const AuthPrompt = new Lang.Class({
},
_onAskQuestion: function(verifier, serviceName, question, passwordChar) {
if (this._preemptiveAnswer) {
if (this._queryingService)
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
this._preemptiveAnswer = null;
return;
}
if (this._queryingService)
this.clear();
this._queryingService = serviceName;
if (this._preemptiveAnswer) {
this._userVerifier.answerQuery(this._queryingService, this._preemptiveAnswer);
this._preemptiveAnswer = null;
return;
}
this.setPasswordChar(passwordChar);
this.setQuestion(question);
@@ -403,7 +401,7 @@ const AuthPrompt = new Lang.Class({
},
updateSensitivity: function(sensitive) {
this._updateNextButtonSensitivity(sensitive);
this._updateNextButtonSensitivity(sensitive && this._entry.text.length > 0);
this._entry.reactive = sensitive;
this._entry.clutter_text.editable = sensitive;
},
@@ -434,8 +432,9 @@ const AuthPrompt = new Lang.Class({
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.cancelButton.reactive = true;
this.nextButton.label = _("Next");
if (oldStatus == AuthPromptStatus.VERIFYING)
if (this._userVerifier)
this._userVerifier.cancel();
this._queryingService = null;
@@ -502,7 +501,7 @@ const AuthPrompt = new Lang.Class({
},
cancel: function() {
if (this.verificationStatus == AuthPromptStatus.NOT_VERIFYING || this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
if (this.verificationStatus == AuthPromptStatus.VERIFICATION_SUCCEEDED) {
return;
}
this.reset();

View File

@@ -22,6 +22,7 @@ const Clutter = imports.gi.Clutter;
const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
@@ -48,6 +49,7 @@ const _FADE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 48;
const _MAX_BOTTOM_MENU_ITEMS = 5;
const UserListItem = new Lang.Class({
Name: 'UserListItem',
@@ -71,6 +73,9 @@ const UserListItem = new Lang.Class({
this._userWidget = new UserWidget.UserWidget(this.user);
layout.add(this._userWidget.actor);
this._userWidget.actor.bind_property('label-actor', this.actor, 'label-actor',
GObject.BindingFlags.SYNC_CREATE);
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 });
layout.add(this._timedLoginIndicator);
@@ -279,7 +284,16 @@ const SessionMenuButton = new Lang.Class({
this.actor = new St.Bin({ child: this._button });
this._menu = new PopupMenu.PopupMenu(this._button, 0, St.Side.TOP);
let side = St.Side.TOP;
let align = 0;
if (Gdm.get_session_ids().length > _MAX_BOTTOM_MENU_ITEMS) {
if (this.actor.text_direction == Clutter.TextDirection.RTL)
side = St.Side.RIGHT;
else
side = St.Side.LEFT;
align = 0.5;
}
this._menu = new PopupMenu.PopupMenu(this._button, align, side);
Main.uiGroup.add_actor(this._menu.actor);
this._menu.actor.hide();
@@ -492,7 +506,7 @@ const LoginDialog = new Lang.Class({
let [minWidth, minHeight, natWidth, natHeight] = this._bannerView.get_preferred_size();
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.x1 = Math.floor(centerX - natWidth / 2);
actorBox.y1 = dialogBox.y1 + Main.layoutManager.panelBox.height;
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
@@ -506,7 +520,7 @@ const LoginDialog = new Lang.Class({
let [minWidth, minHeight, natWidth, natHeight] = this._logoBin.get_preferred_size();
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.x1 = Math.floor(centerX - natWidth / 2);
actorBox.y1 = dialogBox.y2 - natHeight;
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
@@ -521,8 +535,8 @@ const LoginDialog = new Lang.Class({
let centerX = dialogBox.x1 + (dialogBox.x2 - dialogBox.x1) / 2;
let centerY = dialogBox.y1 + (dialogBox.y2 - dialogBox.y1) / 2;
actorBox.x1 = centerX - natWidth / 2;
actorBox.y1 = centerY - natHeight / 2;
actorBox.x1 = Math.floor(centerX - natWidth / 2);
actorBox.y1 = Math.floor(centerY - natHeight / 2);
actorBox.x2 = actorBox.x1 + natWidth;
actorBox.y2 = actorBox.y1 + natHeight;
@@ -570,14 +584,21 @@ const LoginDialog = new Lang.Class({
// try a different layout, or if we have what extra space we
// can hand out
if (bannerAllocation) {
let leftOverYSpace = dialogHeight - bannerHeight - authPromptHeight - logoHeight;
let bannerSpace;
if (authPromptAllocation)
bannerSpace = authPromptAllocation.y1 - bannerAllocation.y1;
else
bannerSpace = 0;
let leftOverYSpace = bannerSpace - bannerHeight;
if (leftOverYSpace > 0) {
// First figure out how much left over space is up top
let leftOverTopSpace = leftOverYSpace / 2;
// Then, shift the banner into the middle of that extra space
let yShift = leftOverTopSpace / 2;
let yShift = Math.floor(leftOverTopSpace / 2);
bannerAllocation.y1 += yShift;
bannerAllocation.y2 += yShift;
@@ -603,8 +624,8 @@ const LoginDialog = new Lang.Class({
let centerGap = wideSpacing / 8;
// place the banner along the left edge of the center margin
bannerAllocation.x2 = centerX - centerGap / 2;
bannerAllocation.x1 = bannerAllocation.x2 - wideBannerWidth;
bannerAllocation.x2 = Math.floor(centerX - centerGap / 2);
bannerAllocation.x1 = Math.floor(bannerAllocation.x2 - wideBannerWidth);
// figure out how tall it would like to be and try to accomodate
// but don't let it get too close to the logo
@@ -612,11 +633,11 @@ const LoginDialog = new Lang.Class({
let maxWideHeight = dialogHeight - 3 * logoHeight;
wideBannerHeight = Math.min(maxWideHeight, wideBannerHeight);
bannerAllocation.y1 = centerY - wideBannerHeight / 2;
bannerAllocation.y1 = Math.floor(centerY - wideBannerHeight / 2);
bannerAllocation.y2 = bannerAllocation.y1 + wideBannerHeight;
// place the auth prompt along the right edge of the center margin
authPromptAllocation.x1 = centerX + centerGap / 2;
authPromptAllocation.x1 = Math.floor(centerX + centerGap / 2);
authPromptAllocation.x2 = authPromptAllocation.x1 + authPromptWidth;
} else {
// If we aren't going to do a wide view, then we need to limit
@@ -626,7 +647,7 @@ const LoginDialog = new Lang.Class({
leftOverYSpace += bannerHeight;
// Then figure out how much of that space is up top
let availableTopSpace = leftOverYSpace / 2;
let availableTopSpace = Math.floor(leftOverYSpace / 2);
// Then give all of that space to the banner
bannerAllocation.y2 = bannerAllocation.y1 + availableTopSpace;
@@ -637,7 +658,7 @@ const LoginDialog = new Lang.Class({
let leftOverYSpace = dialogHeight - userSelectionHeight - logoHeight;
if (leftOverYSpace > 0) {
let topExpansion = leftOverYSpace / 2;
let topExpansion = Math.floor(leftOverYSpace / 2);
let bottomExpansion = topExpansion;
userSelectionAllocation.y1 -= topExpansion;
@@ -1083,18 +1104,11 @@ const LoginDialog = new Lang.Class({
},
_onUserListActivated: function(activatedItem) {
let tasks = [function() {
return GdmUtil.cloneAndFadeOutActor(this._userSelectionBox);
},
function() {
this._setUserListExpanded(false);
}];
this._user = activatedItem.user;
this._updateCancelButton();
let batch = new Batch.ConcurrentBatch(this, [new Batch.ConsecutiveBatch(this, tasks),
let batch = new Batch.ConcurrentBatch(this, [GdmUtil.cloneAndFadeOutActor(this._userSelectionBox),
this._beginVerificationForItem(activatedItem)]);
batch.run();
},

View File

@@ -35,8 +35,8 @@ const ALLOWED_FAILURES_KEY = 'allowed-failures';
const LOGO_KEY = 'logo';
const DISABLE_USER_LIST_KEY = 'disable-user-list';
// Give user 16ms to read each character of a PAM message
const USER_READ_TIME = 16
// Give user 48ms to read each character of a PAM message
const USER_READ_TIME = 48
const MessageType = {
NONE: 0,
@@ -410,7 +410,7 @@ const ShellUserVerifier = new Lang.Class({
_updateDefaultService: function() {
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
this._defaultService = PASSWORD_SERVICE_NAME;
else if (this.smartcardDetected)
else if (this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
this._defaultService = SMARTCARD_SERVICE_NAME;
else if (this._haveFingerprintReader)
this._defaultService = FINGERPRINT_SERVICE_NAME;

View File

@@ -134,7 +134,7 @@ const LoginManagerSystemd = new Lang.Class({
if (error)
asyncCallback(false);
else
asyncCallback(result[0] != 'no');
asyncCallback(result[0] != 'no' && result[0] != 'na');
});
},

View File

@@ -7,7 +7,7 @@ const St = imports.gi.St;
const Signals = imports.signals;
const Atk = imports.gi.Atk;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const ANIMATED_ICON_UPDATE_TIMEOUT = 14;
const Animation = new Lang.Class({
Name: 'Animation',

View File

@@ -366,8 +366,6 @@ const AllView = new Lang.Class({
Extends: BaseAppView,
_init: function() {
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this.parent({ usePagination: true }, null);
this._scrollView = new St.ScrollView({ style_class: 'all-apps',
x_expand: true,
@@ -502,6 +500,11 @@ const AllView = new Lang.Class({
_loadApps: function() {
let apps = Gio.AppInfo.get_all().filter(function(appInfo) {
try {
let id = appInfo.get_id(); // catch invalid file encodings
} catch(e) {
return false;
}
return appInfo.should_show();
}).map(function(app) {
return app.get_id();
@@ -525,7 +528,7 @@ const AllView = new Lang.Class({
// at least on single-monitor setups.
// This also disables drag-to-launch on multi-monitor setups,
// but we hope that is not used much.
let favoritesWritable = this._settings.is_writable('favorite-apps');
let favoritesWritable = global.settings.is_writable('favorite-apps');
apps.forEach(Lang.bind(this, function(appId) {
let app = appSys.lookup_app(appId);
@@ -755,7 +758,8 @@ const AllView = new Lang.Class({
let fadeOffset = Math.min(this._grid.topPadding,
this._grid.bottomPadding);
this._scrollView.update_fade_effect(fadeOffset, 0);
this._scrollView.get_effect('fade').fade_edges = true;
if (fadeOffset > 0)
this._scrollView.get_effect('fade').fade_edges = true;
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
this._adjustment.value = 0;
@@ -783,8 +787,6 @@ const FrequentView = new Lang.Class({
_init: function() {
this.parent(null, { fillParent: true });
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this.actor = new St.Widget({ style_class: 'frequent-apps',
layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true });
@@ -827,7 +829,7 @@ const FrequentView = new Lang.Class({
// at least on single-monitor setups.
// This also disables drag-to-launch on multi-monitor setups,
// but we hope that is not used much.
let favoritesWritable = this._settings.is_writable('favorite-apps');
let favoritesWritable = global.settings.is_writable('favorite-apps');
for (let i = 0; i < mostUsed.length; i++) {
if (!mostUsed[i].get_app_info().should_show())
@@ -1064,7 +1066,7 @@ const AppSearchProvider = new Lang.Class({
getInitialResultSet: function(terms, callback, cancellable) {
let query = terms.join(' ');
let groups = Gio.DesktopAppInfo.search(query);
let groups = Shell.AppSystem.search(query);
let usage = Shell.AppUsage.get_default();
let results = [];
groups.forEach(function(group) {
@@ -1293,7 +1295,10 @@ const FolderIcon = new Lang.Class({
if (!_listsIntersect(folderCategories, appCategories))
return;
addAppId(appInfo.get_id());
try {
addAppId(appInfo.get_id()); // catch invalid file encodings
} catch(e) {
}
});
this.actor.visible = this.view.getAllItems().length > 0;
@@ -1804,8 +1809,6 @@ const AppIconMenu = new Lang.Class({
this.actor.add_style_class_name('app-well-menu');
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
// Chain our visibility and lifecycle to that of the source
source.actor.connect('notify::mapped', Lang.bind(this, function () {
if (!source.actor.mapped)
@@ -1867,7 +1870,7 @@ const AppIconMenu = new Lang.Class({
}));
}
let canFavorite = this._settings.is_writable('favorite-apps');
let canFavorite = global.settings.is_writable('favorite-apps');
if (canFavorite) {
this._appendSeparator();

View File

@@ -527,6 +527,10 @@ const BackgroundSource = new Lang.Class({
let file = null;
let style;
// We don't watch changes to settings here,
// instead we rely on Background to watch those
// and emit 'changed' at the right time
if (this._overrideImage != null) {
file = Gio.File.new_for_path(this._overrideImage);
style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode

View File

@@ -16,9 +16,10 @@ const BackgroundMenu = new Lang.Class({
_init: function(layoutManager) {
this.parent(layoutManager.dummyCursor, 0, St.Side.TOP);
this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addSettingsAction(_("Change Background…"), 'gnome-background-panel.desktop');
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
this.addSettingsAction(_("Settings"), 'gnome-control-center.desktop');
this.actor.add_style_class_name('background-menu');

View File

@@ -44,6 +44,10 @@ function _sameDay(dateA, dateB) {
return _sameMonth(dateA, dateB) && (dateA.getDate() == dateB.getDate());
}
function _isToday(date) {
return _sameDay(new Date(), date);
}
function _isWorkDay(date) {
/* Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
let days = C_('calendar-no-work', "06");
@@ -68,21 +72,6 @@ function _getEndOfDay(date) {
return ret;
}
function _formatEventTime(event, periodBegin, periodEnd) {
let ret;
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;
ret = Util.formatTime(date, { timeOnly: true });
}
return ret;
}
function _getCalendarDayAbbreviation(dayNumber) {
let abbreviations = [
/* Translators: Calendar grid abbreviation for Sunday.
@@ -133,7 +122,8 @@ const URLHighlighter = new Lang.Class({
_init: function(text, lineWrap, allowMarkup) {
if (!text)
text = '';
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter' });
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter',
x_expand: true, x_align: Clutter.ActorAlign.START });
this._linkColor = '#ccccff';
this.actor.connect('style-changed', Lang.bind(this, function() {
let [hasColor, color] = this.actor.get_theme_node().lookup_color('link-color', false);
@@ -253,7 +243,8 @@ const URLHighlighter = new Lang.Class({
const CalendarEvent = new Lang.Class({
Name: 'CalendarEvent',
_init: function(date, end, summary, allDay) {
_init: function(id, date, end, summary, allDay) {
this.id = id;
this.date = date;
this.end = end;
this.summary = summary;
@@ -425,9 +416,10 @@ const DBusEventSource = new Lang.Class({
let a = appointments[n];
let date = new Date(a[4] * 1000);
let end = new Date(a[5] * 1000);
let id = a[0];
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(date, end, summary, allDay);
let event = new CalendarEvent(id, date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort(function(event1, event2) {
@@ -1008,8 +1000,7 @@ const Message = new Lang.Class({
this._closeButton = new St.Button({ child: closeIcon, visible: false });
titleBox.add_actor(this._closeButton);
this._bodyStack = new St.Widget({ x_expand: true,
x_align: Clutter.ActorAlign.START });
this._bodyStack = new St.Widget({ x_expand: true });
this._bodyStack.layout_manager = new LabelExpanderLayout();
contentBox.add_actor(this._bodyStack);
@@ -1018,16 +1009,17 @@ const Message = new Lang.Class({
this._bodyStack.add_actor(this.bodyLabel.actor);
this.setBody(body);
this._closeButton.connect('clicked', Lang.bind(this,
function() {
this.emit('close');
}));
this._closeButton.connect('clicked', Lang.bind(this, this.close));
this.actor.connect('notify::hover', Lang.bind(this, this._sync));
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._sync();
},
close: function() {
this.emit('close');
},
setIcon: function(actor) {
this._iconBin.child = actor;
this._iconBin.visible = (actor != null);
@@ -1044,7 +1036,10 @@ const Message = new Lang.Class({
setBody: function(text) {
this._bodyText = text;
this.bodyLabel.setMarkup(text, this._useBodyMarkup);
this.bodyLabel.setMarkup(text ? text.replace(/\n/g, ' ') : '',
this._useBodyMarkup);
if (this._expandedLabel)
this._expandedLabel.setMarkup(text, this._useBodyMarkup);
},
setUseBodyMarkup: function(enable) {
@@ -1092,9 +1087,9 @@ const Message = new Lang.Class({
this._actionBin.visible = (this._actionBin.get_n_children() > 0);
if (this._bodyStack.get_n_children() < 2) {
let expandedLabel = new URLHighlighter(this._bodyText,
true, this._useBodyMarkup);
this.setExpandedBody(expandedLabel.actor);
this._expandedLabel = new URLHighlighter(this._bodyText,
true, this._useBodyMarkup);
this.setExpandedBody(this._expandedLabel.actor);
}
if (animate) {
@@ -1111,6 +1106,8 @@ const Message = new Lang.Class({
this._bodyStack.layout_manager.expansion = 1;
this._actionBin.scale_y = 1;
}
this.emit('expanded');
},
unexpand: function(animate) {
@@ -1133,15 +1130,17 @@ const Message = new Lang.Class({
this._actionBin.scale_y = 0;
this.expanded = false;
}
this.emit('unexpanded');
},
canClear: function() {
canClose: function() {
return true;
},
_sync: function() {
let hovered = this.actor.hover;
this._closeButton.visible = hovered;
this._closeButton.visible = hovered && this.canClose();
this._secondaryBin.visible = !hovered;
},
@@ -1156,7 +1155,7 @@ const Message = new Lang.Class({
if (keysym == Clutter.KEY_Delete ||
keysym == Clutter.KEY_KP_Delete) {
this.emit('close');
this.close();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
@@ -1164,6 +1163,55 @@ const Message = new Lang.Class({
});
Signals.addSignalMethods(Message.prototype);
const EventMessage = new Lang.Class({
Name: 'EventMessage',
Extends: Message,
_init: function(event, date) {
this._event = event;
this._date = date;
this.parent(this._formatEventTime(), event.summary);
},
_formatEventTime: function() {
let periodBegin = _getBeginningOfDay(this._date);
let periodEnd = _getEndOfDay(this._date);
let allDay = (this._event.allDay || (this._event.date <= periodBegin &&
this._event.end >= periodEnd));
let title;
if (allDay) {
/* Translators: Shown in calendar event list for all day events
* Keep it short, best if you can use less then 10 characters
*/
title = C_("event list time", "All Day");
} else {
let date = this._event.date >= periodBegin ? this._event.date
: this._event.end;
title = Util.formatTime(date, { timeOnly: true });
}
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
if (this._event.date < periodBegin && !this._event.allDay) {
if (rtl)
title = title + ELLIPSIS_CHAR;
else
title = ELLIPSIS_CHAR + title;
}
if (this._event.end > periodEnd && !this._event.allDay) {
if (rtl)
title = ELLIPSIS_CHAR + title;
else
title = title + ELLIPSIS_CHAR;
}
return title;
},
canClose: function() {
return _isToday(this._date);
}
});
const NotificationMessage = new Lang.Class({
Name: 'NotificationMessage',
Extends: Message,
@@ -1184,7 +1232,7 @@ const NotificationMessage = new Lang.Class({
notification.connect('destroy', Lang.bind(this,
function() {
if (!this._closed)
this.emit('close');
this.close();
}));
this._updatedId = notification.connect('updated',
Lang.bind(this, this._onUpdated));
@@ -1204,10 +1252,6 @@ const NotificationMessage = new Lang.Class({
this.setUseBodyMarkup(n.bannerBodyMarkup);
},
canClear: function() {
return !this.notification.resident;
},
_onClicked: function() {
this.notification.activate();
},
@@ -1289,7 +1333,7 @@ const MessageListSection = new Lang.Class({
},
addMessage: function(message, animate) {
this.addMessageAtIndex(message, 0, animate);
this.addMessageAtIndex(message, -1, animate);
},
addMessageAtIndex: function(message, index, animate) {
@@ -1358,26 +1402,30 @@ const MessageListSection = new Lang.Class({
this._messages.delete(message);
if (animate)
if (animate) {
Tweener.addTween(obj.container, { scale_x: 0, scale_y: 0,
time: MESSAGE_ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: function() {
obj.container.destroy();
global.sync_pointer();
}});
else
} else {
obj.container.destroy();
global.sync_pointer();
}
},
clear: function() {
let messages = [...this._messages.keys()].filter(function(message) {
return message.canClear();
return message.canClose();
});
// If there are few messages, letting them all zoom out looks OK
if (messages.length < 2) {
messages.forEach(Lang.bind(this, function(message) {
this.removeMessage(message, true); }));
messages.forEach(function(message) {
message.close();
});
} else {
// Otherwise we slide them out one by one, and then zoom them
// out "off-screen" in the end to smoothly shrink the parent
@@ -1391,25 +1439,20 @@ const MessageListSection = new Lang.Class({
time: MESSAGE_ANIMATION_TIME,
delay: i * delay,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.removeMessage(message, true);
})});
onComplete: function() {
message.close();
}});
}
}
},
_canClear: function() {
for (let message of this._messages.keys())
if (message.canClear())
if (message.canClose())
return true;
return false;
},
_isToday: function() {
let today = new Date();
return _sameDay(this._date, today);
},
_shouldShow: function() {
return !this.empty;
},
@@ -1437,6 +1480,15 @@ const EventsSection = new Lang.Class({
this._desktopSettings.connect('changed', Lang.bind(this, this._reloadEvents));
this._eventSource = new EmptyEventSource();
this._ignoredEvents = new Map();
let savedState = global.get_persistent_state('as', 'ignored_events');
if (savedState)
savedState.deep_unpack().forEach(Lang.bind(this,
function(eventId) {
this._ignoredEvents.set(eventId, true);
}));
this.parent('');
Shell.AppSystem.get_default().connect('installed-changed',
@@ -1444,6 +1496,12 @@ const EventsSection = new Lang.Class({
this._appInstalledChanged();
},
_ignoreEvent: function(event) {
this._ignoredEvents.set(event.id, true);
let savedState = new GLib.Variant('as', [...this._ignoredEvents.keys()]);
global.set_persistent_state('ignored_events', savedState);
},
setEventSource: function(eventSource) {
this._eventSource = eventSource;
this._eventSource.connect('changed', Lang.bind(this, this._reloadEvents));
@@ -1454,13 +1512,13 @@ const EventsSection = new Lang.Class({
},
_updateTitle: function() {
let now = new Date();
if (_sameDay(this._date, now)) {
if (_isToday(this._date)) {
this._title.label = _("Events");
return;
}
let dayFormat;
let now = new Date();
if (_sameYear(this._date, now))
/* Translators: Shown on calendar heading when selected day occurs on current year */
dayFormat = Shell.util_translate_time_string(NC_("calendar heading",
@@ -1486,22 +1544,15 @@ const EventsSection = new Lang.Class({
for (let i = 0; i < events.length; i++) {
let event = events[i];
let title = _formatEventTime(event, periodBegin, periodEnd);
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
if (event.date < periodBegin && !event.allDay) {
if (rtl)
title = title + ELLIPSIS_CHAR;
else
title = ELLIPSIS_CHAR + title;
}
if (event.end > periodEnd && !event.allDay) {
if (rtl)
title = ELLIPSIS_CHAR + title;
else
title = title + ELLIPSIS_CHAR;
}
this.addMessage(new Message(title, event.summary), false);
if (this._ignoredEvents.has(event.id))
continue;
let message = new EventMessage(event, this._date);
message.connect('close', Lang.bind(this, function() {
this._ignoreEvent(event);
}));
this.addMessage(message, false);
}
this._reloading = false;
@@ -1544,7 +1595,7 @@ const EventsSection = new Lang.Class({
},
_shouldShow: function() {
return !this.empty || !this._isToday();
return !this.empty || !_isToday(this._date);
},
_sync: function() {
@@ -1663,7 +1714,7 @@ const NotificationSection = new Lang.Class({
},
_shouldShow: function() {
return !this.empty && this._isToday();
return !this.empty && _isToday(this._date);
},
_sync: function() {
@@ -1703,7 +1754,7 @@ const Placeholder = new Lang.Class({
},
_sync: function() {
let isToday = _sameDay(this._date, new Date());
let isToday = _isToday(this._date);
if (isToday && this._icon.gicon == this._todayIcon)
return;
if (!isToday && this._icon.gicon == this._otherIcon)

View File

@@ -9,9 +9,15 @@ const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Gcr = imports.gi.Gcr;
const Animation = imports.ui.animation;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const CheckBox = imports.ui.checkBox;
const Tweener = imports.ui.tweener;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;
const KeyringDialog = new Lang.Class({
Name: 'KeyringDialog',
@@ -58,27 +64,54 @@ const KeyringDialog = new Lang.Class({
{ y_fill: true,
y_align: St.Align.START });
this._workSpinner = null;
this._controlTable = null;
this._cancelButton = this.addButton({ label: '',
action: Lang.bind(this, this._onCancelButton),
key: Clutter.Escape },
{ expand: true, x_fill: false, x_align: St.Align.START });
this.placeSpinner({ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
key: Clutter.Escape });
this._continueButton = this.addButton({ label: '',
action: Lang.bind(this, this._onContinueButton),
default: true },
{ expand: false, x_fill: false, x_align: St.Align.END });
default: true });
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
},
_createSpinner: function() {
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
},
_setWorking: function(working) {
if (!this._workSpinner)
return;
Tweener.removeTweens(this._workSpinner.actor);
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: WORK_SPINNER_ANIMATION_DELAY,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
_buildControlTable: function() {
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
@@ -101,15 +134,19 @@ const KeyringDialog = new Lang.Class({
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
this._createSpinner();
if (rtl) {
layout.attach(this._passwordEntry, 0, row, 1, 1);
layout.attach(label, 1, row, 1, 1);
layout.attach(this._workSpinner.actor, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
layout.attach(label, 2, row, 1, 1);
} else {
layout.attach(label, 0, row, 1, 1);
layout.attach(this._passwordEntry, 1, row, 1, 1);
layout.attach(this._workSpinner.actor, 2, row, 1, 1);
}
row++;
} else {
this._workSpinner = null;
this._passwordEntry = null;
}
@@ -178,7 +215,7 @@ const KeyringDialog = new Lang.Class({
this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive;
this.setWorking(!sensitive);
this._setWorking(!sensitive);
},
_ensureOpen: function() {

View File

@@ -12,6 +12,8 @@ const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Config = imports.misc.config;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const ModalDialog = imports.ui.modalDialog;
const PopupMenu = imports.ui.popupMenu;
const ShellEntry = imports.ui.shellEntry;
@@ -338,6 +340,7 @@ const NetworkSecretDialog = new Lang.Class({
content.message = _("PIN code is needed for the mobile broadband device");
content.secrets.push({ label: _("PIN: "), key: 'pin',
value: gsmSetting.pin || '', password: true });
break;
}
// fall through
case 'cdma':
@@ -610,6 +613,7 @@ const NetworkAgent = new Lang.Class({
this._dialogs = { };
this._vpnRequests = { };
this._notifications = { };
this._native.connect('new-request', Lang.bind(this, this._newRequest));
this._native.connect('cancel-request', Lang.bind(this, this._cancelRequest));
@@ -632,21 +636,92 @@ const NetworkAgent = new Lang.Class({
this._vpnRequests[requestId].cancel(true);
this._vpnRequests = { };
for (requestId in this._notifications)
this._notifications[requestId].destroy();
this._notifications = { };
this._enabled = false;
},
_showNotification: function(requestId, connection, settingName, hints, flags) {
let source = new MessageTray.Source(_("Network Manager"), 'network-transmit-receive');
source.policy = new MessageTray.NotificationApplicationPolicy('gnome-network-panel');
let title, body;
let connectionSetting = connection.get_setting_connection();
let connectionType = connectionSetting.get_connection_type();
switch (connectionType) {
case '802-11-wireless':
let wirelessSetting = connection.get_setting_wireless();
let ssid = NetworkManager.utils_ssid_to_utf8(wirelessSetting.get_ssid());
title = _("Authentication required by wireless network");
body = _("Passwords or encryption keys are required to access the wireless network “%s”.").format(ssid);
break;
case '802-3-ethernet':
title = _("Wired 802.1X authentication");
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
break;
case 'pppoe':
title = _("DSL authentication");
body = _("A password is required to connect to “%s”.".format(connection.get_id()));
break;
case 'gsm':
if (hints.indexOf('pin') != -1) {
let gsmSetting = connection.get_setting_gsm();
title = _("PIN code required");
message = _("PIN code is needed for the mobile broadband device");
break;
}
// fall through
case 'cdma':
case 'bluetooth':
title = _("Mobile broadband network password");
message = _("A password is required to connect to “%s”.").format(connectionSetting.get_id());
break;
default:
log('Invalid connection type: ' + connectionType);
this._native.respond(requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
return;
}
let notification = new MessageTray.Notification(source, title, body);
notification.connect('activated', Lang.bind(this, function() {
notification.answered = true;
this._handleRequest(requestId, connection, settingName, hints, flags);
}));
this._notifications[requestId] = notification;
notification.connect('destroy', Lang.bind(this, function() {
if (!notification.answered)
this._native.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED);
delete this._notifications[requestId];
}));
Main.messageTray.add(source);
source.notify(notification);
},
_newRequest: function(agent, requestId, connection, settingName, hints, flags) {
if (!this._enabled) {
agent.respond(requestId, Shell.NetworkAgentResponse.USER_CANCELED);
return;
}
if (!(flags & NMClient.SecretAgentGetSecretsFlags.USER_REQUESTED))
this._showNotification(requestId, connection, settingName, hints, flags);
else
this._handleRequest(requestId, connection, settingName, hints, flags);
},
_handleRequest: function(requestId, connection, settingName, hints, flags) {
if (settingName == 'vpn') {
this._vpnRequest(requestId, connection, hints, flags);
return;
}
let dialog = new NetworkSecretDialog(agent, requestId, connection, settingName, hints);
let dialog = new NetworkSecretDialog(this._native, requestId, connection, settingName, hints);
dialog.connect('destroy', Lang.bind(this, function() {
delete this._dialogs[requestId];
}));

View File

@@ -13,13 +13,19 @@ const Mainloop = imports.mainloop;
const Polkit = imports.gi.Polkit;
const PolkitAgent = imports.gi.PolkitAgent;
const Animation = imports.ui.animation;
const Components = imports.ui.components;
const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry;
const UserWidget = imports.ui.userWidget;
const Tweener = imports.ui.tweener;
const DIALOG_ICON_SIZE = 48;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;
const AuthenticationDialog = new Lang.Class({
Name: 'AuthenticationDialog',
Extends: ModalDialog.ModalDialog,
@@ -136,6 +142,7 @@ const AuthenticationDialog = new Lang.Class({
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivate));
this._passwordBox.add(this._passwordEntry,
{ expand: true });
this._addSpinner();
this.setInitialKeyFocus(this._passwordEntry);
this._passwordBox.hide();
@@ -165,17 +172,10 @@ const AuthenticationDialog = new Lang.Class({
this._cancelButton = this.addButton({ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape },
{ expand: true, x_fill: false, x_align: St.Align.START });
this.placeSpinner({ expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.MIDDLE });
key: Clutter.Escape });
this._okButton = this.addButton({ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed),
default: true },
{ expand: false, x_fill: false, x_align: St.Align.END });
default: true });
this._doneEmitted = false;
@@ -183,6 +183,39 @@ const AuthenticationDialog = new Lang.Class({
this._cookie = cookie;
},
_addSpinner: function() {
let spinnerIcon = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
this._workSpinner = new Animation.AnimatedIcon(spinnerIcon, WORK_SPINNER_ICON_SIZE);
this._workSpinner.actor.opacity = 0;
this._workSpinner.actor.show();
this._passwordBox.add(this._workSpinner.actor);
},
_setWorking: function(working) {
Tweener.removeTweens(this._workSpinner.actor);
if (working) {
this._workSpinner.play();
Tweener.addTween(this._workSpinner.actor,
{ opacity: 255,
delay: WORK_SPINNER_ANIMATION_DELAY,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear'
});
} else {
Tweener.addTween(this._workSpinner.actor,
{ opacity: 0,
time: WORK_SPINNER_ANIMATION_TIME,
transition: 'linear',
onCompleteScope: this,
onComplete: function() {
if (this._workSpinner)
this._workSpinner.stop();
}
});
}
},
performAuthentication: function() {
this.destroySession();
this._session = new PolkitAgent.Session({ identity: this._identityToAuth,
@@ -229,7 +262,7 @@ const AuthenticationDialog = new Lang.Class({
this._okButton.can_focus = sensitive;
this._okButton.reactive = sensitive;
this.setWorking(!sensitive);
this._setWorking(!sensitive);
},
_onEntryActivate: function() {

View File

@@ -3,6 +3,7 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell;
@@ -31,6 +32,8 @@ const SCROLLBACK_HISTORY_LINES = 10;
// See Notification._onEntryChanged
const COMPOSING_STOP_TIMEOUT = 5;
const CHAT_EXPAND_LINES = 12;
const NotificationDirection = {
SENT: 'chat-sent',
RECEIVED: 'chat-received'
@@ -155,14 +158,6 @@ const TelepathyClient = new Lang.Class({
this._chatSources[channel.get_object_path()] = source;
source.connect('destroy', Lang.bind(this,
function() {
if (this._tpClient.is_handling_channel(channel)) {
// The chat box has been destroyed so it can't
// handle the channel any more.
channel.close_async(function(src, result) {
channel.close_finish(result);
});
}
delete this._chatSources[channel.get_object_path()];
}));
},
@@ -271,15 +266,8 @@ const ChatSource = new Lang.Class({
this._channel = channel;
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
this._notification = new ChatNotification(this);
this._notification.connect('activated', Lang.bind(this, this.open));
this._notification.setUrgency(MessageTray.Urgency.HIGH);
this._notifyTimeoutId = 0;
// We ack messages when the user expands the new notification or views the summary
// notification, in which case the notification is also expanded.
this._notification.connect('expanded', Lang.bind(this, this._ackMessages));
this._presence = contact.get_presence_type();
this._sentId = this._channel.connect('message-sent', Lang.bind(this, this._messageSent));
@@ -292,15 +280,46 @@ const ChatSource = new Lang.Class({
// Add ourselves as a source.
Main.messageTray.add(this);
this.pushNotification(this._notification);
this._getLogMessages();
},
_ensureNotification: function() {
if (this._notification)
return;
this._notification = new ChatNotification(this);
this._notification.connect('activated', Lang.bind(this, this.open));
this._notification.connect('updated', Lang.bind(this,
function() {
if (this._banner && this._banner.expanded)
this._ackMessages();
}));
this._notification.connect('destroy', Lang.bind(this,
function() {
this._notification = null;
}));
this.pushNotification(this._notification);
},
_createPolicy: function() {
return new MessageTray.NotificationApplicationPolicy('empathy');
},
createBanner: function() {
this._banner = new ChatNotificationBanner(this._notification);
// We ack messages when the user expands the new notification
let id = this._banner.connect('expanded', Lang.bind(this, this._ackMessages));
this._banner.actor.connect('destroy', Lang.bind(this,
function() {
this._banner.disconnect(id);
this._banner = null;
}));
return this._banner;
},
_updateAlias: function() {
let oldAlias = this.title;
let newAlias = this._contact.get_alias();
@@ -309,7 +328,8 @@ const ChatSource = new Lang.Class({
return;
this.setTitle(newAlias);
this._notification.appendAliasChange(oldAlias, newAlias);
if (this._notification)
this._notification.appendAliasChange(oldAlias, newAlias);
},
getIcon: function() {
@@ -352,10 +372,16 @@ const ChatSource = new Lang.Class({
_updateAvatarIcon: function() {
this.iconUpdated();
this._notification.update(this._notification.title, null, { customContent: true });
if (this._notifiction)
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ gicon: this.getIcon() });
},
open: function() {
Main.overview.hide();
Main.panel.closeCalendar();
if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy or Polari
// (depending on the channel type)
@@ -390,6 +416,7 @@ const ChatSource = new Lang.Class({
let [success, events] = logManager.get_filtered_events_finish(result);
let logMessages = events.map(makeMessageFromTplEvent);
this._ensureNotification();
let pendingTpMessages = this._channel.get_pending_messages();
let pendingMessages = [];
@@ -439,6 +466,18 @@ const ChatSource = new Lang.Class({
},
destroy: function(reason) {
if (this._client.is_handling_channel(this._channel)) {
// The chat box has been destroyed so it can't
// handle the channel any more.
this._channel.close_async(function(channel, result) {
channel.close_finish(result);
});
}
// Keep source alive while the channel is open
if (reason != MessageTray.NotificationDestroyedReason.SOURCE_CLOSED)
return;
if (this._destroyed)
return;
@@ -452,9 +491,6 @@ const ChatSource = new Lang.Class({
this._contact.disconnect(this._notifyAvatarId);
this._contact.disconnect(this._presenceChangedId);
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
this.parent(reason);
},
@@ -479,6 +515,7 @@ const ChatSource = new Lang.Class({
if (message.get_message_type() == Tp.ChannelTextMessageType.DELIVERY_REPORT)
return;
this._ensureNotification();
this._pendingMessages.push(message);
this.countUpdated();
@@ -506,6 +543,7 @@ const ChatSource = new Lang.Class({
// This is called for both messages we send from
// our client and other clients as well.
_messageSent: function(channel, message, flags, token) {
this._ensureNotification();
message = makeMessageFromTpMessage(message, NotificationDirection.SENT);
this._notification.appendMessage(message);
},
@@ -543,14 +581,10 @@ const ChatSource = new Lang.Class({
},
_presenceChanged: function (contact, presence, status, message) {
let msg, title;
title = GLib.markup_escape_text(this.title, -1);
this._notification.update(this._notification.title, null, { customContent: true, secondaryGIcon: this.getSecondaryIcon() });
if (message)
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
if (this._notification)
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ secondaryGIcon: this.getSecondaryIcon() });
},
_pendingRemoved: function(channel, message) {
@@ -560,6 +594,10 @@ const ChatSource = new Lang.Class({
this._pendingMessages.splice(idx, 1);
this.countUpdated();
}
if (this._pendingMessages.length == 0 &&
this._banner && !this._banner.expanded)
this._banner.hide();
},
_ackMessages: function() {
@@ -574,42 +612,20 @@ const ChatNotification = new Lang.Class({
Extends: MessageTray.Notification,
_init: function(source) {
this.parent(source, source.title, null, { customContent: true, secondaryGIcon: source.getSecondaryIcon() });
this.parent(source, source.title, null,
{ secondaryGIcon: source.getSecondaryIcon() });
this.setUrgency(MessageTray.Urgency.HIGH);
this.setResident(true);
this._responseEntry = new St.Entry({ style_class: 'chat-response',
can_focus: true });
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
this._responseEntry.clutter_text.connect('text-changed', Lang.bind(this, this._onEntryChanged));
this.setActionArea(this._responseEntry);
this._responseEntry.clutter_text.connect('key-focus-in', Lang.bind(this, function() {
this.focused = true;
}));
this._responseEntry.clutter_text.connect('key-focus-out', Lang.bind(this, function() {
this.focused = false;
this.emit('unfocused');
}));
this._createScrollArea();
this._lastGroup = null;
// Keep track of the bottom position for the current adjustment and
// force a scroll to the bottom if things change while we were at the
// bottom
this._oldMaxScrollValue = this._scrollArea.vscroll.adjustment.value;
this._scrollArea.add_style_class_name('chat-notification-scrollview');
this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
if (adjustment.value == this._oldMaxScrollValue)
this.scrollTo(St.Side.BOTTOM);
this._oldMaxScrollValue = Math.max(adjustment.lower, adjustment.upper - adjustment.page_size);
}));
this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text });
this._history = [];
this.messages = [];
this._timestampTimeoutId = 0;
this._composingTimeoutId = 0;
},
destroy: function(reason) {
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
this._timestampTimeoutId = 0;
this.parent(reason);
},
/**
@@ -635,10 +651,8 @@ const ChatNotification = new Lang.Class({
styles.push('chat-action');
}
if (message.direction == NotificationDirection.RECEIVED) {
this.update(this.source.title, messageBody, { customContent: true,
bannerMarkup: true });
}
if (message.direction == NotificationDirection.RECEIVED)
this.update(this.source.title, messageBody, { bannerMarkup: true });
let group = (message.direction == NotificationDirection.RECEIVED ?
'received' : 'sent');
@@ -651,10 +665,10 @@ const ChatNotification = new Lang.Class({
},
_filterMessages: function() {
if (this._history.length < 1)
if (this.messages.length < 1)
return;
let lastMessageTime = this._history[0].time;
let lastMessageTime = this.messages[0].timestamp;
let currentTime = (Date.now() / 1000);
// Keep the scrollback from growing too long. If the most
@@ -666,12 +680,12 @@ const ChatNotification = new Lang.Class({
let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
let filteredHistory = this.messages.filter(function(item) { return item.realMessage });
if (filteredHistory.length > maxLength) {
let lastMessageToKeep = filteredHistory[maxLength];
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
let expired = this.messages.splice(this.messages.indexOf(lastMessageToKeep));
for (let i = 0; i < expired.length; i++)
expired[i].actor.destroy();
this.emit('message-removed', expired[i]);
}
},
@@ -684,7 +698,6 @@ const ChatNotification = new Lang.Class({
* styles: Style class names for the message to have.
* timestamp: The timestamp of the message.
* noTimestamp: suppress timestamp signal?
* childProps: props to add the actor with.
*/
_append: function(props) {
let currentTime = (Date.now() / 1000);
@@ -692,44 +705,23 @@ const ChatNotification = new Lang.Class({
group: null,
styles: [],
timestamp: currentTime,
noTimestamp: false,
childProps: null });
noTimestamp: false });
// Reset the old message timeout
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
this._timestampTimeoutId = 0;
let highlighter = new MessageTray.URLHighlighter(props.body,
true, // line wrap?
true); // allow markup?
let message = { realMessage: props.group != 'meta',
showTimestamp: false };
Lang.copyProperties(props, message);
delete message.noTimestamp;
let body = highlighter.actor;
let styles = props.styles;
for (let i = 0; i < styles.length; i++)
body.add_style_class_name(styles[i]);
let group = props.group;
if (group != this._lastGroup) {
this._lastGroup = group;
let emptyLine = new St.Label({ style_class: 'chat-empty-line' });
this.addActor(emptyLine);
this._history.unshift({ actor: emptyLine, time: timestamp,
realMessage: false });
}
let lineBox = new St.BoxLayout({ vertical: false });
lineBox.add(body, props.childProps);
this.addActor(lineBox);
this._lastMessageBox = lineBox;
this.updated();
let timestamp = props.timestamp;
this._history.unshift({ actor: lineBox, time: timestamp,
realMessage: group != 'meta' });
this.messages.unshift(message);
this.emit('message-added', message);
if (!props.noTimestamp) {
let timestamp = props.timestamp;
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME) {
this.appendTimestamp();
} else {
@@ -748,15 +740,8 @@ const ChatNotification = new Lang.Class({
appendTimestamp: function() {
this._timestampTimeoutId = 0;
let lastMessageTime = this._history[0].time;
let lastMessageDate = new Date(lastMessageTime * 1000);
let timeLabel = Util.createTimeLabel(lastMessageDate);
timeLabel.style_class = 'chat-meta-message';
timeLabel.x_expand = timeLabel.y_expand = true;
timeLabel.x_align = timeLabel.y_align = Clutter.ActorAlign.END;
this._lastMessageBox.add_actor(timeLabel);
this.messages[0].showTimestamp = true;
this.emit('timestamp-changed', this.messages[0]);
this._filterMessages();
@@ -771,13 +756,154 @@ const ChatNotification = new Lang.Class({
IM name. */
let message = '<i>' + _("%s is now known as %s").format(oldAlias, newAlias) + '</i>';
let label = this._append({ body: message,
group: 'meta',
styles: ['chat-meta-message'] });
this.update(newAlias, null, { customContent: true });
this._append({ body: message,
group: 'meta',
styles: ['chat-meta-message'] });
this._filterMessages();
}
});
const ChatLineBox = new Lang.Class({
Name: 'ChatLineBox',
Extends: St.BoxLayout,
vfunc_get_preferred_height: function(forWidth) {
let [, natHeight] = this.parent(forWidth);
return [natHeight, natHeight];
}
});
const ChatNotificationBanner = new Lang.Class({
Name: 'ChatNotificationBanner',
Extends: MessageTray.NotificationBanner,
_init: function(notification) {
this.parent(notification);
this._responseEntry = new St.Entry({ style_class: 'chat-response',
x_expand: true,
can_focus: true });
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
this._responseEntry.clutter_text.connect('text-changed', Lang.bind(this, this._onEntryChanged));
this.setActionArea(this._responseEntry);
this._responseEntry.clutter_text.connect('key-focus-in', Lang.bind(this, function() {
this.focused = true;
}));
this._responseEntry.clutter_text.connect('key-focus-out', Lang.bind(this, function() {
this.focused = false;
this.emit('unfocused');
}));
this._scrollArea = new St.ScrollView({ style_class: 'chat-scrollview vfade',
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER,
visible: this.expanded });
this._contentArea = new St.BoxLayout({ style_class: 'chat-body',
vertical: true });
this._scrollArea.add_actor(this._contentArea);
this.setExpandedBody(this._scrollArea);
this.setExpandedLines(CHAT_EXPAND_LINES);
this._lastGroup = null;
// Keep track of the bottom position for the current adjustment and
// force a scroll to the bottom if things change while we were at the
// bottom
this._oldMaxScrollValue = this._scrollArea.vscroll.adjustment.value;
this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
if (adjustment.value == this._oldMaxScrollValue)
this.scrollTo(St.Side.BOTTOM);
this._oldMaxScrollValue = Math.max(adjustment.lower, adjustment.upper - adjustment.page_size);
}));
this._inputHistory = new History.HistoryManager({ entry: this._responseEntry.clutter_text });
this._composingTimeoutId = 0;
this._messageActors = new Map();
this._messageAddedId = this.notification.connect('message-added',
Lang.bind(this, function(n, message) {
this._addMessage(message);
}));
this._messageRemovedId = this.notification.connect('message-removed',
Lang.bind(this, function(n, message) {
let actor = this._messageActors.get(message);
if (this._messageActors.delete(message))
actor.destroy();
}));
this._timestampChangedId = this.notification.connect('timestamp-changed',
Lang.bind(this, function(n, message) {
this._updateTimestamp(message);
}));
for (let i = this.notification.messages.length - 1; i >= 0; i--)
this._addMessage(this.notification.messages[i]);
},
_onDestroy: function() {
this.parent();
this.notification.disconnect(this._messageAddedId);
this.notification.disconnect(this._messageRemovedId);
this.notification.disconnect(this._timestampChangedId);
},
scrollTo: function(side) {
let adjustment = this._scrollArea.vscroll.adjustment;
if (side == St.Side.TOP)
adjustment.value = adjustment.lower;
else if (side == St.Side.BOTTOM)
adjustment.value = adjustment.upper;
},
hide: function() {
this.emit('done-displaying');
},
_addMessage: function(message) {
let highlighter = new Calendar.URLHighlighter(message.body, true, true);
let body = highlighter.actor;
let styles = message.styles;
for (let i = 0; i < styles.length; i++)
body.add_style_class_name(styles[i]);
let group = message.group;
if (group != this._lastGroup) {
this._lastGroup = group;
body.add_style_class_name('chat-new-group');
}
let lineBox = new ChatLineBox();
lineBox.add(body);
this._contentArea.add_actor(lineBox);
this._messageActors.set(message, lineBox);
this._updateTimestamp(message);
},
_updateTimestamp: function(message) {
let actor = this._messageActors.get(message);
if (!actor)
return;
while (actor.get_n_children() > 1)
actor.get_child_at_index(1).destroy();
if (message.showTimestamp) {
let lastMessageTime = message.timestamp;
let lastMessageDate = new Date(lastMessageTime * 1000);
let timeLabel = Util.createTimeLabel(lastMessageDate);
timeLabel.style_class = 'chat-meta-message';
timeLabel.x_expand = timeLabel.y_expand = true;
timeLabel.x_align = timeLabel.y_align = Clutter.ActorAlign.END;
actor.add_actor(timeLabel);
}
},
_onEntryActivated: function() {
@@ -790,13 +916,13 @@ const ChatNotification = new Lang.Class({
// Telepathy sends out the Sent signal for us.
// see Source._messageSent
this._responseEntry.set_text('');
this.source.respond(text);
this.notification.source.respond(text);
},
_composingStopTimeout: function() {
this._composingTimeoutId = 0;
this.source.setChatState(Tp.ChannelChatState.PAUSED);
this.notification.source.setChatState(Tp.ChannelChatState.PAUSED);
return GLib.SOURCE_REMOVE;
},
@@ -816,14 +942,14 @@ const ChatNotification = new Lang.Class({
}
if (text != '') {
this.source.setChatState(Tp.ChannelChatState.COMPOSING);
this.notification.source.setChatState(Tp.ChannelChatState.COMPOSING);
this._composingTimeoutId = Mainloop.timeout_add_seconds(
COMPOSING_STOP_TIMEOUT,
Lang.bind(this, this._composingStopTimeout));
GLib.Source.set_name_by_id(this._composingTimeoutId, '[gnome-shell] this._composingStopTimeout');
} else {
this.source.setChatState(Tp.ChannelChatState.ACTIVE);
this.notification.source.setChatState(Tp.ChannelChatState.ACTIVE);
}
}
});

View File

@@ -27,8 +27,8 @@ const CtrlAltTabManager = new Lang.Class({
_init: function() {
this._items = [];
this.addGroup(global.window_group, _("Windows"),
'emblem-documents-symbolic', { sortGroup: SortGroup.TOP,
focusCallback: Lang.bind(this, this._focusWindows) });
'focus-windows-symbolic', { sortGroup: SortGroup.TOP,
focusCallback: Lang.bind(this, this._focusWindows) });
},
addGroup: function(root, name, icon, params) {

View File

@@ -270,7 +270,7 @@ const ShowAppsIcon = new Lang.Class({
if (app == null)
return false;
if (!this._settings.is_writable('favorite-apps'))
if (!global.settings.is_writable('favorite-apps'))
return false;
let id = app.get_id();
@@ -428,8 +428,6 @@ const Dash = new Lang.Class({
this._workId = Main.initializeDeferredWork(this._box, Lang.bind(this, this._redisplay));
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._appSystem = Shell.AppSystem.get_default();
this._appSystem.connect('installed-changed', Lang.bind(this, function() {
@@ -862,7 +860,7 @@ const Dash = new Lang.Class({
if (app == null || app.is_window_backed())
return DND.DragMotionResult.NO_DROP;
if (!this._settings.is_writable('favorite-apps'))
if (!global.settings.is_writable('favorite-apps'))
return DND.DragMotionResult.NO_DROP;
let favorites = AppFavorites.getAppFavorites().getFavorites();
@@ -941,7 +939,7 @@ const Dash = new Lang.Class({
return false;
}
if (!this._settings.is_writable('favorite-apps'))
if (!global.settings.is_writable('favorite-apps'))
return false;
let id = app.get_id();

View File

@@ -357,8 +357,6 @@ const DateMenuButton = new Lang.Class({
this._date.setDate(now);
this._messageList.setDate(now);
}
// Block notification banners while the menu is open
Main.messageTray.bannerBlocked = isOpen;
}));
// Fill up the first column

View File

@@ -81,7 +81,6 @@ function init() {
// Miscellaneous monkeypatching
_patchContainerClass(St.BoxLayout);
_patchContainerClass(St.Table);
_patchLayoutClass(Clutter.TableLayout, { row_spacing: 'spacing-rows',
column_spacing: 'spacing-columns' });

View File

@@ -211,7 +211,7 @@ const InstallExtensionDialog = new Lang.Class({
let icon = new St.Icon({ gicon: gicon });
box.add(icon);
let label = new St.Label({ style_class: 'prompt-dialog-headline',
let label = new St.Label({ style_class: 'prompt-dialog-headline headline',
text: message });
box.add(label);
},

View File

@@ -6,6 +6,7 @@ const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
@@ -23,9 +24,6 @@ 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';
@@ -60,14 +58,7 @@ const CaribouDaemonIface = '<node> \
</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',
@@ -120,6 +111,35 @@ 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();
// We only handle touch events here on wayland. On X11
// we do get emulated pointer events, which already works
// for single-touch cases. Besides, the X11 passive touch grab
// set up by Mutter will make us see first the touch events
// and later the pointer events, so it will look like two
// unrelated series of events, we want to avoid double handling
// in these cases.
if (!Meta.is_wayland_compositor())
return Clutter.EVENT_PROPAGATE;
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;
},
@@ -184,21 +204,23 @@ const Keyboard = new Lang.Class({
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._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 = null;
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._lastDeviceId = null;
if (Meta.is_wayland_compositor() &&
Caribou.DisplayAdapter.set_default)
Caribou.DisplayAdapter.set_default(new ShellWaylandAdapter());
Meta.get_backend().connect('last-device-changed', Lang.bind(this,
function (backend, deviceId) {
let manager = Clutter.DeviceManager.get_default();
let device = manager.get_device(deviceId);
if (device.get_device_name().indexOf('XTEST') < 0) {
this._lastDeviceId = deviceId;
this._sync();
}
}));
this._sync();
this._showIdleId = 0;
@@ -217,9 +239,22 @@ const Keyboard = new Lang.Class({
this._redraw();
},
_lastDeviceIsTouchscreen: function () {
if (!this._lastDeviceId)
return false;
let manager = Clutter.DeviceManager.get_default();
let device = manager.get_device(this._lastDeviceId);
if (!device)
return false;
return device.get_device_type() == Clutter.InputDeviceType.TOUCHSCREEN_DEVICE;
},
_sync: function () {
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD) ||
this._cursorProxy.ShowOSK;
this._lastDeviceIsTouchscreen();
if (!this._enableKeyboard && !this._keyboard)
return;
if (this._enableKeyboard && this._keyboard &&
@@ -717,3 +752,24 @@ const KeyboardSource = new Lang.Class({
this._keyboard.show(Main.layoutManager.bottomIndex);
}
});
const ShellWaylandAdapter = new Lang.Class({
Name: 'ShellWaylandAdapter',
Extends: Caribou.XAdapter,
vfunc_keyval_press: function(keyval) {
let focus = global.stage.get_key_focus();
if (focus instanceof Clutter.Text)
Shell.util_text_insert_keyval(focus, keyval);
else
this.parent(keyval);
},
vfunc_keyval_release: function(keyval) {
let focus = global.stage.get_key_focus();
if (focus instanceof Clutter.Text)
return; // do nothing
else
this.parent(keyval);
},
});

View File

@@ -11,6 +11,7 @@ const St = imports.gi.St;
const Background = imports.ui.background;
const BackgroundMenu = imports.ui.backgroundMenu;
const LoginManager = imports.misc.loginManager;
const DND = imports.ui.dnd;
const Main = imports.ui.main;
@@ -273,6 +274,18 @@ const LayoutManager = new Lang.Class({
global.screen.connect('in-fullscreen-changed',
Lang.bind(this, this._updateFullscreen));
this._monitorsChanged();
// NVIDIA drivers don't preserve FBO contents across
// suspend/resume, see
// https://bugzilla.gnome.org/show_bug.cgi?id=739178
if (Shell.util_need_background_refresh()) {
LoginManager.getLoginManager().connect('prepare-for-sleep',
function(lm, suspending) {
if (suspending)
return;
Meta.Background.refresh_all();
});
}
},
// This is called by Main after everything else is constructed
@@ -824,6 +837,7 @@ const LayoutManager = new Lang.Class({
// need to connect to 'destroy' too.
this._trackedActors.push(actorData);
this._updateActorVisibility(actorData);
this._queueUpdateRegions();
},
@@ -842,25 +856,23 @@ const LayoutManager = new Lang.Class({
this._queueUpdateRegions();
},
_updateActorVisibility: function(actorData) {
if (!actorData.trackFullscreen)
return;
let monitor = this.findMonitorForActor(actorData.actor);
actorData.actor.visible = !(global.window_group.visible &&
monitor &&
monitor.inFullscreen);
},
_updateVisibility: function() {
let windowsVisible = Main.sessionMode.hasWindows && !this._inOverview;
global.window_group.visible = windowsVisible;
global.top_window_group.visible = windowsVisible;
for (let i = 0; i < this._trackedActors.length; i++) {
let actorData = this._trackedActors[i], visible;
if (!actorData.trackFullscreen)
continue;
if (!windowsVisible)
visible = true;
else if (this.findMonitorForActor(actorData.actor).inFullscreen)
visible = false;
else
visible = true;
actorData.actor.visible = visible;
}
this._trackedActors.forEach(Lang.bind(this, this._updateActorVisibility));
},
getWorkAreaForMonitor: function(monitorIndex) {
@@ -1303,8 +1315,11 @@ const PressureBarrier = new Lang.Class({
},
_onBarrierLeft: function(barrier, event) {
this._reset();
this._isTriggered = false;
barrier._isHit = false;
if (this._barriers.every(function(b) { return !b._isHit; })) {
this._reset();
this._isTriggered = false;
}
},
_trigger: function() {
@@ -1314,6 +1329,8 @@ const PressureBarrier = new Lang.Class({
},
_onBarrierHit: function(barrier, event) {
barrier._isHit = true;
// If we've triggered the barrier, wait until the pointer has the
// left the barrier hitbox until we trigger it again.
if (this._isTriggered)

View File

@@ -1,8 +1,11 @@
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const CtrlAltTab = imports.ui.ctrlAltTab;
const Lang = imports.lang;
const Layout = imports.ui.layout;
const Main = imports.ui.main;
@@ -26,8 +29,12 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
};
// Offset of the original position from the bottom-right corner
const CONCEALED_VISIBLE_FRACTION = 0.2;
const CONCEALED_WIDTH = 3;
const REVEAL_ANIMATION_TIME = 0.2;
const TEMP_REVEAL_TIME = 2;
const BARRIER_THRESHOLD = 70;
const BARRIER_TIMEOUT = 1000;
const LegacyTray = new Lang.Class({
Name: 'LegacyTray',
@@ -49,11 +56,15 @@ const LegacyTray = new Lang.Class({
y_align: Clutter.ActorAlign.END,
layout_manager: this._slideLayout });
this.actor.add_actor(this._slider);
this._slider.connect('notify::allocation', Lang.bind(this, this._syncBarrier));
this._box = new St.BoxLayout();
this._slider.add_actor(this._box);
this._concealHandle = new St.Button({ style_class: 'legacy-tray-handle' });
this._concealHandle = new St.Button({ style_class: 'legacy-tray-handle',
/* translators: 'Hide' is a verb */
accessible_name: _("Hide tray"),
can_focus: true });
this._concealHandle.child = new St.Icon({ icon_name: 'go-previous-symbolic' });
this._box.add_child(this._concealHandle);
@@ -81,12 +92,24 @@ const LegacyTray = new Lang.Class({
this._revealHandle.show();
}));
this._horizontalBarrier = null;
this._pressureBarrier = new Layout.PressureBarrier(BARRIER_THRESHOLD,
BARRIER_TIMEOUT,
Shell.ActionMode.NORMAL);
this._pressureBarrier.connect('trigger', Lang.bind(this, function() {
this._concealHandle.show();
}));
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
Main.layoutManager.trackChrome(this._slider, { affectsInputRegion: true });
Main.uiGroup.set_child_below_sibling(this.actor, Main.layoutManager.modalDialogGroup);
Main.ctrlAltTabManager.addGroup(this.actor,
_("Status Icons"), 'focus-legacy-systray-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.BOTTOM });
this._trayManager = new Shell.TrayManager();
this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
this._trayManager.manage_screen(global.screen, this.actor);
Main.overview.connect('showing', Lang.bind(this,
@@ -121,17 +144,47 @@ const LegacyTray = new Lang.Class({
return;
let button = new St.Button({ child: icon,
style_class: 'legacy-tray-icon',
button_mask: St.ButtonMask.ONE |
St.ButtonMask.TWO |
St.ButtonMask.THREE,
can_focus: true,
x_fill: true, y_fill: true });
let app = Shell.WindowTracker.get_default().get_app_from_pid(icon.pid);
if (!app)
app = Shell.AppSystem.get_default().lookup_startup_wmclass(wmClass);
if (!app)
app = Shell.AppSystem.get_default().lookup_desktop_wmclass(wmClass);
if (app)
button.accessible_name = app.get_name();
else
button.accessible_name = icon.title;
button.connect('clicked',
function() {
icon.click(Clutter.get_current_event());
});
button.connect('key-press-event',
function() {
icon.click(Clutter.get_current_event());
return Clutter.EVENT_PROPAGATE;
});
button.connect('key-focus-in', Lang.bind(this,
function() {
this._concealHandle.show();
}));
this._iconBox.add_actor(button);
this._sync();
if (!this._concealHandle.visible) {
this._concealHandle.show();
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, TEMP_REVEAL_TIME,
Lang.bind(this, function() {
this._concealHandle.hide();
return GLib.SOURCE_REMOVE;
}));
}
},
_onTrayIconRemoved: function(tm, icon) {
@@ -142,6 +195,45 @@ const LegacyTray = new Lang.Class({
this._sync();
},
_syncBarrier: function() {
let rtl = (this._slider.get_text_direction() == Clutter.TextDirection.RTL);
let [x, y] = this._slider.get_transformed_position();
let [w, h] = this._slider.get_transformed_size();
let x1 = Math.round(x);
if (rtl)
x1 += Math.round(w);
let x2 = x1;
let y1 = Math.round(y);
let y2 = y1 + Math.round(h);
if (this._horizontalBarrier &&
this._horizontalBarrier.x1 == x1 &&
this._horizontalBarrier.y1 == y1 &&
this._horizontalBarrier.x2 == x2 &&
this._horizontalBarrier.y2 == y2)
return;
this._unsetBarrier();
let directions = (rtl ? Meta.BarrierDirection.NEGATIVE_X : Meta.BarrierDirection.POSITIVE_X);
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
x1: x1, x2: x2,
y1: y1, y2: y2,
directions: directions });
this._pressureBarrier.addBarrier(this._horizontalBarrier);
},
_unsetBarrier: function() {
if (this._horizontalBarrier == null)
return;
this._pressureBarrier.removeBarrier(this._horizontalBarrier);
this._horizontalBarrier.destroy();
this._horizontalBarrier = null;
},
_sync: function() {
// FIXME: we no longer treat tray icons as notifications
let allowed = Main.sessionMode.hasNotifications;
@@ -162,17 +254,20 @@ const LegacyTray = new Lang.Class({
let [, boxWidth] = this._box.get_preferred_width(-1);
let [, handleWidth] = this._revealHandle.get_preferred_width(-1);
targetSlide = handleWidth / boxWidth;
if (!this._revealHandle.hover)
targetSlide *= CONCEALED_VISIBLE_FRACTION;
if (this._revealHandle.hover)
targetSlide = handleWidth / boxWidth;
else
targetSlide = CONCEALED_WIDTH / boxWidth;
}
if (this.actor.visible)
if (this.actor.visible) {
Tweener.addTween(this._slideLayout,
{ slideX: targetSlide,
time: REVEAL_ANIMATION_TIME,
transition: 'easeOutQuad' });
else
} else {
this._slideLayout.slideX = targetSlide;
this._unsetBarrier();
}
}
});

View File

@@ -4,6 +4,7 @@ const Atspi = imports.gi.Atspi;
const Clutter = imports.gi.Clutter;
const GDesktopEnums = imports.gi.GDesktopEnums;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Lang = imports.lang;
@@ -22,6 +23,8 @@ const MOUSE_POLL_FREQUENCY = 50;
const CROSSHAIRS_CLIP_SIZE = [100, 100];
const NO_CHANGE = 0.0;
const POINTER_REST_TIME = 1000; // milliseconds
// Settings
const APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEY = 'screen-magnifier-enabled';
@@ -444,55 +447,6 @@ const Magnifier = new Lang.Class({
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
if (zoomRegion) {
// Mag factor is accurate to two decimal places.
let aPref = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
if (aPref != 0.0)
zoomRegion.setMagFactor(aPref, aPref);
aPref = this._settings.get_enum(SCREEN_POSITION_KEY);
if (aPref)
zoomRegion.setScreenPosition(aPref);
zoomRegion.setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
zoomRegion.setClampScrollingAtEdges(!this._settings.get_boolean(CLAMP_MODE_KEY));
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
if (aPref)
zoomRegion.setMouseTrackingMode(aPref);
aPref = this._settings.get_enum(FOCUS_TRACKING_KEY);
if (aPref)
zoomRegion.setFocusTrackingMode(aPref);
aPref = this._settings.get_enum(CARET_TRACKING_KEY);
if (aPref)
zoomRegion.setCaretTrackingMode(aPref);
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
if (aPref)
zoomRegion.setInvertLightness(aPref);
aPref = this._settings.get_double(COLOR_SATURATION_KEY);
if (aPref)
zoomRegion.setColorSaturation(aPref);
let bc = {};
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
zoomRegion.setBrightness(bc);
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
zoomRegion.setContrast(bc);
}
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
this.addCrosshairs();
this.setCrosshairsVisible(showCrosshairs);
this._appSettings.connect('changed::' + SHOW_KEY,
Lang.bind(this, function() {
this.setActive(this._appSettings.get_boolean(SHOW_KEY));
@@ -561,6 +515,56 @@ const Magnifier = new Lang.Class({
Lang.bind(this, function() {
this.setCrosshairsClip(this._settings.get_boolean(CROSS_HAIRS_CLIP_KEY));
}));
if (zoomRegion) {
// Mag factor is accurate to two decimal places.
let aPref = parseFloat(this._settings.get_double(MAG_FACTOR_KEY).toFixed(2));
if (aPref != 0.0)
zoomRegion.setMagFactor(aPref, aPref);
aPref = this._settings.get_enum(SCREEN_POSITION_KEY);
if (aPref)
zoomRegion.setScreenPosition(aPref);
zoomRegion.setLensMode(this._settings.get_boolean(LENS_MODE_KEY));
zoomRegion.setClampScrollingAtEdges(!this._settings.get_boolean(CLAMP_MODE_KEY));
aPref = this._settings.get_enum(MOUSE_TRACKING_KEY);
if (aPref)
zoomRegion.setMouseTrackingMode(aPref);
aPref = this._settings.get_enum(FOCUS_TRACKING_KEY);
if (aPref)
zoomRegion.setFocusTrackingMode(aPref);
aPref = this._settings.get_enum(CARET_TRACKING_KEY);
if (aPref)
zoomRegion.setCaretTrackingMode(aPref);
aPref = this._settings.get_boolean(INVERT_LIGHTNESS_KEY);
if (aPref)
zoomRegion.setInvertLightness(aPref);
aPref = this._settings.get_double(COLOR_SATURATION_KEY);
if (aPref)
zoomRegion.setColorSaturation(aPref);
let bc = {};
bc.r = this._settings.get_double(BRIGHT_RED_KEY);
bc.g = this._settings.get_double(BRIGHT_GREEN_KEY);
bc.b = this._settings.get_double(BRIGHT_BLUE_KEY);
zoomRegion.setBrightness(bc);
bc.r = this._settings.get_double(CONTRAST_RED_KEY);
bc.g = this._settings.get_double(CONTRAST_GREEN_KEY);
bc.b = this._settings.get_double(CONTRAST_BLUE_KEY);
zoomRegion.setContrast(bc);
}
let showCrosshairs = this._settings.get_boolean(SHOW_CROSS_HAIRS_KEY);
this.addCrosshairs();
this.setCrosshairsVisible(showCrosshairs);
return this._appSettings.get_boolean(SHOW_KEY);
},
@@ -708,6 +712,9 @@ const ZoomRegion = new Lang.Class({
this._xCaret = 0;
this._yCaret = 0;
this._pointerIdleMonitor = Meta.IdleMonitor.get_for_device(Meta.VIRTUAL_CORE_POINTER_ID);
this._scrollContentsTimerId = 0;
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
this._focusCaretTracker.connect('caret-moved',
@@ -1067,6 +1074,26 @@ const ZoomRegion = new Lang.Class({
return this._isMouseOverRegion();
},
_clearScrollContentsTimer: function() {
if (this._scrollContentsTimerId != 0) {
Mainloop.source_remove(this._scrollContentsTimerId);
this._scrollContentsTimerId = 0;
}
},
_scrollContentsToDelayed: function(x, y) {
if (this._pointerIdleMonitor.get_idletime() >= POINTER_REST_TIME) {
this.scrollContentsTo(x, y);
return;
}
this._clearScrollContentsTimer();
this._scrollContentsTimerId = Mainloop.timeout_add(POINTER_REST_TIME, Lang.bind(this, function() {
this._scrollContentsToDelayed(x, y);
return GLib.SOURCE_REMOVE;
}));
},
/**
* scrollContentsTo:
* Shift the contents of the magnified view such it is centered on the given
@@ -1075,6 +1102,8 @@ const ZoomRegion = new Lang.Class({
* @y: The y-coord of the point to center on.
*/
scrollContentsTo: function(x, y) {
this._clearScrollContentsTimer();
this._followingCursor = false;
this._changeROI({ xCenter: x,
yCenter: y });
@@ -1380,7 +1409,7 @@ const ZoomRegion = new Lang.Class({
else if (this._caretTrackingMode == GDesktopEnums.MagnifierCaretTrackingMode.CENTERED)
[xCaret, yCaret] = this._centerFromPointCentered(xCaret, yCaret);
this.scrollContentsTo(xCaret, yCaret);
this._scrollContentsToDelayed(xCaret, yCaret);
},
_centerFromFocusPosition: function() {
@@ -1394,7 +1423,7 @@ const ZoomRegion = new Lang.Class({
else if (this._focusTrackingMode == GDesktopEnums.MagnifierFocusTrackingMode.CENTERED)
[xFocus, yFocus] = this._centerFromPointCentered(xFocus, yFocus);
this.scrollContentsTo(xFocus, yFocus);
this._scrollContentsToDelayed(xFocus, yFocus);
},
_centerFromPointPush: function(xPoint, yPoint) {

View File

@@ -529,6 +529,7 @@ function activateWindow(window, time, workspaceNum) {
}
overview.hide();
panel.closeCalendar();
}
// TODO - replace this timeout with some system to guess when the user might

View File

@@ -69,26 +69,6 @@ const Urgency = {
CRITICAL: 3
};
function _fixMarkup(text, allowMarkup) {
if (allowMarkup) {
// Support &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
// occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&amp;');
// Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup.
_text = _text.replace(/<(?!\/?[biu]>)/g, '&lt;');
try {
Pango.parse_markup(_text, -1, '');
return _text;
} catch (e) {}
}
// !allowMarkup, or invalid markup
return GLib.markup_escape_text(text, -1);
}
const FocusGrabber = new Lang.Class({
Name: 'FocusGrabber',
@@ -147,130 +127,6 @@ const FocusGrabber = new Lang.Class({
}
});
const URLHighlighter = new Lang.Class({
Name: 'URLHighlighter',
_init: function(text, lineWrap, allowMarkup) {
if (!text)
text = '';
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter' });
this._linkColor = '#ccccff';
this.actor.connect('style-changed', Lang.bind(this, function() {
let [hasColor, color] = this.actor.get_theme_node().lookup_color('link-color', false);
if (hasColor) {
let linkColor = color.to_string().substr(0, 7);
if (linkColor != this._linkColor) {
this._linkColor = linkColor;
this._highlightUrls();
}
}
}));
if (lineWrap) {
this.actor.clutter_text.line_wrap = true;
this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
this.actor.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
}
this.setMarkup(text, allowMarkup);
this.actor.connect('button-press-event', Lang.bind(this, function(actor, event) {
// Don't try to URL highlight when invisible.
// The MessageTray doesn't actually hide us, so
// we need to check for paint opacities as well.
if (!actor.visible || actor.get_paint_opacity() == 0)
return Clutter.EVENT_PROPAGATE;
// Keep Notification.actor from seeing this and taking
// a pointer grab, which would block our button-release-event
// handler, if an URL is clicked
return this._findUrlAtPos(event) != -1;
}));
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
if (!actor.visible || actor.get_paint_opacity() == 0)
return Clutter.EVENT_PROPAGATE;
let urlId = this._findUrlAtPos(event);
if (urlId != -1) {
let url = this._urls[urlId].url;
if (url.indexOf(':') == -1)
url = 'http://' + url;
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context(0, -1));
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
}));
this.actor.connect('motion-event', Lang.bind(this, function(actor, event) {
if (!actor.visible || actor.get_paint_opacity() == 0)
return Clutter.EVENT_PROPAGATE;
let urlId = this._findUrlAtPos(event);
if (urlId != -1 && !this._cursorChanged) {
global.screen.set_cursor(Meta.Cursor.POINTING_HAND);
this._cursorChanged = true;
} else if (urlId == -1) {
global.screen.set_cursor(Meta.Cursor.DEFAULT);
this._cursorChanged = false;
}
return Clutter.EVENT_PROPAGATE;
}));
this.actor.connect('leave-event', Lang.bind(this, function() {
if (!this.actor.visible || this.actor.get_paint_opacity() == 0)
return Clutter.EVENT_PROPAGATE;
if (this._cursorChanged) {
this._cursorChanged = false;
global.screen.set_cursor(Meta.Cursor.DEFAULT);
}
return Clutter.EVENT_PROPAGATE;
}));
},
setMarkup: function(text, allowMarkup) {
text = text ? _fixMarkup(text, allowMarkup) : '';
this._text = text;
this.actor.clutter_text.set_markup(text);
/* clutter_text.text contain text without markup */
this._urls = Util.findUrls(this.actor.clutter_text.text);
this._highlightUrls();
},
_highlightUrls: function() {
// text here contain markup
let urls = Util.findUrls(this._text);
let markup = '';
let pos = 0;
for (let i = 0; i < urls.length; i++) {
let url = urls[i];
let str = this._text.substr(pos, url.pos - pos);
markup += str + '<span foreground="' + this._linkColor + '"><u>' + url.url + '</u></span>';
pos = url.pos + url.url.length;
}
markup += this._text.substr(pos);
this.actor.clutter_text.set_markup(markup);
},
_findUrlAtPos: function(event) {
let success;
let [x, y] = event.get_coords();
[success, x, y] = this.actor.transform_stage_point(x, y);
let find_pos = -1;
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
if (py > y || py + line_height < y || x < px)
continue;
find_pos = i;
}
if (find_pos != -1) {
for (let i = 0; i < this._urls.length; i++)
if (find_pos >= this._urls[i].pos &&
this._urls[i].pos + this._urls[i].url.length > find_pos)
return i;
}
return -1;
}
});
// NotificationPolicy:
// An object that holds all bits of configurable policy related to a notification
// source, such as whether to play sound or honour the critical bit.
@@ -382,6 +238,8 @@ const NotificationApplicationPolicy = new Lang.Class({
_changed: function(settings, key) {
this.emit('policy-changed', key);
if (key == 'enable')
this.emit('enable-changed');
},
_canonicalizeId: function(id) {
@@ -473,10 +331,6 @@ const NotificationApplicationPolicy = new Lang.Class({
const Notification = new Lang.Class({
Name: 'Notification',
ICON_SIZE: 24,
IMAGE_SIZE: 125,
_init: function(source, title, banner, params) {
this.source = source;
this.title = title;
@@ -485,63 +339,14 @@ const Notification = new Lang.Class({
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
this.isTransient = false;
this.forFeedback = false;
this.expanded = false;
this.focused = false;
this._acknowledged = false;
this._destroyed = false;
this._customContent = false;
this.bannerBodyText = null;
this.bannerBodyMarkup = false;
this._bannerBodyAdded = false;
this._titleFitsInBannerMode = true;
this._spacing = 0;
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
this._soundName = null;
this._soundFile = null;
this._soundPlayed = false;
this.actions = [];
this.actor = new St.Button({ accessible_role: Atk.Role.NOTIFICATION });
this.actor.add_style_class_name('notification-unexpanded');
this.actor._delegate = this;
this.actor.connect('clicked', Lang.bind(this, this.activate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._table = new St.Table({ style_class: 'notification',
reactive: true });
this._table.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.set_child(this._table);
// The first line should have the title, followed by the
// banner text, but ellipsized if they won't both fit. We can't
// make St.Table or St.BoxLayout do this the way we want (don't
// show banner at all if title needs to be ellipsized), so we
// use Shell.GenericContainer.
this._bannerBox = new Shell.GenericContainer();
this._bannerBox.connect('get-preferred-width', Lang.bind(this, this._bannerBoxGetPreferredWidth));
this._bannerBox.connect('get-preferred-height', Lang.bind(this, this._bannerBoxGetPreferredHeight));
this._bannerBox.connect('allocate', Lang.bind(this, this._bannerBoxAllocate));
this._table.add(this._bannerBox, { row: 0,
col: 1,
col_span: 2,
x_expand: false,
y_expand: false,
y_fill: false });
// This is an empty cell that overlaps with this._bannerBox cell to ensure
// that this._bannerBox cell expands horizontally, while not forcing the
// this._imageBin that is also in col: 2 to expand horizontally.
this._table.add(new St.Bin(), { row: 0,
col: 2,
y_expand: false,
y_fill: false });
this._titleLabel = new St.Label();
this._bannerBox.add_actor(this._titleLabel);
this._bannerUrlHighlighter = new URLHighlighter();
this._bannerLabel = this._bannerUrlHighlighter.actor;
this._bannerBox.add_actor(this._bannerLabel);
// If called with only one argument we assume the caller
// will call .update() later on. This is the case of
// NotificationDaemon, which wants to use the same code
@@ -559,107 +364,25 @@ const Notification = new Lang.Class({
// the title/banner. If @params.clear is %true, it will also
// remove any additional actors/action buttons previously added.
update: function(title, banner, params) {
params = Params.parse(params, { customContent: false,
gicon: null,
params = Params.parse(params, { gicon: null,
secondaryGIcon: null,
bannerMarkup: false,
clear: false,
soundName: null,
soundFile: null });
this._customContent = params.customContent;
let oldFocus = global.stage.key_focus;
if (this._icon && (params.gicon || params.clear)) {
this._icon.destroy();
this._icon = null;
}
if (this._secondaryIcon && (params.secondaryGIcon || params.clear)) {
this._secondaryIcon.destroy();
this._secondaryIcon = null;
}
// We always clear the content area if we don't have custom
// content because it might contain the @banner that didn't
// fit in the banner mode.
if (this._scrollArea && (!this._customContent || params.clear)) {
if (oldFocus && this._scrollArea.contains(oldFocus))
this.actor.grab_key_focus();
this._scrollArea.destroy();
this._scrollArea = null;
this._contentArea = null;
}
if (this._actionArea && params.clear) {
if (oldFocus && this._actionArea.contains(oldFocus))
this.actor.grab_key_focus();
this._actionArea.destroy();
this._actionArea = null;
this._buttonBox = null;
this.actions = [];
}
if (!this._scrollArea && !this._actionArea)
this._table.remove_style_class_name('multi-line-notification');
if (params.gicon) {
this._icon = new St.Icon({ gicon: params.gicon,
icon_size: this.ICON_SIZE });
} else {
this._icon = this.source.createIcon(this.ICON_SIZE);
}
if (this._icon) {
this._table.add(this._icon, { row: 0,
col: 0,
x_expand: false,
y_expand: false,
y_fill: false,
y_align: St.Align.START });
}
if (params.secondaryGIcon) {
this._secondaryIcon = new St.Icon({ gicon: params.secondaryGIcon,
style_class: 'secondary-icon' });
this._bannerBox.add_actor(this._secondaryIcon);
}
this.title = title;
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
let titleDirection;
if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL)
titleDirection = Clutter.TextDirection.RTL;
else
titleDirection = Clutter.TextDirection.LTR;
// Let the title's text direction control the overall direction
// of the notification - in case where different scripts are used
// in the notification, this is the right thing for the icon, and
// arguably for action buttons as well. Labels other than the title
// will be allocated at the available width, so that their alignment
// is done correctly automatically.
this._table.set_text_direction(titleDirection);
// Unless the notification has custom content, we save this.bannerBodyText
// to add it to the content of the notification if the notification is
// expandable due to other elements in its content area or due to the banner
// not fitting fully in the single-line mode.
this.bannerBodyText = this._customContent ? null : banner;
this.bannerBodyText = banner;
this.bannerBodyMarkup = params.bannerMarkup;
this._bannerBodyAdded = false;
banner = banner ? banner.replace(/\n/g, ' ') : '';
if (params.gicon || params.clear)
this.gicon = params.gicon;
this._bannerUrlHighlighter.setMarkup(banner, params.bannerMarkup);
this._bannerLabel.queue_relayout();
if (params.secondaryGIcon || params.clear)
this.secondaryGIcon = params.secondaryGIcon;
// Add the bannerBody now if we know for sure we'll need it
if (this.bannerBodyText && this.bannerBodyText.indexOf('\n') > -1)
this._addBannerBody();
if (params.clear)
this.actions = [];
if (this._soundName != params.soundName ||
this._soundFile != params.soundFile) {
@@ -668,168 +391,14 @@ const Notification = new Lang.Class({
this._soundPlayed = false;
}
this.updated();
this.emit('updated', params.clear);
},
setIconVisible: function(visible) {
this._icon.visible = visible;
},
enableScrolling: function(enableScrolling) {
this._scrollPolicy = enableScrolling ? Gtk.PolicyType.AUTOMATIC : Gtk.PolicyType.NEVER;
if (this._scrollArea) {
this._scrollArea.vscrollbar_policy = this._scrollPolicy;
this._scrollArea.enable_mouse_scrolling = enableScrolling;
}
},
_createScrollArea: function() {
this._table.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ style_class: 'notification-scrollview',
vscrollbar_policy: this._scrollPolicy,
hscrollbar_policy: Gtk.PolicyType.NEVER,
visible: this.expanded });
this._table.add(this._scrollArea, { row: 1,
col: 2 });
this._updateLastColumnSettings();
this._contentArea = new St.BoxLayout({ style_class: 'notification-body',
vertical: true });
this._scrollArea.add_actor(this._contentArea);
// If we know the notification will be expandable, we need to add
// the banner text to the body as the first element.
this._addBannerBody();
},
// addActor:
// @actor: actor to add to the body of the notification
//
// Appends @actor to the notification's body
addActor: function(actor, style) {
if (!this._scrollArea) {
this._createScrollArea();
}
this._contentArea.add(actor, style ? style : {});
this.updated();
},
// addBody:
// @text: the text
// @markup: %true if @text contains pango markup
// @style: style to use when adding the actor containing the text
//
// Adds a multi-line label containing @text to the notification.
//
// Return value: the newly-added label
addBody: function(text, markup, style) {
let label = new URLHighlighter(text, true, markup);
this.addActor(label.actor, style);
return label.actor;
},
_addBannerBody: function() {
if (this.bannerBodyText && !this._bannerBodyAdded) {
this._bannerBodyAdded = true;
this.addBody(this.bannerBodyText, this.bannerBodyMarkup);
}
},
// scrollTo:
// @side: St.Side.TOP or St.Side.BOTTOM
//
// Scrolls the content area (if scrollable) to the indicated edge
scrollTo: function(side) {
let adjustment = this._scrollArea.vscroll.adjustment;
if (side == St.Side.TOP)
adjustment.value = adjustment.lower;
else if (side == St.Side.BOTTOM)
adjustment.value = adjustment.upper;
},
// setActionArea:
// @actor: the actor
// @props: (option) St.Table child properties
//
// Puts @actor into the action area of the notification, replacing
// the previous contents
setActionArea: function(actor, props) {
if (this._actionArea) {
this._actionArea.destroy();
this._actionArea = null;
if (this._buttonBox)
this._buttonBox = null;
} else {
this._addBannerBody();
}
this._actionArea = actor;
this._actionArea.visible = this.expanded;
if (!props)
props = {};
props.row = 2;
props.col = 2;
this._table.add_style_class_name('multi-line-notification');
this._table.add(this._actionArea, props);
this._updateLastColumnSettings();
this.updated();
},
_updateLastColumnSettings: function() {
if (this._scrollArea)
this._table.child_set(this._scrollArea, { col: 1,
col_span: 2 });
if (this._actionArea)
this._table.child_set(this._actionArea, { col: 1,
col_span: 2 });
},
addButton: function(button, callback) {
if (!this._buttonBox) {
let box = new St.BoxLayout({ style_class: 'notification-actions' });
this.setActionArea(box, { x_expand: false,
y_expand: false,
x_fill: false,
y_fill: false,
x_align: St.Align.END });
this._buttonBox = box;
global.focus_manager.add_group(this._buttonBox);
}
this._buttonBox.add(button);
button.connect('clicked', Lang.bind(this, function() {
callback();
if (!this.resident) {
// We don't hide a resident notification when the user invokes one of its actions,
// because it is common for such notifications to update themselves with new
// information based on the action. We'd like to display the updated information
// in place, rather than pop-up a new notification.
this.emit('done-displaying');
this.destroy();
}
}));
this.updated();
return button;
},
// addAction:
// @label: the label for the action's button
// @callback: the callback for the action
//
// Adds a button with the given @label to the notification. All
// action buttons will appear in a single row at the bottom of
// the notification.
addAction: function(label, callback) {
this.actions.push({ label: label, callback: callback });
let button = new St.Button({ style_class: 'notification-button',
label: label,
can_focus: true });
return this.addButton(button, callback);
},
get acknowledged() {
@@ -859,132 +428,6 @@ const Notification = new Lang.Class({
this.forFeedback = forFeedback;
},
_styleChanged: function() {
this._spacing = this._table.get_theme_node().get_length('spacing-columns');
},
_bannerBoxGetPreferredWidth: function(actor, forHeight, alloc) {
let [titleMin, titleNat] = this._titleLabel.get_preferred_width(forHeight);
let [bannerMin, bannerNat] = this._bannerLabel.get_preferred_width(forHeight);
if (this._secondaryIcon) {
let [secondaryIconMin, secondaryIconNat] = this._secondaryIcon.get_preferred_width(forHeight);
alloc.min_size = secondaryIconMin + this._spacing + titleMin;
alloc.natural_size = secondaryIconNat + this._spacing + titleNat + this._spacing + bannerNat;
} else {
alloc.min_size = titleMin;
alloc.natural_size = titleNat + this._spacing + bannerNat;
}
},
_bannerBoxGetPreferredHeight: function(actor, forWidth, alloc) {
[alloc.min_size, alloc.natural_size] =
this._titleLabel.get_preferred_height(forWidth);
},
_bannerBoxAllocate: function(actor, box, flags) {
let availWidth = box.x2 - box.x1;
let [titleMinW, titleNatW] = this._titleLabel.get_preferred_width(-1);
let [titleMinH, titleNatH] = this._titleLabel.get_preferred_height(availWidth);
let [bannerMinW, bannerNatW] = this._bannerLabel.get_preferred_width(availWidth);
let rtl = (this._table.text_direction == Clutter.TextDirection.RTL);
let x = rtl ? availWidth : 0;
if (this._secondaryIcon) {
let [iconMinW, iconNatW] = this._secondaryIcon.get_preferred_width(-1);
let [iconMinH, iconNatH] = this._secondaryIcon.get_preferred_height(availWidth);
let secondaryIconBox = new Clutter.ActorBox();
let secondaryIconBoxW = Math.min(iconNatW, availWidth);
// allocate secondary icon box
if (rtl) {
secondaryIconBox.x1 = x - secondaryIconBoxW;
secondaryIconBox.x2 = x;
x = x - (secondaryIconBoxW + this._spacing);
} else {
secondaryIconBox.x1 = x;
secondaryIconBox.x2 = x + secondaryIconBoxW;
x = x + secondaryIconBoxW + this._spacing;
}
secondaryIconBox.y1 = 0;
// Using titleNatH ensures that the secondary icon is centered vertically
secondaryIconBox.y2 = titleNatH;
availWidth = availWidth - (secondaryIconBoxW + this._spacing);
this._secondaryIcon.allocate(secondaryIconBox, flags);
}
let titleBox = new Clutter.ActorBox();
let titleBoxW = Math.min(titleNatW, availWidth);
if (rtl) {
titleBox.x1 = availWidth - titleBoxW;
titleBox.x2 = availWidth;
} else {
titleBox.x1 = x;
titleBox.x2 = titleBox.x1 + titleBoxW;
}
titleBox.y1 = 0;
titleBox.y2 = titleNatH;
this._titleLabel.allocate(titleBox, flags);
this._titleFitsInBannerMode = (titleNatW <= availWidth);
let bannerFits = true;
if (titleBoxW + this._spacing > availWidth) {
this._bannerLabel.opacity = 0;
bannerFits = false;
} else {
let bannerBox = new Clutter.ActorBox();
if (rtl) {
bannerBox.x1 = 0;
bannerBox.x2 = titleBox.x1 - this._spacing;
bannerFits = (bannerBox.x2 - bannerNatW >= 0);
} else {
bannerBox.x1 = titleBox.x2 + this._spacing;
bannerBox.x2 = availWidth;
bannerFits = (bannerBox.x1 + bannerNatW <= availWidth);
}
bannerBox.y1 = 0;
bannerBox.y2 = titleNatH;
this._bannerLabel.allocate(bannerBox, flags);
// Make _bannerLabel visible if the entire notification
// fits on one line, or if the notification is currently
// unexpanded and only showing one line anyway.
if (!this.expanded || (bannerFits && this._table.row_count == 1))
this._bannerLabel.opacity = 255;
}
// If the banner doesn't fully fit in the banner box, we possibly need to add the
// banner to the body. We can't do that from here though since that will force a
// relayout, so we add it to the main loop.
if (!bannerFits && this._canExpandContent())
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
Lang.bind(this,
function() {
if (this._destroyed)
return false;
if (this._canExpandContent()) {
this._addBannerBody();
this._table.add_style_class_name('multi-line-notification');
this.updated();
}
return false;
}));
},
_canExpandContent: function() {
return (this.bannerBodyText && !this._bannerBodyAdded) ||
(!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification'));
},
playSound: function() {
if (this._soundPlayed)
return;
@@ -1017,71 +460,6 @@ const Notification = new Lang.Class({
}
},
updated: function() {
if (this.expanded)
this.expand(false);
},
expand: function(animate) {
this.expanded = true;
this.actor.remove_style_class_name('notification-unexpanded');
// Show additional content that we keep hidden in banner mode
if (this._actionArea)
this._actionArea.show();
if (this._scrollArea)
this._scrollArea.show();
// The banner is never shown when the title did not fit, so this
// can be an if-else statement.
if (!this._titleFitsInBannerMode) {
// Remove ellipsization from the title label and make it wrap so that
// we show the full title when the notification is expanded.
this._titleLabel.clutter_text.line_wrap = true;
this._titleLabel.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
} else if (this._table.row_count > 1 && this._bannerLabel.opacity != 0) {
// We always hide the banner if the notification has additional content.
//
// We don't need to wrap the banner that doesn't fit the way we wrap the
// title that doesn't fit because we won't have a notification with
// row_count=1 that has a banner that doesn't fully fit. We'll either add
// that banner to the content of the notification in _bannerBoxAllocate()
// or the notification will have custom content.
if (animate)
Tweener.addTween(this._bannerLabel,
{ opacity: 0,
time: ANIMATION_TIME,
transition: 'easeOutQuad' });
else
this._bannerLabel.opacity = 0;
}
this.emit('expanded');
},
collapseCompleted: function() {
if (this._destroyed)
return;
this.expanded = false;
// Hide additional content that we keep hidden in banner mode
if (this._actionArea)
this._actionArea.hide();
if (this._scrollArea)
this._scrollArea.hide();
// Make sure we don't line wrap the title, and ellipsize it instead.
this._titleLabel.clutter_text.line_wrap = false;
this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.END;
// Restore banner opacity in case the notification is shown in the
// banner mode again on update.
this._bannerLabel.opacity = 255;
// Restore height requisition
this.actor.add_style_class_name('notification-unexpanded');
},
// Allow customizing the banner UI:
// the default implementation defers the creation to
// the source (which will create a NotificationBanner),
@@ -1093,27 +471,14 @@ const Notification = new Lang.Class({
activate: function() {
this.emit('activated');
// We hide all types of notifications once the user clicks on them because the common
// outcome of clicking should be the relevant window being brought forward and the user's
// attention switching to the window.
this.emit('done-displaying');
if (!this.resident)
this.destroy();
},
_onDestroy: function() {
if (this._destroyed)
return;
this._destroyed = true;
if (!this._destroyedReason)
this._destroyedReason = NotificationDestroyedReason.DISMISSED;
this.emit('destroy', this._destroyedReason);
},
destroy: function(reason) {
this._destroyedReason = reason;
this.actor.destroy();
this.actor._delegate = null;
if (!reason)
reason = NotificationDestroyedReason.DISMISSED;
this.emit('destroy', reason);
}
});
Signals.addSignalMethods(Notification.prototype);
@@ -1125,8 +490,8 @@ const NotificationBanner = new Lang.Class({
_init: function(notification) {
this.parent(notification);
this.actor.can_focus = false;
this.actor.add_style_class_name('notification-banner');
this.actor.connect('destroy', Lang.bind(this, this._onDestroyed));
this._buttonBox = null;
@@ -1143,7 +508,8 @@ const NotificationBanner = new Lang.Class({
}));
},
_onDestroyed: function() {
_onDestroy: function() {
this.parent();
this.notification.disconnect(this._activatedId);
},
@@ -1370,10 +736,6 @@ const Source = new Lang.Class({
return this.count > 1;
},
get isClearable() {
return !this.isChat && !this.resident;
},
countUpdated: function() {
this.emit('count-updated');
},
@@ -1546,8 +908,6 @@ const MessageTray = new Lang.Class({
this._notificationTimeoutId = 0;
this._notificationRemoved = false;
this.clearableCount = 0;
Main.layoutManager.addChrome(this.actor, { affectsInputRegion: false });
Main.layoutManager.trackChrome(this._bannerBin, { affectsInputRegion: true });
@@ -1598,6 +958,14 @@ const MessageTray = new Lang.Class({
Shell.util_set_hidden_from_pick(this.actor, false);
},
get bannerAlignment() {
return this._bannerBin.get_x_align();
},
set bannerAlignment(align) {
this._bannerBin.set_x_align(align);
},
_onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification();
@@ -1648,9 +1016,6 @@ const MessageTray = new Lang.Class({
destroyId: 0,
};
if (source.isClearable)
this.clearableCount++;
this._sources.set(source, obj);
obj.notifyId = source.connect('notify', Lang.bind(this, this._onNotify));
@@ -1663,9 +1028,6 @@ const MessageTray = new Lang.Class({
let obj = this._sources.get(source);
this._sources.delete(source);
if (source.isClearable)
this.clearableCount--;
source.disconnect(obj.notifyId);
source.disconnect(obj.destroyId);
@@ -1937,11 +1299,7 @@ const MessageTray = new Lang.Class({
this.idleMonitor.add_user_active_watch(Lang.bind(this, this._onIdleMonitorBecameActive));
}
// HACK: didn't manage to get chat into a proper state in time
if (this._notification.source.isChat)
this._banner = this._notification;
else
this._banner = this._notification.createBanner();
this._banner = this._notification.createBanner();
this._bannerClickedId = this._banner.connect('done-displaying',
Lang.bind(this, this._escapeTray));
this._bannerUnfocusedId = this._banner.connect('unfocused', Lang.bind(this, function() {
@@ -2093,10 +1451,7 @@ const MessageTray = new Lang.Class({
this._pointerInNotification = false;
this._notificationRemoved = false;
if (notification.resident)
this._bannerBin.remove_actor(this._banner.actor);
else
this._banner.actor.destroy();
this._banner.actor.destroy();
this._banner = null;
this.actor.hide();
},

View File

@@ -23,7 +23,7 @@ const Tweener = imports.ui.tweener;
const OPEN_AND_CLOSE_TIME = 0.1;
const FADE_OUT_DIALOG_TIME = 1.0;
const WORK_SPINNER_ICON_SIZE = 24;
const WORK_SPINNER_ICON_SIZE = 16;
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
const WORK_SPINNER_ANIMATION_TIME = 0.3;

View File

@@ -15,8 +15,7 @@ const OsdMonitorLabel = new Lang.Class({
Name: 'OsdMonitorLabel',
_init: function(monitor, label) {
this._actor = new St.Widget({ opacity: 0,
x_expand: true,
this._actor = new St.Widget({ x_expand: true,
y_expand: true });
this._monitor = monitor;
@@ -34,10 +33,6 @@ const OsdMonitorLabel = new Lang.Class({
this._position();
Meta.disable_unredirect_for_screen(global.screen);
Tweener.addTween(this._actor,
{ opacity: 255,
time: FADE_TIME,
transition: 'easeOutQuad' });
},
_position: function() {
@@ -52,15 +47,8 @@ const OsdMonitorLabel = new Lang.Class({
},
destroy: function() {
Tweener.addTween(this._actor,
{ opacity: 0,
time: FADE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this._actor.destroy();
Meta.enable_unredirect_for_screen(global.screen);
})
});
this._actor.destroy();
Meta.enable_unredirect_for_screen(global.screen);
}
});

View File

@@ -107,13 +107,6 @@ const Overview = new Lang.Class({
this._overviewCreated = true;
// The main Background actors are inside global.window_group which are
// hidden when displaying the overview, so we create a new
// one. Instances of this class share a single CoglTexture behind the
// scenes which allows us to show the background with different
// rendering options without duplicating the texture data.
let monitor = Main.layoutManager.primaryMonitor;
let layout = new Clutter.BinLayout();
this._stack = new Clutter.Actor({ layout_manager: layout });
this._stack.add_constraint(new LayoutManager.MonitorConstraint({ primary: true }));
@@ -128,6 +121,11 @@ const Overview = new Lang.Class({
y_expand: true });
this._overview._delegate = this;
// The main Background actors are inside global.window_group which are
// hidden when displaying the overview, so we create a new
// one. Instances of this class share a single CoglTexture behind the
// scenes which allows us to show the background with different
// rendering options without duplicating the texture data.
this._backgroundGroup = new Meta.BackgroundGroup();
Main.layoutManager.overviewGroup.add_child(this._backgroundGroup);
this._bgManagers = [];

View File

@@ -25,12 +25,12 @@ const RemoteMenu = imports.ui.remoteMenu;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const PANEL_ICON_SIZE = 24;
const APP_MENU_ICON_MARGIN = 2;
const PANEL_ICON_SIZE = 16;
const APP_MENU_ICON_MARGIN = 0;
const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const SPINNER_ANIMATION_TIME = 0.2;
const SPINNER_ANIMATION_TIME = 1.0;
// To make sure the panel corners blend nicely with the panel,
// we draw background and borders the same way, e.g. drawing
@@ -752,7 +752,7 @@ const Panel = new Lang.Class({
}));
Main.layoutManager.panelBox.add(this.actor);
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'emblem-system-symbolic',
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'focus-top-bar-symbolic',
{ sortGroup: CtrlAltTab.SortGroup.TOP });
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
@@ -933,6 +933,14 @@ const Panel = new Lang.Class({
this._updateBox(panel.center, this._centerBox);
this._updateBox(panel.right, this._rightBox);
if (panel.left.indexOf('dateMenu') != -1)
Main.messageTray.bannerAlignment = Clutter.ActorAlign.START;
else if (panel.right.indexOf('dateMenu') != -1)
Main.messageTray.bannerAlignment = Clutter.ActorAlign.END;
// Default to center if there is no dateMenu
else
Main.messageTray.bannerAlignment = Clutter.ActorAlign.CENTER;
if (this._sessionStyle)
this._removeStyleClassName(this._sessionStyle);
@@ -995,6 +1003,7 @@ const Panel = new Lang.Class({
if (parent)
parent.remove_actor(container);
box.insert_child_at_index(container, position);
if (indicator.menu)
this.menuManager.addMenu(indicator.menu);
@@ -1004,6 +1013,8 @@ const Panel = new Lang.Class({
emitter.disconnect(destroyId);
container.destroy();
}));
indicator.connect('menu-set', Lang.bind(this, this._onMenuSet));
this._onMenuSet(indicator);
},
addToStatusArea: function(role, indicator, position, box) {
@@ -1035,5 +1046,24 @@ const Panel = new Lang.Class({
this.actor.remove_style_class_name(className);
this._rightCorner.actor.remove_style_class_name(className);
this._leftCorner.actor.remove_style_class_name(className);
},
_onMenuSet: function(indicator) {
if (!indicator.menu || indicator.menu._openChangedId > 0)
return;
indicator.menu._openChangedId = indicator.menu.connect('open-state-changed',
Lang.bind(this, function(menu, isOpen) {
let boxAlignment;
if (this._leftBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.START;
else if (this._centerBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.CENTER;
else if (this._rightBox.contains(indicator.container))
boxAlignment = Clutter.ActorAlign.END;
if (boxAlignment == Main.messageTray.bannerAlignment)
Main.messageTray.bannerBlocked = isOpen;
}));
}
});

View File

@@ -128,6 +128,7 @@ const Button = new Lang.Class({
Main.uiGroup.add_actor(this.menu.actor);
this.menu.actor.hide();
}
this.emit('menu-set');
},
_onEvent: function(actor, event) {

View File

@@ -12,7 +12,6 @@ const BoxPointer = imports.ui.boxpointer;
const GrabHelper = imports.ui.grabHelper;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Separator = imports.ui.separator;
const Tweener = imports.ui.tweener;
const Ornament = {
@@ -170,10 +169,10 @@ const PopupBaseMenuItem = new Lang.Class({
if (activeChanged) {
this.active = active;
if (active) {
this.actor.add_style_class_name('active');
this.actor.add_style_class_name('selected');
this.actor.grab_key_focus();
} else {
this.actor.remove_style_class_name('active');
this.actor.remove_style_class_name('selected');
// Remove the CSS active state if the user press the button and
// while holding moves to another menu item, so we don't paint all items.
// The correct behaviour would be to set the new item with the CSS
@@ -264,7 +263,9 @@ const PopupSeparatorMenuItem = new Lang.Class({
Lang.bind(this, this._syncVisibility));
this._syncVisibility();
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item' });
this._separator = new St.Widget({ style_class: 'popup-separator-menu-item',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this.actor.add(this._separator, { expand: true });
},

View File

@@ -63,7 +63,7 @@ const SearchProvider2Iface = '<node> \
var SearchProviderProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProviderIface);
var SearchProvider2ProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProvider2Iface);
function loadRemoteSearchProviders(callback) {
function loadRemoteSearchProviders(searchSettings, callback) {
let objectPaths = {};
let loadedProviders = [];
@@ -124,7 +124,6 @@ function loadRemoteSearchProviders(callback) {
}
}
let searchSettings = new Gio.Settings({ schema_id: Search.SEARCH_PROVIDERS_SCHEMA });
if (searchSettings.get_boolean('disable-external')) {
callback([]);
return;
@@ -236,8 +235,10 @@ const RemoteSearchProvider = new Lang.Class({
_getResultsFinished: function(results, error, callback) {
if (error) {
if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
if (error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
return;
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
callback([]);
return;
}

View File

@@ -507,21 +507,22 @@ const ScreenShield = new Lang.Class({
this._liftShield(true, 0);
}));
this._inhibitor = null;
this._aboutToSuspend = false;
this._loginManager = LoginManager.getLoginManager();
this._loginManager.connect('prepare-for-sleep',
Lang.bind(this, this._prepareForSleep));
this._inhibitSuspend();
this._loginSession = null;
this._loginManager.getCurrentSessionProxy(Lang.bind(this,
function(sessionProxy) {
this._loginSession = sessionProxy;
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
this._loginSession.connect('g-properties-changed', Lang.bind(this, this._syncInhibitor));
this._syncInhibitor();
}));
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
this._settings.connect('changed::' + LOCK_ENABLED_KEY, Lang.bind(this, this._syncInhibitor));
this._isModal = false;
this._hasLockScreen = false;
@@ -547,6 +548,18 @@ const ScreenShield = new Lang.Class({
this.idleMonitor = Meta.IdleMonitor.get_core();
this._cursorTracker = Meta.CursorTracker.get_for_screen(global.screen);
this._syncInhibitor();
},
_setActive: function(active) {
let prevIsActive = this._isActive;
this._isActive = active;
if (prevIsActive != this._isActive)
this.emit('active-changed');
this._syncInhibitor();
},
_createBackground: function(monitorIndex) {
@@ -664,31 +677,28 @@ const ScreenShield = new Lang.Class({
return Clutter.EVENT_STOP;
},
_inhibitSuspend: function() {
this._loginManager.inhibit(_("GNOME needs to lock the screen"),
Lang.bind(this, function(inhibitor) {
this._inhibitor = inhibitor;
}));
},
_uninhibitSuspend: function() {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = null;
_syncInhibitor: function() {
let inhibit = (this._loginSession && this._loginSession.Active &&
!this._isActive && this._settings.get_boolean(LOCK_ENABLED_KEY));
if (inhibit) {
this._loginManager.inhibit(_("GNOME needs to lock the screen"),
Lang.bind(this, function(inhibitor) {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = inhibitor;
}));
} else {
if (this._inhibitor)
this._inhibitor.close(null);
this._inhibitor = null;
}
},
_prepareForSleep: function(loginManager, aboutToSuspend) {
this._aboutToSuspend = aboutToSuspend;
if (aboutToSuspend) {
if (!this._settings.get_boolean(LOCK_ENABLED_KEY)) {
this._uninhibitSuspend();
return;
}
this.lock(true);
if (this._settings.get_boolean(LOCK_ENABLED_KEY))
this.lock(true);
} else {
this._inhibitSuspend();
this._wakeUpScreen();
}
},
@@ -1083,15 +1093,7 @@ const ScreenShield = new Lang.Class({
},
_completeLockScreenShown: function() {
let prevIsActive = this._isActive;
this._isActive = true;
if (prevIsActive != this._isActive)
this.emit('active-changed');
if (this._aboutToSuspend)
this._uninhibitSuspend();
this._setActive(true);
this.emit('lock-screen-shown');
},
@@ -1185,8 +1187,7 @@ const ScreenShield = new Lang.Class({
// gnome-settings-daemon will stop blanking the screen
this._activationTime = 0;
this._isActive = false;
this.emit('active-changed');
this._setActive(false);
return;
}
@@ -1229,9 +1230,8 @@ const ScreenShield = new Lang.Class({
}
this._activationTime = 0;
this._isActive = false;
this._setActive(false);
this._isLocked = false;
this.emit('active-changed');
this.emit('locked-changed');
global.set_runtime_state(LOCKED_STATE_STR, null);
},

View File

@@ -283,8 +283,8 @@ const SelectArea = new Lang.Class({
_getGeometry: function() {
return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY),
width: Math.abs(this._startX - this._lastX),
height: Math.abs(this._startY - this._lastY) };
width: Math.abs(this._startX - this._lastX) + 1,
height: Math.abs(this._startY - this._lastY) + 1 };
},
_onMotionEvent: function(actor, event) {
@@ -292,6 +292,8 @@ const SelectArea = new Lang.Class({
return Clutter.EVENT_PROPAGATE;
[this._lastX, this._lastY] = event.get_coords();
this._lastX = Math.floor(this._lastX);
this._lastY = Math.floor(this._lastY);
let geometry = this._getGeometry();
this._rubberband.set_position(geometry.x, geometry.y);
@@ -302,6 +304,8 @@ const SelectArea = new Lang.Class({
_onButtonPress: function(actor, event) {
[this._startX, this._startY] = event.get_coords();
this._startX = Math.floor(this._startX);
this._startY = Math.floor(this._startY);
this._rubberband.set_position(this._startX, this._startY);
return Clutter.EVENT_PROPAGATE;

View File

@@ -205,6 +205,13 @@ const SearchResultsBase = new Lang.Class({
callback(false);
return;
}
if (metas.some(function(meta) {
return !meta.name || !meta.id;
})) {
log('Invalid result meta returned from search provider ' + this.provider.id);
callback(false);
return;
}
metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
let meta = metas[i];
@@ -409,6 +416,7 @@ const SearchResults = new Lang.Class({
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::enabled', 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));
@@ -427,7 +435,7 @@ const SearchResults = new Lang.Class({
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
RemoteSearch.loadRemoteSearchProviders(this._searchSettings, Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
},

View File

@@ -49,9 +49,9 @@ function _setButtonsForChoices(dialog, choices) {
function _setLabelsForMessage(dialog, message) {
let labels = message.split('\n');
_setLabelText(dialog.subjectLabel, labels[0]);
if (labels.length > 1)
_setLabelText(dialog.descriptionLabel, labels[1]);
_setLabelText(dialog.subjectLabel, labels.shift());
if (labels.length > 0)
_setLabelText(dialog.descriptionLabel, labels.join('\n'));
}
function _createIcon(gicon) {
@@ -347,7 +347,7 @@ const ShellMountPasswordDialog = new Lang.Class({
mainContentBox.add(this._messageBox,
{ y_align: St.Align.START, expand: true, x_fill: true, y_fill: true });
let subject = new St.Label({ style_class: 'prompt-dialog-headline' });
let subject = new St.Label({ style_class: 'prompt-dialog-headline headline' });
this._messageBox.add(subject,
{ y_fill: false,
y_align: St.Align.START });

View File

@@ -119,23 +119,46 @@ const ATIndicator = new Lang.Class({
_buildItem: function(string, schema, key) {
let settings = new Gio.Settings({ schema_id: schema });
settings.connect('changed::'+key, Lang.bind(this, function() {
widget.setToggleState(settings.get_boolean(key));
this._queueSyncMenuVisibility();
}));
let widget = this._buildItemExtended(string,
settings.get_boolean(key),
settings.is_writable(key),
function(enabled) {
return settings.set_boolean(key, enabled);
});
settings.connect('changed::'+key, Lang.bind(this, function() {
widget.setToggleState(settings.get_boolean(key));
this._queueSyncMenuVisibility();
}));
return widget;
},
_buildHCItem: function() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
let wmSettings = new Gio.Settings({ schema_id: WM_SCHEMA });
interfaceSettings.connect('changed::' + KEY_GTK_THEME, Lang.bind(this, function() {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
}));
interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
let value = wmSettings.get_string(KEY_WM_THEME);
if (value != HIGH_CONTRAST_THEME)
wmTheme = value;
});
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
@@ -161,32 +184,18 @@ const ATIndicator = new Lang.Class({
wmSettings.reset(KEY_WM_THEME);
}
});
interfaceSettings.connect('changed::' + KEY_GTK_THEME, Lang.bind(this, function() {
let value = interfaceSettings.get_string(KEY_GTK_THEME);
if (value == HIGH_CONTRAST_THEME) {
highContrast.setToggleState(true);
} else {
highContrast.setToggleState(false);
gtkTheme = value;
}
this._queueSyncMenuVisibility();
}));
interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
let value = interfaceSettings.get_string(KEY_ICON_THEME);
if (value != HIGH_CONTRAST_THEME)
iconTheme = value;
});
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
let value = wmSettings.get_string(KEY_WM_THEME);
if (value != HIGH_CONTRAST_THEME)
wmTheme = value;
});
return highContrast;
},
_buildFontItem: function() {
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, Lang.bind(this, function() {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
}));
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let initial_setting = (factor > 1.0);
@@ -200,13 +209,6 @@ const ATIndicator = new Lang.Class({
else
settings.reset(KEY_TEXT_SCALING_FACTOR);
});
settings.connect('changed::' + KEY_TEXT_SCALING_FACTOR, Lang.bind(this, function() {
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let active = (factor > 1.0);
widget.setToggleState(active);
this._queueSyncMenuVisibility();
}));
return widget;
}
});

View File

@@ -2,6 +2,7 @@
const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
@@ -18,10 +19,6 @@ const PanelMenu = imports.ui.panelMenu;
const SwitcherPopup = imports.ui.switcherPopup;
const Util = imports.misc.util;
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
const KEY_INPUT_SOURCES = 'sources';
const KEY_KEYBOARD_OPTIONS = 'xkb-options';
const INPUT_SOURCE_TYPE_XKB = 'xkb';
const INPUT_SOURCE_TYPE_IBUS = 'ibus';
@@ -142,6 +139,149 @@ const InputSourceSwitcher = new Lang.Class({
}
});
const InputSourceSettings = new Lang.Class({
Name: 'InputSourceSettings',
Abstract: true,
_emitInputSourcesChanged: function() {
this.emit('input-sources-changed');
},
_emitKeyboardOptionsChanged: function() {
this.emit('keyboard-options-changed');
},
_emitPerWindowChanged: function() {
this.emit('per-window-changed');
},
get inputSources() {
return [];
},
get keyboardOptions() {
return [];
},
get perWindow() {
return false;
}
});
Signals.addSignalMethods(InputSourceSettings.prototype);
const InputSourceSystemSettings = new Lang.Class({
Name: 'InputSourceSystemSettings',
Extends: InputSourceSettings,
_BUS_NAME: 'org.freedesktop.locale1',
_BUS_PATH: '/org/freedesktop/locale1',
_BUS_IFACE: 'org.freedesktop.locale1',
_BUS_PROPS_IFACE: 'org.freedesktop.DBus.Properties',
_init: function() {
this._layouts = '';
this._variants = '';
this._options = '';
this._reload();
Gio.DBus.system.signal_subscribe(this._BUS_NAME,
this._BUS_PROPS_IFACE,
'PropertiesChanged',
this._BUS_PATH,
null,
Gio.DBusSignalFlags.NONE,
Lang.bind(this, this._reload));
},
_reload: function() {
Gio.DBus.system.call(this._BUS_NAME,
this._BUS_PATH,
this._BUS_PROPS_IFACE,
'GetAll',
new GLib.Variant('(s)', [this._BUS_IFACE]),
null, Gio.DBusCallFlags.NONE, -1, null,
Lang.bind(this, function(conn, result) {
let props;
try {
props = conn.call_finish(result).deep_unpack()[0];
} catch(e) {
log('Could not get properties from ' + this._BUS_NAME);
return;
}
let layouts = props['X11Layout'].unpack();
let variants = props['X11Variant'].unpack();
let options = props['X11Options'].unpack();
if (layouts != this._layouts ||
variants != this._variants) {
this._layouts = layouts;
this._variants = variants;
this._emitInputSourcesChanged();
}
if (options != this._options) {
this._options = options;
this._emitKeyboardOptionsChanged();
}
}));
},
get inputSources() {
let sourcesList = [];
let layouts = this._layouts.split(',');
let variants = this._variants.split(',');
for (let i = 0; i < layouts.length && !!layouts[i]; i++) {
let id = layouts[i];
if (!!variants[i])
id += '+' + variants[i];
sourcesList.push({ type: INPUT_SOURCE_TYPE_XKB, id: id });
}
return sourcesList;
},
get keyboardOptions() {
return this._options.split(',');
}
});
const InputSourceSessionSettings = new Lang.Class({
Name: 'InputSourceSessionSettings',
Extends: InputSourceSettings,
_DESKTOP_INPUT_SOURCES_SCHEMA: 'org.gnome.desktop.input-sources',
_KEY_INPUT_SOURCES: 'sources',
_KEY_KEYBOARD_OPTIONS: 'xkb-options',
_KEY_PER_WINDOW: 'per-window',
_init: function() {
this._settings = new Gio.Settings({ schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + this._KEY_INPUT_SOURCES, Lang.bind(this, this._emitInputSourcesChanged));
this._settings.connect('changed::' + this._KEY_KEYBOARD_OPTIONS, Lang.bind(this, this._emitKeyboardOptionsChanged));
this._settings.connect('changed::' + this._KEY_PER_WINDOW, Lang.bind(this, this._emitPerWindowChanged));
},
get inputSources() {
let sourcesList = [];
let sources = this._settings.get_value(this._KEY_INPUT_SOURCES);
let nSources = sources.n_children();
for (let i = 0; i < nSources; i++) {
let [type, id] = sources.get_child_value(i).deep_unpack();
sourcesList.push({ type: type, id: id });
}
return sourcesList;
},
get keyboardOptions() {
return this._settings.get_strv(this._KEY_KEYBOARD_OPTIONS);
},
get perWindow() {
return this._settings.get_boolean(this._KEY_PER_WINDOW);
}
});
const InputSourceManager = new Lang.Class({
Name: 'InputSourceManager',
@@ -155,11 +295,11 @@ const InputSourceManager = new Lang.Class({
this._ibusSources = {};
this._currentSource = null;
this._backupSource = null;
// All valid input sources currently in the gsettings
// KEY_INPUT_SOURCES list ordered by most recently used
this._mruSources = [];
this._mruSourcesBackup = null;
this._keybindingAction =
Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
@@ -172,9 +312,12 @@ const InputSourceManager = new Lang.Class({
Meta.KeyBindingFlags.IS_REVERSED,
Shell.ActionMode.ALL,
Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema_id: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
this._settings.connect('changed::' + KEY_KEYBOARD_OPTIONS, Lang.bind(this, this._keyboardOptionsChanged));
if (Main.sessionMode.isGreeter)
this._settings = new InputSourceSystemSettings();
else
this._settings = new InputSourceSessionSettings();
this._settings.connect('input-sources-changed', Lang.bind(this, this._inputSourcesChanged));
this._settings.connect('keyboard-options-changed', Lang.bind(this, this._keyboardOptionsChanged));
this._xkbInfo = KeyboardManager.getXkbInfo();
this._keyboardManager = KeyboardManager.getKeyboardManager();
@@ -192,13 +335,13 @@ const InputSourceManager = new Lang.Class({
this._focusWindowNotifyId = 0;
this._overviewShowingId = 0;
this._overviewHiddenId = 0;
this._settings.connect('changed::per-window', Lang.bind(this, this._sourcesPerWindowChanged));
this._settings.connect('per-window-changed', Lang.bind(this, this._sourcesPerWindowChanged));
this._sourcesPerWindowChanged();
this._disableIBus = false;
},
reload: function() {
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
this._inputSourcesChanged();
},
@@ -253,7 +396,7 @@ const InputSourceManager = new Lang.Class({
},
_keyboardOptionsChanged: function() {
this._keyboardManager.setKeyboardOptions(this._settings.get_strv(KEY_KEYBOARD_OPTIONS));
this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
this._keyboardManager.reapply();
},
@@ -294,8 +437,8 @@ const InputSourceManager = new Lang.Class({
},
_inputSourcesChanged: function() {
let sources = this._settings.get_value(KEY_INPUT_SOURCES);
let nSources = sources.n_children();
let sources = this._settings.inputSources;
let nSources = sources.length;
this._inputSources = {};
this._ibusSources = {};
@@ -304,7 +447,8 @@ const InputSourceManager = new Lang.Class({
for (let i = 0; i < nSources; i++) {
let displayName;
let shortName;
let [type, id] = sources.get_child_value(i).deep_unpack();
let type = sources[i].type;
let id = sources[i].id;
let exists = false;
if (type == INPUT_SOURCE_TYPE_XKB) {
@@ -372,6 +516,11 @@ const InputSourceManager = new Lang.Class({
this._keyboardManager.setUserLayouts(sourcesList.map(function(x) { return x.xkbId; }));
if (!this._disableIBus && this._mruSourcesBackup) {
this._mruSources = this._mruSourcesBackup;
this._mruSourcesBackup = null;
}
let mruSources = [];
for (let i = 0; i < this._mruSources.length; i++) {
for (let j = 0; j < sourcesList.length; j++)
@@ -383,20 +532,8 @@ const InputSourceManager = new Lang.Class({
}
this._mruSources = mruSources.concat(sourcesList);
if (this._mruSources.length > 0) {
if (!this._disableIBus && this._backupSource) {
for (let i = 0; i < this._mruSources.length; i++) {
if (this._mruSources[i].type == this._backupSource.type &&
this._mruSources[i].id == this._backupSource.id) {
let currentSource = this._mruSources.splice(i, 1);
this._mruSources = currentSource.concat(this._mruSources);
break;
}
}
this._backupSource = null;
}
if (this._mruSources.length > 0)
this._mruSources[0].activate();
}
// All ibus engines are preloaded here to reduce the launching time
// when users switch the input sources.
@@ -461,27 +598,30 @@ const InputSourceManager = new Lang.Class({
if (this._disableIBus)
return;
this._disableIBus = true;
this._backupSource = this._currentSource;
this._mruSourcesBackup = this._mruSources.slice();
} else {
if (!this._disableIBus)
return;
this._disableIBus = false;
}
// If this._mruSources is not cleared before this.reload() is called,
// the order is different from the original one as IM sources will
// be appended to XKB sources.
this._mruSources = [];
this.reload();
},
_getNewInputSource: function(current) {
for (let i in this._inputSources) {
let is = this._inputSources[i];
if (is.type == current.type &&
is.id == current.id)
return is;
let sourceIndexes = Object.keys(this._inputSources);
if (sourceIndexes.length == 0)
return null;
if (current) {
for (let i in this._inputSources) {
let is = this._inputSources[i];
if (is.type == current.type &&
is.id == current.id)
return is;
}
}
return this._currentSource;
return this._inputSources[sourceIndexes[0]];
},
_getCurrentWindow: function() {
@@ -496,20 +636,17 @@ const InputSourceManager = new Lang.Class({
if (!window)
return;
if (!window._inputSources) {
window._inputSources = this._inputSources;
window._currentSource = this._currentSource;
} else if (window._inputSources == this._inputSources) {
window._currentSource.activate();
} else {
if (window._inputSources != this._inputSources) {
window._inputSources = this._inputSources;
window._currentSource = this._getNewInputSource(window._currentSource);
window._currentSource.activate();
}
if (window._currentSource)
window._currentSource.activate();
},
_sourcesPerWindowChanged: function() {
this._sourcesPerWindow = this._settings.get_boolean('per-window');
this._sourcesPerWindow = this._settings.perWindow;
if (this._sourcesPerWindow && this._focusWindowNotifyId == 0) {
this._focusWindowNotifyId = global.display.connect('notify::focus-window',

View File

@@ -877,7 +877,7 @@ const NMWirelessDialog = new Lang.Class({
y_align: Clutter.ActorAlign.CENTER });
let file = Gio.File.new_for_uri('resource:///org/gnome/shell/theme/process-working.svg');
this._noNetworksSpinner = new Animation.AnimatedIcon(file, 24, 24);
this._noNetworksSpinner = new Animation.AnimatedIcon(file, 16, 16);
this._noNetworksBox.add_actor(this._noNetworksSpinner.actor);
this._noNetworksBox.add_actor(new St.Label({ style_class: 'no-networks-label',
text: _("No Networks") }));
@@ -917,10 +917,7 @@ const NMWirelessDialog = new Lang.Class({
key: Clutter.Escape });
this._connectButton = this.addButton({ action: Lang.bind(this, this._connect),
label: _("Connect"),
key: Clutter.Return },
{ expand: true,
x_fill: false,
x_align: St.Align.END });
key: Clutter.Return });
},
_connect: function() {

View File

@@ -17,15 +17,24 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const DISABLE_RESTART_KEY = 'disable-restart-buttons';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const SENSOR_BUS_NAME = 'net.hadess.SensorProxy';
const SENSOR_OBJECT_PATH = '/net/hadess/SensorProxy';
const SensorProxyInterface = '<node> \
<interface name="net.hadess.SensorProxy"> \
<property name="HasAccelerometer" type="b" access="read"/> \
</interface> \
</node>';
const SensorProxy = Gio.DBusProxy.makeProxyWrapper(SensorProxyInterface);
const AltSwitcher = new Lang.Class({
Name: 'AltSwitcher',
@@ -95,10 +104,8 @@ const Indicator = new Lang.Class({
_init: function() {
this.parent();
this._screenSaverSettings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
this._privacySettings = new Gio.Settings({ schema_id: PRIVACY_SCHEMA });
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' });
this._session = new GnomeSession.SessionManager();
@@ -129,6 +136,7 @@ const Indicator = new Lang.Class({
Lang.bind(this, this._updateMultiUser));
this._updateSwitchUser();
this._updateMultiUser();
this._updateLockScreen();
// Whether shutdown is available or not depends on both lockdown
// settings (disable-log-out) and Polkit policy - the latter doesn't
@@ -147,23 +155,32 @@ const Indicator = new Lang.Class({
this._orientationSettings.connect('changed::orientation-lock',
Lang.bind(this, this._updateOrientationLock));
this._orientationExists = false;
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
Gio.BusNameWatcherFlags.NONE,
Lang.bind(this, function() {
this._orientationExists = true;
this._updateOrientationLock();
}),
Lang.bind(this, function() {
this._orientationExists = false;
this._updateOrientationLock();
}));
Gio.DBus.system.watch_name(SENSOR_BUS_NAME,
Gio.BusNameWatcherFlags.NONE,
Lang.bind(this, this._sensorProxyAppeared),
Lang.bind(this, function() {
this._sensorProxy = null;
this._updateOrientationLock();
}));
this._updateOrientationLock();
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
},
_sensorProxyAppeared: function() {
this._sensorProxy = new SensorProxy(Gio.DBus.system, SENSOR_BUS_NAME, SENSOR_OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
this._sensorProxy.connect('g-properties-changed',
Lang.bind(this, this._updateOrientationLock));
this._updateOrientationLock();
}));
},
_updateActionsVisibility: function() {
let visible = (this._settingsAction.visible ||
this._orientationLockAction.visible ||
@@ -240,7 +257,10 @@ const Indicator = new Lang.Class({
},
_updateOrientationLock: function() {
this._orientationLockAction.visible = this._orientationExists;
if (this._sensorProxy)
this._orientationLockAction.visible = this._sensorProxy.HasAccelerometer;
else
this._orientationLockAction.visible = false;
let locked = this._orientationSettings.get_boolean('orientation-lock');
let icon = this._orientationLockAction.child;

View File

@@ -6,6 +6,7 @@ const Clutter = imports.gi.Clutter;
const AccountsService = imports.gi.AccountsService;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const St = imports.gi.St;
@@ -117,6 +118,7 @@ const UserWidgetLabel = new Lang.Class({
this._currentLabel = this._realNameLabel;
else
this._currentLabel = this._userNameLabel;
this.label_actor = this._currentLabel;
let childBox = new Clutter.ActorBox();
childBox.x1 = 0;
@@ -158,6 +160,9 @@ const UserWidget = new Lang.Class({
this._label = new UserWidgetLabel(user);
this.actor.add_child(this._label);
this._label.bind_property('label-actor', this.actor, 'label-actor',
GObject.BindingFlags.SYNC_CREATE);
this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
this._updateUser();

View File

@@ -152,7 +152,7 @@ const ViewSelector = new Lang.Class({
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this._workspacesPage = this._addPage(this._workspacesDisplay.actor,
_("Windows"), 'emblem-documents-symbolic');
_("Windows"), 'focus-windows-symbolic');
this.appDisplay = new AppDisplay.AppDisplay();
this._appsPage = this._addPage(this.appDisplay.actor,
@@ -214,10 +214,13 @@ const ViewSelector = new Lang.Class({
Shell.ActionMode.OVERVIEW,
Lang.bind(Main.overview, Main.overview.toggle));
let gesture;
gesture = new EdgeDragAction.EdgeDragAction(St.Side.LEFT,
Shell.ActionMode.NORMAL);
let side;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
side = St.Side.RIGHT;
else
side = St.Side.LEFT;
let gesture = new EdgeDragAction.EdgeDragAction(side,
Shell.ActionMode.NORMAL);
gesture.connect('activated', Lang.bind(this, function() {
if (Main.overview.visible)
Main.overview.hide();

View File

@@ -11,7 +11,8 @@ const WindowAttentionHandler = new Lang.Class({
_init : function() {
this._tracker = Shell.WindowTracker.get_default();
global.display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention));
this._windowDemandsAttentionId = global.display.connect('window-demands-attention',
Lang.bind(this, this._onWindowDemandsAttention));
},
_getTitleAndBanner: function(app, window) {

View File

@@ -19,8 +19,6 @@ const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const MAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
const UNMAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
const MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
const SHOW_WINDOW_ANIMATION_TIME = 0.15;
const DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
@@ -83,12 +81,10 @@ const DisplayChangeDialog = new Lang.Class({
*/
this._cancelButton = this.addButton({ label: _("Revert Settings"),
action: Lang.bind(this, this._onFailure),
key: Clutter.Escape },
{ expand: true, x_fill: false, x_align: St.Align.START });
key: Clutter.Escape });
this._okButton = this.addButton({ label: _("Keep Changes"),
action: Lang.bind(this, this._onSuccess),
default: true },
{ expand: false, x_fill: false, x_align: St.Align.END });
default: true });
this._timeoutId = Mainloop.timeout_add(ONE_SECOND, Lang.bind(this, this._tick));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._tick');
@@ -197,6 +193,8 @@ const WorkspaceTracker = new Lang.Class({
this._workspaces = [];
this._checkWorkspacesId = 0;
this._pauseWorkspaceCheck = false;
let tracker = Shell.WindowTracker.get_default();
tracker.connect('startup-sequence-changed', Lang.bind(this, this._queueCheckWorkspaces));
@@ -215,11 +213,20 @@ const WorkspaceTracker = new Lang.Class({
_getWorkspaceSettings: function() {
let settings = global.get_overrides_settings();
if (settings.list_keys().indexOf('dynamic-workspaces') > -1)
if (settings &&
settings.settings_schema.list_keys().indexOf('dynamic-workspaces') > -1)
return settings;
return new Gio.Settings({ schema_id: 'org.gnome.mutter' });
},
blockUpdates: function() {
this._pauseWorkspaceCheck = true;
},
unblockUpdates: function() {
this._pauseWorkspaceCheck = false;
},
_checkWorkspaces: function() {
let i;
let emptyWorkspaces = [];
@@ -229,6 +236,10 @@ const WorkspaceTracker = new Lang.Class({
return false;
}
// Update workspaces only if Dynamic Workspace Management has not been paused by some other function
if (this._pauseWorkspaceCheck)
return true;
for (i = 0; i < this._workspaces.length; i++) {
let lastRemoved = this._workspaces[i]._lastRemovedWindow;
if ((lastRemoved &&
@@ -464,52 +475,100 @@ const TilePreview = new Lang.Class({
}
});
const TouchpadWorkspaceSwitchAction = new Lang.Class({
Name: 'TouchpadWorkspaceSwitchAction',
_init: function(actor) {
this._dx = 0;
this._dy = 0;
actor.connect('captured-event', Lang.bind(this, this._handleEvent));
},
_checkActivated: function() {
const MOTION_THRESHOLD = 50;
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
let dir;
if ((allowedModes & Main.actionMode) == 0)
return;
if (this._dy < -MOTION_THRESHOLD)
dir = Meta.MotionDirection.DOWN;
else if (this._dy > MOTION_THRESHOLD)
dir = Meta.MotionDirection.UP;
else if (this._dx < -MOTION_THRESHOLD)
dir = Meta.MotionDirection.RIGHT;
else if (this._dx > MOTION_THRESHOLD)
dir = Meta.MotionDirection.LEFT;
else
return;
this.emit('activated', dir);
},
_handleEvent: function(actor, event) {
if (event.type() != Clutter.EventType.TOUCHPAD_SWIPE)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_swipe_finger_count() != 4)
return Clutter.EVENT_PROPAGATE;
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.UPDATE) {
let [dx, dy] = event.get_gesture_motion_delta(event);
this._dx += dx;
this._dy += dy;
} else {
if (event.get_gesture_phase() == Clutter.TouchpadGesturePhase.END)
this._checkActivated();
this._dx = 0;
this._dy = 0;
}
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(TouchpadWorkspaceSwitchAction.prototype);
const WorkspaceSwitchAction = new Lang.Class({
Name: 'WorkspaceSwitchAction',
Extends: Clutter.GestureAction,
Extends: Clutter.SwipeAction,
_init : function() {
const MOTION_THRESHOLD = 50;
this.parent();
this.set_n_touch_points(4);
this.set_threshold_trigger_distance(MOTION_THRESHOLD, MOTION_THRESHOLD);
global.display.connect('grab-op-begin', Lang.bind(this, function() {
this.cancel();
}));
},
vfunc_gesture_prepare : function(action, actor) {
vfunc_gesture_prepare : function(actor) {
let allowedModes = Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW;
return this.get_n_current_points() == this.get_n_touch_points() &&
(allowedModes & Main.actionMode);
if (!this.parent(actor))
return false;
return (allowedModes & Main.actionMode);
},
vfunc_gesture_end : function(action, actor) {
const MOTION_THRESHOLD = 50;
vfunc_swept : function(actor, direction) {
let dir;
// Just check one touchpoint here
let [startX, startY] = this.get_press_coords(0);
let [x, y] = this.get_motion_coords(0);
let offsetX = x - startX;
let offsetY = y - startY;
let direction;
if (direction & Clutter.SwipeDirection.UP)
dir = Meta.MotionDirection.DOWN;
else if (direction & Clutter.SwipeDirection.DOWN)
dir = Meta.MotionDirection.UP;
else if (direction & Clutter.SwipeDirection.LEFT)
dir = Meta.MotionDirection.RIGHT;
else if (direction & Clutter.SwipeDirection.RIGHT)
dir = Meta.MotionDirection.LEFT;
if (Math.abs(offsetX) < MOTION_THRESHOLD &&
Math.abs(offsetY) < MOTION_THRESHOLD)
return;
if (Math.abs(offsetY) > Math.abs(offsetX)) {
if (offsetY > 0)
direction = Meta.MotionDirection.UP;
else
direction = Meta.MotionDirection.DOWN;
} else {
if (offsetX > 0)
direction = Meta.MotionDirection.LEFT;
else
direction = Meta.MotionDirection.RIGHT;
}
this.emit('activated', direction);
this.emit('activated', dir);
}
});
Signals.addSignalMethods(WorkspaceSwitchAction.prototype);
@@ -617,8 +676,6 @@ const WindowManager = new Lang.Class({
this._minimizing = [];
this._unminimizing = [];
this._maximizing = [];
this._unmaximizing = [];
this._mapping = [];
this._destroying = [];
this._movingWindow = null;
@@ -627,12 +684,12 @@ const WindowManager = new Lang.Class({
this._allowedKeybindings = {};
this._isWorkspacePrepended = false;
this._switchData = null;
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
this._minimizeWindowDone(shellwm, actor);
this._maximizeWindowDone(shellwm, actor);
this._unmaximizeWindowDone(shellwm, actor);
this._mapWindowDone(shellwm, actor);
this._destroyWindowDone(shellwm, actor);
}));
@@ -643,8 +700,7 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('show-window-menu', Lang.bind(this, this._showWindowMenu));
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
this._shellwm.connect('unminimize', Lang.bind(this, this._unminimizeWindow));
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
this._shellwm.connect('size-change', Lang.bind(this, this._sizeChangeWindow));
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
@@ -840,6 +896,7 @@ const WindowManager = new Lang.Class({
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.ActionMode.NORMAL |
Shell.ActionMode.OVERVIEW |
Shell.ActionMode.POPUP,
Lang.bind(this, this._toggleCalendar));
@@ -863,15 +920,22 @@ const WindowManager = new Lang.Class({
false, -1, 1);
let gesture = new WorkspaceSwitchAction();
gesture.connect('activated', Lang.bind(this, function(action, direction) {
let newWs = global.screen.get_active_workspace().get_neighbor(direction);
this.actionMoveWorkspace(newWs);
}));
gesture.connect('activated', Lang.bind(this, this._actionSwitchWorkspace));
global.stage.add_action(gesture);
// This is not a normal Clutter.GestureAction, doesn't need add_action()
gesture = new TouchpadWorkspaceSwitchAction(global.stage);
gesture.connect('activated', Lang.bind(this, this._actionSwitchWorkspace));
gesture = new AppSwitchAction();
gesture.connect('activated', Lang.bind(this, this._switchApp));
global.stage.add_action(gesture);
},
_actionSwitchWorkspace: function(action, direction) {
let newWs = global.screen.get_active_workspace().get_neighbor(direction);
this.actionMoveWorkspace(newWs);
},
_lookupIndex: function (windows, metaWindow) {
@@ -914,6 +978,8 @@ const WindowManager = new Lang.Class({
if (!Meta.prefs_get_dynamic_workspaces())
return;
global.screen.append_new_workspace(false, global.get_current_time());
let windows = global.get_window_actors().map(function(winActor) {
return winActor.meta_window;
});
@@ -1151,22 +1217,8 @@ const WindowManager = new Lang.Class({
}
},
_maximizeWindow : function(shellwm, actor, targetX, targetY, targetWidth, targetHeight) {
shellwm.completed_maximize(actor);
},
_maximizeWindowDone : function(shellwm, actor) {
},
_maximizeWindowOverwrite : function(shellwm, actor) {
},
_unmaximizeWindow : function(shellwm, actor, targetX, targetY, targetWidth, targetHeight) {
shellwm.completed_unmaximize(actor);
},
_unmaximizeWindowDone : function(shellwm, actor) {
_sizeChangeWindow : function(shellwm, actor, whichChange, oldFrameRect, oldBufferRect) {
shellwm.completed_size_change(actor);
},
_hasAttachedDialogs: function(window, ignoreWindow) {
@@ -1625,14 +1677,26 @@ const WindowManager = new Lang.Class({
let newWs;
let direction;
if (action == 'move') {
// "Moving" a window to another workspace doesn't make sense when
// it cannot be unstuck, and is potentially confusing if a new
// workspaces is added at the start/end
if (window.is_always_on_all_workspaces() ||
(Meta.prefs_get_workspaces_only_on_primary() &&
window.get_monitor() != Main.layoutManager.primaryIndex))
return;
}
if (target == 'last') {
direction = Meta.MotionDirection.DOWN;
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) {
// Prepend a new workspace dynamically
if (screen.get_active_workspace_index() == 0 &&
action == 'move' && target == 'up')
action == 'move' && target == 'up' && this._isWorkspacePrepended == false) {
this.insertWorkspace(0);
this._isWorkspacePrepended = true;
}
direction = Meta.MotionDirection[target.toUpperCase()];
newWs = screen.get_active_workspace().get_neighbor(direction);
@@ -1657,9 +1721,12 @@ const WindowManager = new Lang.Class({
if (!Main.overview.visible) {
if (this._workspaceSwitcherPopup == null) {
this._workspaceTracker.blockUpdates();
this._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup();
this._workspaceSwitcherPopup.connect('destroy', Lang.bind(this, function() {
this._workspaceTracker.unblockUpdates();
this._workspaceSwitcherPopup = null;
this._isWorkspacePrepended = false;
}));
}
this._workspaceSwitcherPopup.display(direction, newWs.index());

View File

@@ -74,7 +74,7 @@ const WindowMenu = new Lang.Class({
window.make_above();
}));
if (window.is_above())
item.setOrnament(PopupMenu.Ornament.DOT);
item.setOrnament(PopupMenu.Ornament.CHECK);
if (window.get_maximized() == Meta.MaximizeFlags.BOTH ||
type == Meta.WindowType.DOCK ||
type == Meta.WindowType.DESKTOP ||
@@ -93,7 +93,7 @@ const WindowMenu = new Lang.Class({
window.stick();
}));
if (isSticky)
item.setOrnament(PopupMenu.Ornament.DOT);
item.setOrnament(PopupMenu.Ornament.CHECK);
if (window.is_always_on_all_workspaces())
item.setSensitive(false);
@@ -101,13 +101,22 @@ const WindowMenu = new Lang.Class({
if (!isSticky) {
let workspace = window.get_workspace();
let idx = workspace.index();
if (idx > 0) {
if (workspace != workspace.get_neighbor(Meta.MotionDirection.LEFT)) {
this.addAction(_("Move to Workspace Left"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.LEFT));
}));
}
if (workspace != workspace.get_neighbor(Meta.MotionDirection.RIGHT)) {
this.addAction(_("Move to Workspace Right"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.RIGHT));
}));
}
if (workspace != workspace.get_neighbor(Meta.MotionDirection.UP)) {
this.addAction(_("Move to Workspace Up"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.UP));
}));
}
if (idx < nWorkspaces) {
if (workspace != workspace.get_neighbor(Meta.MotionDirection.DOWN)) {
this.addAction(_("Move to Workspace Down"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.DOWN));
}));
@@ -115,6 +124,39 @@ const WindowMenu = new Lang.Class({
}
}
let screen = global.screen;
let nMonitors = screen.get_n_monitors();
if (nMonitors > 1) {
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
let monitorIndex = window.get_monitor();
let upMonitorIndex = screen.get_monitor_neighbor_index(monitorIndex, Meta.ScreenDirection.UP);
if (upMonitorIndex != -1) {
this.addAction(_("Move to Monitor Up"), Lang.bind(this, function(event) {
window.move_to_monitor(upMonitorIndex);
}));
}
let downMonitorIndex = screen.get_monitor_neighbor_index(monitorIndex, Meta.ScreenDirection.DOWN);
if (downMonitorIndex != -1) {
this.addAction(_("Move to Monitor Down"), Lang.bind(this, function(event) {
window.move_to_monitor(downMonitorIndex);
}));
}
let leftMonitorIndex = screen.get_monitor_neighbor_index(monitorIndex, Meta.ScreenDirection.LEFT);
if (leftMonitorIndex != -1) {
this.addAction(_("Move to Monitor Left"), Lang.bind(this, function(event) {
window.move_to_monitor(leftMonitorIndex);
}));
}
let rightMonitorIndex = screen.get_monitor_neighbor_index(monitorIndex, Meta.ScreenDirection.RIGHT);
if (rightMonitorIndex != -1) {
this.addAction(_("Move to Monitor Right"), Lang.bind(this, function(event) {
window.move_to_monitor(rightMonitorIndex);
}));
}
}
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
item = this.addAction(_("Close"), Lang.bind(this, function(event) {
@@ -167,6 +209,10 @@ const WindowMenuManager = new Lang.Class({
menu.connect('activate', function() {
window.check_alive(global.get_current_time());
});
let destroyId = window.connect('unmanaged',
function() {
menu.close();
});
this._sourceActor.set_size(rect.width, rect.height);
this._sourceActor.set_position(rect.x, rect.y);
@@ -180,6 +226,7 @@ const WindowMenuManager = new Lang.Class({
this._sourceActor.hide();
menu.destroy();
window.disconnect(destroyId);
}));
}
});

View File

@@ -97,8 +97,6 @@ const WorkspacesView = new Lang.Class({
this._scrolling = false; // swipe-scrolling
this._animatingScroll = false; // programatically updating the adjustment
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
lower: 0,
@@ -418,7 +416,7 @@ const WorkspacesDisplay = new Lang.Class({
this.actor.connect('notify::allocation', Lang.bind(this, this._updateWorkspacesActualGeometry));
this.actor.connect('parent-set', Lang.bind(this, this._parentSet));
let clickAction = new Clutter.ClickAction()
let clickAction = new Clutter.ClickAction();
clickAction.connect('clicked', Lang.bind(this, function(action) {
// Only switch to the workspace when there's no application
// windows open. The problem is that it's too easy to miss
@@ -464,6 +462,7 @@ const WorkspacesDisplay = new Lang.Class({
this._notifyOpacityId = 0;
this._scrollEventId = 0;
this._keyPressEventId = 0;
this._fullGeometry = null;
},
@@ -495,6 +494,9 @@ const WorkspacesDisplay = new Lang.Class({
Lang.bind(this, this._onRestacked));
if (this._scrollEventId == 0)
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
if (this._keyPressEventId == 0)
this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
},
animateFromOverview: function(fadeOnPrimary) {
@@ -517,7 +519,10 @@ const WorkspacesDisplay = new Lang.Class({
Main.overview.disconnect(this._scrollEventId);
this._scrollEventId = 0;
}
if (this._keyPressEventId > 0) {
global.stage.disconnect(this._keyPressEventId);
this._keyPressEventId = 0;
}
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].destroy();
this._workspacesViews = [];
@@ -670,6 +675,25 @@ const WorkspacesDisplay = new Lang.Class({
}
Main.wm.actionMoveWorkspace(ws);
return Clutter.EVENT_STOP;
},
_onKeyPressEvent: function(actor, event) {
if (!this.actor.mapped)
return Clutter.EVENT_PROPAGATE;
let activeWs = global.screen.get_active_workspace();
let ws;
switch (event.get_key_symbol()) {
case Clutter.KEY_Page_Up:
ws = activeWs.get_neighbor(Meta.MotionDirection.UP);
break;
case Clutter.KEY_Page_Down:
ws = activeWs.get_neighbor(Meta.MotionDirection.DOWN);
break;
default:
return Clutter.EVENT_PROPAGATE;
}
Main.wm.actionMoveWorkspace(ws);
return Clutter.EVENT_STOP;
}
});
Signals.addSignalMethods(WorkspacesDisplay.prototype);

View File

@@ -7,6 +7,7 @@ be
bg
bn
bn_IN
bs
ca
ca@valencia
cs
@@ -49,6 +50,7 @@ nb
ne
nl
nn
oc
or
pa
pl

View File

@@ -30,6 +30,7 @@ js/ui/endSessionDialog.js
js/ui/extensionDownloader.js
js/ui/extensionSystem.js
js/ui/keyboard.js
js/ui/legacyTray.js
js/ui/lookingGlass.js
js/ui/main.js
js/ui/messageTray.js

1167
po/an.po

File diff suppressed because it is too large Load Diff

1052
po/ar.po

File diff suppressed because it is too large Load Diff

916
po/bg.po

File diff suppressed because it is too large Load Diff

1735
po/bs.po Normal file

File diff suppressed because it is too large Load Diff

1144
po/ca.po

File diff suppressed because it is too large Load Diff

342
po/cs.po
View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-04 12:55+0000\n"
"PO-Revision-Date: 2015-03-04 14:23+0100\n"
"POT-Creation-Date: 2015-07-24 08:09+0000\n"
"PO-Revision-Date: 2015-07-24 22:04+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@@ -28,8 +28,6 @@ msgid "System"
msgstr "Systém"
#: ../data/50-gnome-shell-system.xml.in.h:2
#| msgid "%d new notification"
#| msgid_plural "%d new notifications"
msgid "Show the notification list"
msgstr "Zobrazit seznam upozornění"
@@ -136,15 +134,16 @@ msgstr "Číslo aktuálně zvolené stránky ve výběru aplikací."
msgid "History for command (Alt-F2) dialog"
msgstr "Historie příkazového dialogového okna (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "History for the looking glass dialog"
msgstr "Historie dialogového okna „looking glass“ (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "V nabídce uživatele vždy zobrazovat položku „Odhlásit“."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
@@ -152,14 +151,14 @@ msgstr ""
"Tento klíč ruší automatické skrývání položky nabídky „Odhlásit“ v situacích "
"s jedním uživatelem a jedním sezením."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Zdali si pamatovat heslo k připojování šifrovaných či vzdálených souborových "
"systémů"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"The shell will request a password when an encrypted device or a remote "
"filesystem is mounted. If the password can be saved for future use a "
@@ -171,78 +170,76 @@ msgstr ""
"zaškrtávací pole „Pamatovat si heslo“. Tento klíč určuje výchozí stav této "
"volby."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Show the week date in the calendar"
msgstr "Zobrazovat v kalendáři čísla týdnů"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "If true, display the ISO week date in the calendar."
msgstr "Je-li zapnuto, zobrazovat v kalendáři čísla týdnů dle ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu"
msgstr "Klávesová zkratka otevírající nabidku aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the application menu."
msgstr "Klávesová zkratka sloužící k otevření nabídky aplikací."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová zkratka otevírající zobrazení aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Klávesová zkratka sloužící k otevření nabídky aplikací v Přehledu činností."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to open the overview"
msgstr "Klávesová zkratka otevírající přehled"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to open the Activities Overview."
msgstr "Klávesová zkratka sloužící k otevření přehledu činností"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#| msgid "Keybinding to toggle the visibility of the message tray"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the notification list"
msgstr "Klávesová zkratka přepínající viditelnost seznamu upozornění"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
#| msgid "Keybinding to toggle the visibility of the message tray."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the notification list."
msgstr "Klávesová zkratka sloužící k přepnutí viditelnosti seznamu upozornění."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification"
msgstr "Klávesová zkratka zaměřující aktivního upozornění"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to focus the active notification."
msgstr "Klávesová zkratka sloužící k zaměření aktivního upozornění."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Klávesová zkratka k pozastavení a opětovnému spuštění všech běžících animací "
"tweens; pro účely ladění"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Která klávesnice se má používat"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "Typ klávesnice, který se má používat."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Limit switcher to current workspace."
msgstr "Omezit přepínání jen na aktuální plochu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
@@ -250,11 +247,11 @@ msgstr ""
"Je-li zapnuto, objeví se v přepínači aplikací jen ty, co jsou na aktuální "
"pracovní ploše. V opačném případě jsou zahrnuty všechny aplikace."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The application icon mode."
msgstr "Režim ikon aplikací"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -264,7 +261,7 @@ msgstr ""
"only“ (zobrazí náhled okna), „app-icon-only“ (zobrazí pouze ikonu aplikace) "
"a „both“ (zobrazí náhled i ikonu)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
@@ -272,28 +269,28 @@ msgstr ""
"Je-li zapnuto, objeví se v přepínači oken jen ty, co jsou na aktuální "
"pracovní ploše. V opačném případě jsou zahrnuta všechna okna."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Attach modal dialog to the parent window"
msgstr "Modální dialogová okna připojovat k rodičovskému oknu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "Když běží GNOME Shell, tento klíč přepíše klíč v org.gnome.mutter"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Okna upuštěná u okraje obrazovky nechat řadit jako dlaždice"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "Workspaces are managed dynamically"
msgstr "Pracovní plochy jsou spravovány dynamicky"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Workspaces only on primary monitor"
msgstr "Pracovní plochy jen na hlavním monitoru"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukazatele"
@@ -301,56 +298,56 @@ msgstr "Se změnou zaměření v režimu myši čekat na zastavení pohybu ukaza
msgid "Network Login"
msgstr "Přihlášení do sítě"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Nastala chyba při načítání dialogového okna předvoleb pro rozšíření %s:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "Rozšíření GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../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:916
msgid "Cancel"
msgstr "Zrušit"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
msgid "Next"
msgstr "Následující"
#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Odemknout"
#: ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:213
msgctxt "button"
msgid "Sign In"
msgstr "Přihlásit se"
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "Vybrat sezení"
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "Nejste na seznamu?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:847
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Uživatelské jméno: "
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1180
msgid "Login Window"
msgstr "Přihlašovací okno"
@@ -443,31 +440,31 @@ msgstr "%e. %B %Y, %l%M%p"
msgid "Web Authentication Redirect"
msgstr "Přesměrováno na ověření přes web"
#: ../js/ui/appDisplay.js:791
#: ../js/ui/appDisplay.js:789
msgid "Frequently used applications will appear here"
msgstr "Zde se objeví často používané aplikace"
#: ../js/ui/appDisplay.js:911
#: ../js/ui/appDisplay.js:909
msgid "Frequent"
msgstr "Časté"
#: ../js/ui/appDisplay.js:918
#: ../js/ui/appDisplay.js:916
msgid "All"
msgstr "Všechny"
#: ../js/ui/appDisplay.js:1849
#: ../js/ui/appDisplay.js:1845
msgid "New Window"
msgstr "Nové okno"
#: ../js/ui/appDisplay.js:1877 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Odstranit z oblíbených"
#: ../js/ui/appDisplay.js:1883
#: ../js/ui/appDisplay.js:1879
msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené"
#: ../js/ui/appDisplay.js:1893
#: ../js/ui/appDisplay.js:1889
msgid "Show Details"
msgstr "Zobrazit podrobnosti"
@@ -481,114 +478,118 @@ msgstr "%s byl přidán mezi oblíbené."
msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Nastavení"
#: ../js/ui/backgroundMenu.js:21
#: ../js/ui/backgroundMenu.js:19
msgid "Change Background…"
msgstr "Změnit pozadí…"
#: ../js/ui/backgroundMenu.js:21
msgid "Display Settings"
msgstr "Nastavení displeje"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:357
msgid "Settings"
msgstr "Nastavení"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:49
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
#. 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:78
msgctxt "event list time"
msgid "All Day"
msgstr "Celý den"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#: ../js/ui/calendar.js:93
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "Ne"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:95
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "Po"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:97
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "Út"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:99
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "St"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:101
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "Čt"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:103
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "Pá"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:105
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "So"
#: ../js/ui/calendar.js:572
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "Předchozí měsíc"
#: ../js/ui/calendar.js:582
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "Následující měsíc"
#: ../js/ui/calendar.js:789
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "Týden %V"
#: ../js/ui/calendar.js:1245
#. 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:1187
msgctxt "event list time"
msgid "All Day"
msgstr "Celý den"
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "Vymazat část"
#: ../js/ui/calendar.js:1437
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "Události"
#: ../js/ui/calendar.js:1445
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/calendar.js:1449
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:1541
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "Upozornění"
#: ../js/ui/calendar.js:1681
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "Žádná upozornění"
#: ../js/ui/calendar.js:1684
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "Žádné události"
@@ -613,40 +614,42 @@ msgstr "Heslo:"
msgid "Type again:"
msgstr "Napište znovu:"
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "Připojit"
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:291
#: ../js/ui/components/networkAgent.js:301
#: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273
#: ../js/ui/components/networkAgent.js:293
#: ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "Heslo: "
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "Klíč: "
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "Indentita: "
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "Heslo soukromého klíče: "
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "Služba: "
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "K bezdrátové síti je vyžadováno ověření"
#: ../js/ui/components/networkAgent.js:319
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -655,39 +658,51 @@ msgstr ""
"Pro přístup k bezdrátové síti „%s“ jsou vyžadována hesla nebo šifrovací "
"klíče."
#: ../js/ui/components/networkAgent.js:323
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "Ověření připojení po drátu 802.1X"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "Název sítě: "
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "Ověření DSL"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "Požadován kód PIN"
#: ../js/ui/components/networkAgent.js:338
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pro mobilní širokopásmové zařízení je vyžadován kód PIN"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "Heslo k mobilní širokopásmové síti"
#: ../js/ui/components/networkAgent.js:346
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Pro připojení k „%s“ je vyžadováno heslo."
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Network Manager"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "Je vyžadováno ověření"
@@ -710,7 +725,7 @@ msgstr "Ověření bohužel nebylo úspěšné. Zkuste to prosím znovu."
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:772
#: ../js/ui/components/telepathyClient.js:757
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s"
@@ -723,7 +738,7 @@ msgstr "Okna"
msgid "Show Applications"
msgstr "Zobrazit aplikace"
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "Oblíbené"
@@ -899,10 +914,19 @@ msgstr "Instalovat"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?"
#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:741 ../js/ui/status/keyboard.js:713
msgid "Keyboard"
msgstr "Klávesnice"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:66
msgid "Hide tray"
msgstr "Skrýt pořadač"
#: ../js/ui/legacyTray.js:107
msgid "Status Icons"
msgstr "Stavové ikony"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "Nejsou nainstalována žádná rozšíření"
@@ -955,7 +979,7 @@ msgstr "Zobrazit zdroj"
msgid "Web Page"
msgstr "Webová stránka"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:1486
msgid "System Information"
msgstr "Informace o systému"
@@ -963,7 +987,7 @@ msgstr "Informace o systému"
msgid "Undo"
msgstr "Zpět"
#: ../js/ui/overview.js:124
#: ../js/ui/overview.js:117
msgid "Overview"
msgstr "Přehled"
@@ -971,25 +995,25 @@ msgstr "Přehled"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:246
#: ../js/ui/overview.js:244
msgid "Type to search…"
msgstr "Vyhledávejte psaním…"
#: ../js/ui/panel.js:351
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "Ukončit"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "Činnosti"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "Horní lišta"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -997,7 +1021,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Zadejte příkaz:"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
msgid "Close"
msgstr "Zavřít"
@@ -1027,27 +1051,27 @@ msgstr[0] "%d nové upozornění"
msgstr[1] "%d nová upozornění"
msgstr[2] "%d nových upozornění"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365
msgid "Lock"
msgstr "Uzamknout"
#: ../js/ui/screenShield.js:668
#: ../js/ui/screenShield.js:684
msgid "GNOME needs to lock the screen"
msgstr "GNOME potřebuje uzamknout obrazovku"
#: ../js/ui/screenShield.js:795 ../js/ui/screenShield.js:1271
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
msgid "Unable to lock"
msgstr "Nelze uzamknout obrazovku"
#: ../js/ui/screenShield.js:796 ../js/ui/screenShield.js:1272
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
msgid "Lock was blocked by an application"
msgstr "Zamknutí bylo zablokováno některou z aplikací"
#: ../js/ui/search.js:609
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "Hledá se…"
#: ../js/ui/search.js:611
#: ../js/ui/search.js:619
msgid "No results."
msgstr "Žádné výsledky."
@@ -1111,11 +1135,11 @@ msgstr "Vícenásobné stisky kláves"
msgid "Mouse Keys"
msgstr "Myš klávesnicí"
#: ../js/ui/status/accessibility.js:144
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "Vysoký kontrast"
#: ../js/ui/status/accessibility.js:193
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "Styl velkého textu"
@@ -1150,7 +1174,7 @@ msgstr "Nepřipojeno"
msgid "Brightness"
msgstr "Jas"
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:736
msgid "Show Keyboard Layout"
msgstr "Zobrazit rozložení klávesnice"
@@ -1319,10 +1343,6 @@ msgstr "Nastavení VPN"
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Network Manager"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala"
@@ -1365,23 +1385,23 @@ msgstr "Režim „letadlo“"
msgid "On"
msgstr "Zapnuto"
#: ../js/ui/status/system.js:317
#: ../js/ui/status/system.js:337
msgid "Switch User"
msgstr "Přepnout uživatele"
#: ../js/ui/status/system.js:322
#: ../js/ui/status/system.js:342
msgid "Log Out"
msgstr "Odhlásit se"
#: ../js/ui/status/system.js:341
#: ../js/ui/status/system.js:361
msgid "Orientation Lock"
msgstr "Zámek otočení"
#: ../js/ui/status/system.js:349
#: ../js/ui/status/system.js:369
msgid "Suspend"
msgstr "Uspat do paměti"
#: ../js/ui/status/system.js:352
#: ../js/ui/status/system.js:372
msgid "Power Off"
msgstr "Vypnout"
@@ -1413,27 +1433,27 @@ msgstr "Aplikace"
msgid "Search"
msgstr "Hledat"
#: ../js/ui/windowAttentionHandler.js:19
#: ../js/ui/windowAttentionHandler.js:20
#, javascript-format
msgid "“%s” is ready"
msgstr "Připraveno „%s“"
#: ../js/ui/windowManager.js:65
#: ../js/ui/windowManager.js:63
msgid "Do you want to keep these display settings?"
msgstr "Chcete zachovat nastavení displeje?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#. */
#: ../js/ui/windowManager.js:84
#: ../js/ui/windowManager.js:82
msgid "Revert Settings"
msgstr "Obnovit původní"
#: ../js/ui/windowManager.js:88
#: ../js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "Zachovat"
#: ../js/ui/windowManager.js:107
#: ../js/ui/windowManager.js:105
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
@@ -1443,7 +1463,7 @@ msgstr[2] "Nastavení se obnoví na původní za %d sekund"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. */
#: ../js/ui/windowManager.js:599
#: ../js/ui/windowManager.js:660
#, javascript-format
msgid "%d x %d"
msgstr "%d×%d"
@@ -1480,14 +1500,38 @@ msgstr "Vždy nahoře"
msgid "Always on Visible Workspace"
msgstr "Vždy na viditelné ploše"
#: ../js/ui/windowMenu.js:106
#: ../js/ui/windowMenu.js:105
msgid "Move to Workspace Left"
msgstr "Přesunout o plochu doleva"
#: ../js/ui/windowMenu.js:110
msgid "Move to Workspace Right"
msgstr "Přesunout o plochu doprava"
#: ../js/ui/windowMenu.js:115
msgid "Move to Workspace Up"
msgstr "Přesunout o plochu výš"
#: ../js/ui/windowMenu.js:111
#: ../js/ui/windowMenu.js:120
msgid "Move to Workspace Down"
msgstr "Přesunout o plochu níž"
#: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up"
msgstr "Přesunout o monitor výš"
#: ../js/ui/windowMenu.js:142
msgid "Move to Monitor Down"
msgstr "Přesunout o monitor níž"
#: ../js/ui/windowMenu.js:148
msgid "Move to Monitor Left"
msgstr "Přesunout o monitor doleva"
#: ../js/ui/windowMenu.js:154
msgid "Move to Monitor Right"
msgstr "Přesunout o monitor doprava"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
msgstr "Kalendář Evolution"
@@ -1532,21 +1576,21 @@ msgstr "Použít pro přihlašovací obrazovku zadaný režim, např. „gdm“.
msgid "List possible modes"
msgstr "Vypsat možné režimy"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "Neznámé"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "Nelze spustit „%s“"
#: ../src/shell-keyring-prompt.c:714
#: ../src/shell-keyring-prompt.c:742
msgid "Passwords do not match."
msgstr "Hesla si neodpovídají."
#: ../src/shell-keyring-prompt.c:722
#: ../src/shell-keyring-prompt.c:750
msgid "Password cannot be blank"
msgstr "Heslo nemůže být prázdné."

1156
po/da.po

File diff suppressed because it is too large Load Diff

1120
po/de.po

File diff suppressed because it is too large Load Diff

765
po/el.po

File diff suppressed because it is too large Load Diff

5553
po/es.po

File diff suppressed because it is too large Load Diff

965
po/eu.po

File diff suppressed because it is too large Load Diff

958
po/fi.po

File diff suppressed because it is too large Load Diff

536
po/fr.po
View File

@@ -1,5 +1,5 @@
# French translations for gnome-shell package.
# Copyright (C) 2009-2012 Listed translators
# Copyright (C) 2009-2015 Listed translators
# This file is distributed under the same license as the gnome-shell package.
#
# Mathieu Bridon <bochecha@fedoraproject.org>, 2009.
@@ -19,8 +19,8 @@ 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: 2015-03-04 08:44+0000\n"
"PO-Revision-Date: 2015-03-03 00:21+0100\n"
"POT-Creation-Date: 2015-03-15 20:37+0000\n"
"PO-Revision-Date: 2015-03-11 10:27+0100\n"
"Last-Translator: Alain Lojewski <allomervan@gmail.com>\n"
"Language-Team: français <gnomefr@traduc.org>\n"
"Language: French\n"
@@ -335,7 +335,7 @@ msgstr ""
msgid "GNOME Shell Extensions"
msgstr "Extensions GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../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:916
@@ -356,25 +356,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "Se connecter"
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:280
msgid "Choose Session"
msgstr "Choisir une session"
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:421
msgid "Not listed?"
msgstr "Absent de la liste ?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:830
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(par ex. utilisateur ou %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:835 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Nom d'utilisateur : "
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1170
msgid "Login Window"
msgstr "Fenêtre de connexion"
@@ -386,50 +386,112 @@ msgstr "Erreur d'authentification"
msgid "(or swipe finger)"
msgstr "(ou faites glisser le doigt)"
#: ../js/misc/util.js:115
#: ../js/misc/util.js:119
msgid "Command not found"
msgstr "Commande non trouvée"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:152
msgid "Could not parse command:"
msgstr "Impossible d'analyser la commande :"
#: ../js/misc/util.js:156
#: ../js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Exécution de « %s » impossible :"
#. Translators: Time in 24h format */
#: ../js/misc/util.js:191
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/misc/util.js:197
msgid "Yesterday, %H%M"
msgstr "Hier, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/misc/util.js:203
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/misc/util.js:209
msgid "%B %d, %H%M"
msgstr "%d %B, %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/misc/util.js:215
msgid "%B %d %Y, %H%M"
msgstr "%d %B %Y, %H%M"
#. Translators: Time in 12h format */
#: ../js/misc/util.js:220
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/misc/util.js:226
msgid "Yesterday, %l%M %p"
msgstr "Hier, %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/misc/util.js:232
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/misc/util.js:238
msgid "%B %d, %l%M %p"
msgstr "%d %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"*/
#: ../js/misc/util.js:244
msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y, %l%M %p"
#. 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 "Redirection de l'authentification Web"
#: ../js/ui/appDisplay.js:785
#: ../js/ui/appDisplay.js:792
msgid "Frequently used applications will appear here"
msgstr "Les applications fréquemment utilisées apparaîtront ici"
#: ../js/ui/appDisplay.js:905
#: ../js/ui/appDisplay.js:912
msgid "Frequent"
msgstr "Fréquemment utilisées"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:919
msgid "All"
msgstr "Toutes"
#: ../js/ui/appDisplay.js:1840
#: ../js/ui/appDisplay.js:1850
msgid "New Window"
msgstr "Nouvelle fenêtre"
#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1878 ../js/ui/dash.js:291
msgid "Remove from Favorites"
msgstr "Enlever des favoris"
#: ../js/ui/appDisplay.js:1874
#: ../js/ui/appDisplay.js:1884
msgid "Add to Favorites"
msgstr "Ajouter aux favoris"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1894
msgid "Show Details"
msgstr "Afficher les détails"
@@ -443,7 +505,7 @@ msgstr "%s a été ajouté à vos favoris."
msgid "%s has been removed from your favorites."
msgstr "%s a été supprimé de vos favoris."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Paramètres"
@@ -453,11 +515,69 @@ msgid "Change Background…"
msgstr "Modifier l'arrière-plan…"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:52
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "J"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:563
msgid "Previous month"
msgstr "Mois précédent"
#: ../js/ui/calendar.js:573
msgid "Next month"
msgstr "Mois suivant"
#: ../js/ui/calendar.js:780
msgid "Week %V"
msgstr "Semaine %V"
# luc: Trying alternatives:
# 123456789|123456789|
# Toute la journée bad
@@ -476,111 +596,38 @@ msgstr "06"
#. 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:81
#: ../js/ui/calendar.js:1182
msgctxt "event list time"
msgid "All Day"
msgstr "Journée"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */
#: ../js/ui/calendar.js:88 ../js/ui/calendar.js:1596
msgctxt "event list time"
msgid "%H%M"
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 */
#: ../js/ui/calendar.js:97
msgctxt "event list time"
msgid "%l%M%p"
msgstr "%l%M %p"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#: ../js/ui/calendar.js:111
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:113
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:115
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:117
msgctxt "grid wednesday"
msgid "W"
msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:119
msgctxt "grid thursday"
msgid "T"
msgstr "J"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:121
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:123
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:590
msgid "Previous month"
msgstr "Mois précédent"
#: ../js/ui/calendar.js:600
msgid "Next month"
msgstr "Mois suivant"
#: ../js/ui/calendar.js:807
msgid "Week %V"
msgstr "Semaine %V"
#: ../js/ui/calendar.js:1263
#: ../js/ui/calendar.js:1288
msgid "Clear section"
msgstr "Effacer la section"
#: ../js/ui/calendar.js:1455
#: ../js/ui/calendar.js:1515
msgid "Events"
msgstr "Évènements"
#: ../js/ui/calendar.js:1463
#: ../js/ui/calendar.js:1524
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A %d %B"
#: ../js/ui/calendar.js:1467
#: ../js/ui/calendar.js:1528
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A %d %B, %Y"
#: ../js/ui/calendar.js:1560
#: ../js/ui/calendar.js:1613
msgid "Notifications"
msgstr "Notifications"
#: ../js/ui/calendar.js:1700
#: ../js/ui/calendar.js:1764
msgid "No Notifications"
msgstr "Aucune notification"
#: ../js/ui/calendar.js:1703
#: ../js/ui/calendar.js:1767
msgid "No Events"
msgstr "Aucun évènement"
@@ -605,40 +652,42 @@ msgstr "Mot de passe :"
msgid "Type again:"
msgstr "Saisissez à nouveau :"
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "Se connecter"
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:291
#: ../js/ui/components/networkAgent.js:301
#: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273
#: ../js/ui/components/networkAgent.js:293
#: ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "Mot de passe : "
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "Clé : "
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "Identité : "
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "Mot de passe de la clé privée : "
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "Service : "
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "L'authentification est requise par le réseau sans fil"
#: ../js/ui/components/networkAgent.js:319
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -647,39 +696,51 @@ msgstr ""
"Il faut un mot de passe ou une clé de chiffrement pour accéder au réseau "
"sans fil « %s »"
#: ../js/ui/components/networkAgent.js:323
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "Authentification filaire 802.1X"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "Nom du réseau : "
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "Authentification DSL"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "Code PIN requis"
#: ../js/ui/components/networkAgent.js:338
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "Un code PIN est nécessaire pour les téléphones mobiles à large bande"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN : "
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "Mot de passe du téléphone mobile à large bande"
#: ../js/ui/components/networkAgent.js:346
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Un mot de passe est requis pour se connecter à « %s »."
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Gestionnaire de réseau"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "Authentification nécessaire"
@@ -700,71 +761,9 @@ msgstr "S'authentifier"
msgid "Sorry, that didn't work. Please try again."
msgstr "Échec de l'authentification. Essayez à nouveau."
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:764 ../js/ui/dateMenu.js:210
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:771
msgid "Yesterday, %H%M"
msgstr "Hier, %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:778
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:785
msgid "%B %d, %H%M"
msgstr "%d %B, %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:791
msgid "%B %d %Y, %H%M"
msgstr "%d %B %Y, %H%M"
#. Translators: Time in 12h format */
#: ../js/ui/components/telepathyClient.js:797 ../js/ui/dateMenu.js:213
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:804
msgid "Yesterday, %l%M %p"
msgstr "Hier, %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:811
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:818
msgid "%B %d, %l%M %p"
msgstr "%d %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"*/
#: ../js/ui/components/telepathyClient.js:824
msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %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:856
#: ../js/ui/components/telepathyClient.js:775
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s est maintenant connu sous le nom de %s"
@@ -773,11 +772,11 @@ msgstr "%s est maintenant connu sous le nom de %s"
msgid "Windows"
msgstr "Fenêtres"
#: ../js/ui/dash.js:250 ../js/ui/dash.js:291
#: ../js/ui/dash.js:252 ../js/ui/dash.js:293
msgid "Show Applications"
msgstr "Afficher les applications"
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:453
msgid "Dash"
msgstr "Dash"
@@ -792,7 +791,7 @@ msgstr "Dash"
#. */
#: ../js/ui/dateMenu.js:73
msgid "%B %e %Y"
msgstr "%%e %B %Y"
msgstr "%-e %B %Y"
# luc: FIXME: how to have a capitalized weekday (start of sentence)?
# %a (abbreviated) %A (full weekday) %^A (full weekday all uppercase)
@@ -954,10 +953,19 @@ 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:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:580
msgid "Keyboard"
msgstr "Clavier"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:64
msgid "Hide tray"
msgstr "Masquer le tiroir"
#: ../js/ui/legacyTray.js:104
msgid "Status Icons"
msgstr "Icônes d'état"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "Aucune extension installée"
@@ -1010,7 +1018,7 @@ msgstr "Afficher la source"
msgid "Web Page"
msgstr "Page Web"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:2133
msgid "System Information"
msgstr "Informations du système"
@@ -1030,21 +1038,21 @@ msgstr "Vue d'ensemble"
msgid "Type to search…"
msgstr "Rechercher…"
#: ../js/ui/panel.js:351
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "Quitter"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "Activités"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "Barre supérieure"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -1096,11 +1104,11 @@ msgstr "Impossible de verrouiller"
msgid "Lock was blocked by an application"
msgstr "Le verrouillage a été bloqué par une application"
#: ../js/ui/search.js:609
#: ../js/ui/search.js:616
msgid "Searching…"
msgstr "Recherche en cours…"
#: ../js/ui/search.js:611
#: ../js/ui/search.js:618
msgid "No results."
msgstr "Aucun résultat."
@@ -1202,7 +1210,7 @@ msgstr "Non connecté"
msgid "Brightness"
msgstr "Luminosité"
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:603
msgid "Show Keyboard Layout"
msgstr "Afficher la disposition du clavier"
@@ -1371,10 +1379,6 @@ msgstr "Paramètres VPN"
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Gestionnaire de réseau"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
msgstr "L'activation de la connexion réseau a échoué"
@@ -1582,12 +1586,12 @@ msgstr ""
msgid "List possible modes"
msgstr "Lister les modes possibles"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "Inconnu"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "Impossible de lancer « %s »"
@@ -1604,6 +1608,14 @@ msgstr "Le mot de passe ne peut pas être vide"
msgid "Authentication dialog was dismissed by the user"
msgstr "La fenêtre d'authentification a été écartée par l'utilisateur"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%H%M"
#~ msgctxt "event list time"
#~ msgid "%l%M%p"
#~ msgstr "%l%M %p"
#~ msgid "Invitation"
#~ msgstr "Invitation"
@@ -2191,59 +2203,6 @@ msgstr "La fenêtre d'authentification a été écartée par l'utilisateur"
#~ msgstr[0] "%d minute restante"
#~ msgstr[1] "%d minutes restantes"
#~ msgctxt "percent of battery remaining"
#~ msgid "%d%%"
#~ msgstr "%d %%"
#~ msgid "AC Adapter"
#~ msgstr "Adaptateur secteur"
#~ msgid "Laptop Battery"
#~ msgstr "Batterie de l'ordinateur"
#~ msgid "Monitor"
#~ msgstr "Écran"
#~ msgid "Mouse"
#~ msgstr "Souris"
#~ msgid "PDA"
#~ msgstr "Assistant personnel"
#~ msgid "Cell Phone"
#~ msgstr "Téléphone portable"
#~ msgid "Media Player"
#~ msgstr "Lecteur multimédia"
#~ msgid "Tablet"
#~ msgstr "Tablette"
#~ msgid "Computer"
#~ msgstr "Ordinateur"
#~ msgctxt "device"
#~ msgid "Unknown"
#~ msgstr "Inconnu"
#~ msgid "Available"
#~ msgstr "Disponible"
#~ msgid "Busy"
#~ msgstr "Occupé"
#~ msgid "Invisible"
#~ msgstr "Invisible"
#~ msgid "Away"
#~ msgstr "Absent"
#~ msgid "Idle"
#~ msgstr "Inactif"
#~ msgid "Your chat status will be set to busy"
#~ msgstr "Votre statut pour les discussions sera défini à occupé"
#~ msgid ""
#~ "Notifications are now disabled, including chat messages. Your online "
#~ "status has been adjusted to let others know that you might not see their "
@@ -2257,72 +2216,9 @@ msgstr "La fenêtre d'authentification a été écartée par l'utilisateur"
#~ msgstr ""
#~ "L'extinction pourrait leur faire perdre leur travaux non enregistrés."
#~ msgctxt "title"
#~ msgid "Sign In"
#~ msgstr "Connexion"
#~ msgid "APPLICATIONS"
#~ msgstr "APPLICATIONS"
#~ msgid "SETTINGS"
#~ msgstr "PARAMÈTRES"
#
# luc: https://bugzilla.gnome.org/show_bug.cgi?id=658675
#~ msgctxt "event list time"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Subscription request"
#~ msgstr "Demande d'abonnement"
#~ msgid "Connection error"
#~ msgstr "Erreur de connexion"
#
# luc: TODO: double check with source code. %A is weekday « Envoyé lundi à 8:23»
#~ msgid "Sent at <b>%X</b> on <b>%A</b>"
#~ msgstr "Envoyé <b>%A</b> à <b>%X</b>"
#~ msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
#~ msgstr "Envoyé le <b>%A %-d %B %Y</b>"
#~ msgid "Connection to %s failed"
#~ msgstr "La connexion à %s a échoué"
#~ msgid "Reconnect"
#~ msgstr "Se reconnecter"
#~ msgid "tray"
#~ msgstr "tiroir de messagerie"
#~ msgid "Browse Files..."
#~ msgstr "Parcourir les fichiers..."
#~ msgid "Error browsing device"
#~ msgstr "Erreur en parcourant le périphérique"
#~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr ""
#~ "Le périphérique demandé ne peut pas être parcouru, l'erreur est « %s »"
#~ msgid "More..."
#~ msgstr "Plus..."
#~ msgid "Wireless"
#~ msgstr "Sans fil"
#~ msgid "VPN Connections"
#~ msgstr "Connexions par VPN"
#~ msgid "System Settings"
#~ msgstr "Paramètres système"
#~ msgid "Your favorite Easter Egg"
#~ msgstr "Votre œuf de Pâques favori"
#~ msgid "United Kingdom"
#~ msgstr "Royaume-Uni"
#~ msgid "Default"
#~ msgstr "Défaut"

1066
po/fur.po

File diff suppressed because it is too large Load Diff

698
po/gl.po

File diff suppressed because it is too large Load Diff

364
po/he.po
View File

@@ -10,8 +10,8 @@ msgid ""
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-04 17:01+0200\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-07-16 13:28+0300\n"
"PO-Revision-Date: 2015-07-16 13:28+0300\n"
"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
"Language-Team: עברית <>\n"
@@ -134,30 +134,31 @@ msgstr "Index of the currently selected view in the application picker."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
msgid "History for command (Alt-F2) dialog"
msgstr "History for command (Alt-F2) dialog"
#. Translators: looking glass is a debugger and inspector tool, see https://live.gnome.org/GnomeShell/LookingGlass
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "History for the looking glass dialog"
msgstr "History for the looking glass dialog"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "Always show the 'Log out' menu item in the user menu."
msgstr "Always show the 'Log out' menu item in the user menu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid ""
msgid ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
msgstr ""
msgstr ""
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
"user, single-session situations."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid ""
"Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Whether to remember password for mounting encrypted or remote filesystems"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid ""
"The shell will request a password when an encrypted device or a remote "
"filesystem is mounted. If the password can be saved for future use a "
@@ -168,75 +169,75 @@ msgstr ""
"filesystem is mounted. If the password can be saved for future use a "
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Show the week date in the calendar"
msgstr "Show the week date in the calendar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "If true, display the ISO week date in the calendar."
msgstr "If true, display the ISO week date in the calendar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu"
msgstr "Keybinding to open the application menu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the application menu."
msgstr "Keybinding to open the application menu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Keybinding to open the \"Show Applications\" view"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to open the overview"
msgstr "Keybinding to open the overview"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to open the Activities Overview."
msgstr "Keybinding to open the Activities Overview."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to toggle the visibility of the notification list"
msgstr "Keybinding to toggle the visibility of the notification list"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the visibility of the notification list."
msgstr "Keybinding to toggle the visibility of the notification list."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to focus the active notification"
msgstr "Keybinding to focus the active notification"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Keybinding to focus the active notification."
msgstr "Keybinding to focus the active notification."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Which keyboard to use"
msgstr "Which keyboard to use"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "The type of keyboard to use."
msgstr "The type of keyboard to use."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "Limit switcher to current workspace."
msgstr "Limit switcher to current workspace."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid ""
"If true, only applications that have windows on the current workspace are "
@@ -244,51 +245,51 @@ msgstr ""
msgstr ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "The application icon mode."
msgstr "The application icon mode."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
msgstr ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Attach modal dialog to the parent window"
msgstr "Attach modal dialog to the parent window"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Enable edge tiling when dropping windows on screen edges"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "Workspaces are managed dynamically"
msgstr "Workspaces are managed dynamically"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Workspaces only on primary monitor"
msgstr "Workspaces only on primary monitor"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Delay focus changes in mouse mode until the pointer stops moving"
@@ -296,50 +297,50 @@ msgstr "Delay focus changes in mouse mode until the pointer stops moving"
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
msgid "Network Login"
msgstr "Network Login"
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "אירעה שגיאה בעת טעינת דו־שיח ההעדפות עבור %s:"
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "הרחבות GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../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:916
msgid "Cancel"
msgstr "ביטול"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
msgid "Next"
msgstr "הבא"
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "שחרור"
#: ../js/gdm/authPrompt.js:213
msgctxt "button"
msgid "Sign In"
msgstr "כניסה"
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "בחירת הפעלה"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#. manually entering the username.
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "לא רשום?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:847
#, javascript-format
msgid "(e.g., user or %s)"
@@ -347,12 +348,12 @@ msgstr "(משתמש או %s לדוגמה)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "שם משתמש:"
#: ../js/gdm/loginDialog.js:1180
msgid "Login Window"
msgstr "חלון כניסה"
@@ -460,31 +461,31 @@ msgstr "%d ב%B %Y, %l%M %p"
#: ../js/portalHelper/main.js:85
msgid "Web Authentication Redirect"
msgstr "אימות ניתוב הרשת"
#: ../js/ui/appDisplay.js:789
msgid "Frequently used applications will appear here"
msgstr "יישומים בשימוש תדיר יופיעו כאן"
#: ../js/ui/appDisplay.js:909
msgid "Frequent"
msgstr "תדיר"
#: ../js/ui/appDisplay.js:916
msgid "All"
msgstr "הכול"
#: ../js/ui/appDisplay.js:1845
msgid "New Window"
msgstr "חלון חדש"
#: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "הסרה מהמועדפים"
#: ../js/ui/appDisplay.js:1879
msgid "Add to Favorites"
msgstr "הוספה למועדפים"
#: ../js/ui/appDisplay.js:1889
msgid "Show Details"
msgstr "הצגת פרטים"
@@ -498,114 +499,118 @@ msgstr "%s נוסף למועדפים שלך."
#, javascript-format
msgid "%s has been removed from your favorites."
msgstr "%s הוסר מהמועדפים שלך."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "הגדרות"
#: ../js/ui/backgroundMenu.js:19
msgid "Change Background…"
msgstr "החלפת הרקע…"
#: ../js/ui/backgroundMenu.js:21
msgid "Display Settings"
msgstr "הצגת הגדרות"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:357
msgid "Settings"
msgstr "הגדרות"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday).
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "65"
#. 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:78
msgctxt "event list time"
msgid "All Day"
msgstr "יום שלם"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#.
#.
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "א"
#. Translators: Calendar grid abbreviation for Monday
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "ב"
#. Translators: Calendar grid abbreviation for Tuesday
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "ג"
#. Translators: Calendar grid abbreviation for Wednesday
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "ד"
#. Translators: Calendar grid abbreviation for Thursday
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "ה"
#. Translators: Calendar grid abbreviation for Friday
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "ו"
#. Translators: Calendar grid abbreviation for Saturday
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "ש"
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "חודש קודם"
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "חודש הבא"
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "שבוע %V"
#. 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:1187
msgctxt "event list time"
msgid "All Day"
msgstr "יום שלם"
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "ניקוי מקטע"
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "אירועים"
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, ה־%e ב%B"
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, ה־%e ב%B, %Y"
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "התרעות"
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "אין התרעות"
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "אין אירועים"
@@ -630,81 +635,95 @@ msgstr "ססמה:"
#: ../js/ui/components/keyring.js:120
msgid "Type again:"
msgstr "נא להקליד שוב:"
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "התחברות"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:291
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273
#: ../js/ui/components/networkAgent.js:293
#: ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "ססמה:"
#. static WEP
#. static WEP
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "מפתח:"
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "זהות:"
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "ססמת מפתח פרטי:"
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "שירות:"
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "הרשת האלחוטית דורשת אימות"
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
msgstr "ססמאות או מפתחות הצפנה נדרשים כדי לגשת לרשת האלחוטית „%s”"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "אימות Wired 802.1X"
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "שם הרשת:"
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "אימות DSL"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "נדרש קוד PIN"
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "נדרש קוד PIN עבור התקן החיבור האלחוטי בפס רחב"
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "ססמת רשת הפס הרחב הניידת"
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "נדרשת ססמה כדי להתחבר אל „%s”"
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "מנהל הרשתות"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
@@ -727,7 +746,7 @@ msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסל
msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה."
#. Translators: this is the other person changing their old IM name to their new
#. IM name.
#. IM name.
#: ../js/ui/components/telepathyClient.js:757
#, javascript-format
msgid "%s is now known as %s"
@@ -742,7 +761,7 @@ msgstr "הצגת יישומים"
msgstr "הצגת יישומים"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#. the left of the overview
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "חלונית"
@@ -904,10 +923,19 @@ msgstr "התקנה"
#, javascript-format
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "הורדה והתקנה של „%s” מ־extensions.gnome.org?"
#: ../js/ui/keyboard.js:747 ../js/ui/status/keyboard.js:713
msgid "Keyboard"
msgstr "מקלדת"
#. translators: 'Hide' is a verb
#: ../js/ui/legacyTray.js:66
msgid "Hide tray"
msgstr "הסתרת המגש"
#: ../js/ui/legacyTray.js:107
msgid "Status Icons"
msgstr "סמלי מצב"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
@@ -960,7 +988,7 @@ msgstr "צפייה במקור"
#: ../js/ui/lookingGlass.js:758
msgid "Web Page"
msgstr "דף אינטרנט"
#: ../js/ui/messageTray.js:1486
msgid "System Information"
msgstr "פרטי המערכת"
@@ -980,17 +1008,17 @@ msgstr "סקירה"
#: ../js/ui/overview.js:246
msgid "Type to search…"
msgstr "יש להקליד כדי לחפש…"
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "יציאה"
#. 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:404
msgid "Activities"
msgstr "פעילויות"
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "הסרגל העליון"
@@ -999,7 +1027,7 @@ msgstr "הסרגל העליון"
#. (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.
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -1007,7 +1035,7 @@ msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:70
msgid "Enter a Command"
msgstr "נא להזין פקודה"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
msgid "Close"
msgstr "סגירה"
@@ -1037,11 +1065,11 @@ msgid_plural "%d new notifications"
msgid_plural "%d new notifications"
msgstr[0] "התרעה חדשה אחת"
msgstr[1] "%d התרעות חדשות"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365
msgid "Lock"
msgstr "נעילה"
#: ../js/ui/screenShield.js:684
msgid "GNOME needs to lock the screen"
msgstr "על GNOME לנעול את המסך"
@@ -1052,19 +1080,19 @@ msgstr "על GNOME לנעול את המסך"
#. 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
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
msgid "Unable to lock"
msgstr "לא ניתן לנעול"
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
msgid "Lock was blocked by an application"
msgstr "הנעילה נחסמה ע״י היישום"
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "בחיפוש…"
#: ../js/ui/search.js:619
msgid "No results."
msgstr "אין תוצאות."
@@ -1128,11 +1156,11 @@ msgstr "מקשים קופצים"
#: ../js/ui/status/accessibility.js:84
msgid "Mouse Keys"
msgstr "מקשי עכבר"
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "ניגודיות גבוהה"
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "טקסט גדול"
@@ -1169,7 +1197,7 @@ msgstr "לא מחובר"
#: ../js/ui/status/brightness.js:44
msgid "Brightness"
msgstr "בהירות"
#: ../js/ui/status/keyboard.js:736
msgid "Show Keyboard Layout"
msgstr "הצגת פריסת המקלדת"
@@ -1338,10 +1366,6 @@ msgstr "הגדרות VPN"
#: ../js/ui/status/network.js:1502
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "מנהל הרשתות"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
@@ -1391,23 +1415,23 @@ msgstr "מצב טיסה"
#: ../js/ui/status/rfkill.js:90
msgid "On"
msgstr "פועל"
#: ../js/ui/status/system.js:337
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/status/system.js:342
msgid "Log Out"
msgstr "יציאה"
#: ../js/ui/status/system.js:361
msgid "Orientation Lock"
msgstr "נעילת כיוון"
#: ../js/ui/status/system.js:369
msgid "Suspend"
msgstr "השהיה"
#: ../js/ui/status/system.js:372
msgid "Power Off"
msgstr "כיבוי"
@@ -1439,28 +1463,28 @@ msgstr "יישומים"
#: ../js/ui/viewSelector.js:163
msgid "Search"
msgstr "חיפוש"
#: ../js/ui/windowAttentionHandler.js:20
#, javascript-format
msgid "“%s” is ready"
msgstr "‏„%s” מוכן"
#: ../js/ui/windowManager.js:63
msgid "Do you want to keep these display settings?"
msgstr "האם ברצונך לשמור הגדרות תצוגה אלה?"
#. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels.
#.
#.
#: ../js/ui/windowManager.js:82
msgid "Revert Settings"
msgstr "שחזור הגדרות"
#: ../js/ui/windowManager.js:86
msgid "Keep Changes"
msgstr "שמירת שינויים"
# javascript-format
# javascript-format
#: ../js/ui/windowManager.js:105
#, c-format
msgid "Settings changes will revert in %d second"
@@ -1469,7 +1493,7 @@ msgstr[1] "שינויי הגדרות ישוחזרו בעוד %d שניות"
msgstr[1] "שינויי הגדרות ישוחזרו בעוד %d שניות"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height.
#. * the width of the window and the second is the height.
#: ../js/ui/windowManager.js:604
#, javascript-format
msgid "%d x %d"
@@ -1506,14 +1530,38 @@ msgstr "תמיד עליון"
#: ../js/ui/windowMenu.js:89
msgid "Always on Visible Workspace"
msgstr "הצגה בכל מרחבי העבודה"
#: ../js/ui/windowMenu.js:105
msgid "Move to Workspace Left"
msgstr "הזזה למרחב העבודה שמשמאל"
#: ../js/ui/windowMenu.js:110
msgid "Move to Workspace Right"
msgstr "הזזה למרחב העבודה שמימין"
#: ../js/ui/windowMenu.js:115
msgid "Move to Workspace Up"
msgstr "הזזה למרחב העבודה שמלמעלה"
#: ../js/ui/windowMenu.js:120
msgid "Move to Workspace Down"
msgstr "הזזה למרחב העבודה שמלמטה"
#: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up"
msgstr "הזה לצג שמלמעלה"
#: ../js/ui/windowMenu.js:142
msgid "Move to Monitor Down"
msgstr "הזזה לצג שמלמטה"
#: ../js/ui/windowMenu.js:148
msgid "Move to Monitor Left"
msgstr "הזזה לצג שמשמאל"
#: ../js/ui/windowMenu.js:154
msgid "Move to Monitor Right"
msgstr "הזזה לצג שמימין"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
@@ -1556,21 +1604,21 @@ msgstr "שימוש במצב מסוים, לדוגמה: „gdm“ למסך הכנ
#: ../src/main.c:391
msgid "List possible modes"
msgstr "הצגת המצבים האפשריים"
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "לא ידוע"
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "אירע כשל בטעינת „%s”"
#: ../src/shell-keyring-prompt.c:742
msgid "Passwords do not match."
msgstr "הססמאות אינן תואמות."
#: ../src/shell-keyring-prompt.c:750
msgid "Password cannot be blank"
msgstr "הססמה לא יכולה להישאר ריקה"

768
po/hu.po

File diff suppressed because it is too large Load Diff

950
po/id.po

File diff suppressed because it is too large Load Diff

994
po/is.po

File diff suppressed because it is too large Load Diff

542
po/it.po
View File

@@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-02 20:57+0000\n"
"PO-Revision-Date: 2015-03-03 08:48+0100\n"
"POT-Creation-Date: 2015-03-16 20:36+0000\n"
"PO-Revision-Date: 2015-03-17 09:07+0100\n"
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
"Language-Team: Italiano <tp@lists.linux.it>\n"
"Language: it\n"
@@ -21,7 +21,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-DamnedLies-Scope: partial\n"
"X-Generator: Poedit 1.7.4\n"
"X-Generator: Poedit 1.7.5\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@@ -323,7 +323,7 @@ msgstr ""
msgid "GNOME Shell Extensions"
msgstr "Estensioni di GNOME Shell"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145
#: ../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:916
@@ -344,25 +344,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "Accedi"
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:280
msgid "Choose Session"
msgstr "Scegli sessione"
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:421
msgid "Not listed?"
msgstr "Non elencato?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:830
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(p.e. utente o %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:835 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Nome utente: "
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1170
msgid "Login Window"
msgstr "Finestra di accesso"
@@ -374,50 +374,112 @@ msgstr "Errore di autenticazione"
msgid "(or swipe finger)"
msgstr "(o passare il dito)"
#: ../js/misc/util.js:115
#: ../js/misc/util.js:119
msgid "Command not found"
msgstr "Comando non trovato"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:152
msgid "Could not parse command:"
msgstr "Impossibile analizzare il comando:"
#: ../js/misc/util.js:156
#: ../js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Esecuzione di «%s» non riuscita:"
#. Translators: Time in 24h format */
#: ../js/misc/util.js:191
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/misc/util.js:197
msgid "Yesterday, %H%M"
msgstr "Ieri, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/misc/util.js:203
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/misc/util.js:209
msgid "%B %d, %H%M"
msgstr "%e %B, %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/misc/util.js:215
msgid "%B %d %Y, %H%M"
msgstr "%e %B %Y, %H%M"
#. Translators: Time in 12h format */
#: ../js/misc/util.js:220
msgid "%l%M %p"
msgstr "%I%M %p"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/misc/util.js:226
msgid "Yesterday, %l%M %p"
msgstr "Ieri, %I%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/misc/util.js:232
msgid "%A, %l%M %p"
msgstr "%A, %I%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/misc/util.js:238
msgid "%B %d, %l%M %p"
msgstr "%d %B, %I%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/misc/util.js:244
msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y, %I%M %p"
#. 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 "Redirezione autenticazione web"
#: ../js/ui/appDisplay.js:785
#: ../js/ui/appDisplay.js:792
msgid "Frequently used applications will appear here"
msgstr "Qui saranno mostrate le applicazioni usate frequentemente"
#: ../js/ui/appDisplay.js:905
#: ../js/ui/appDisplay.js:912
msgid "Frequent"
msgstr "Frequenti"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:919
msgid "All"
msgstr "Tutte"
#: ../js/ui/appDisplay.js:1840
#: ../js/ui/appDisplay.js:1850
msgid "New Window"
msgstr "Nuova finestra"
#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1878 ../js/ui/dash.js:291
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: ../js/ui/appDisplay.js:1874
#: ../js/ui/appDisplay.js:1884
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1894
msgid "Show Details"
msgstr "Mostra dettagli"
@@ -433,7 +495,7 @@ msgstr "%s è stato aggiunto ai preferiti."
msgid "%s has been removed from your favorites."
msgstr "%s è stato rimosso dai preferiti."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Impostazioni"
@@ -443,115 +505,104 @@ msgid "Change Background…"
msgstr "Cambia sfondo…"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:52
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
#. 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:81
msgctxt "event list time"
msgid "All Day"
msgstr "Giornata"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */
#: ../js/ui/calendar.js:88 ../js/ui/calendar.js:1575
msgctxt "event list time"
msgid "%H%M"
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 */
#: ../js/ui/calendar.js:97
msgctxt "event list time"
msgid "%l%M%p"
msgstr "%I%M%p"
#. Translators: Calendar grid abbreviation for Sunday.
#. *
#. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S".
#. */
#: ../js/ui/calendar.js:111
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "D"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:113
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:115
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:117
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "M"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:119
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "G"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:121
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:123
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:590
#: ../js/ui/calendar.js:563
msgid "Previous month"
msgstr "Mese precedente"
#: ../js/ui/calendar.js:600
#: ../js/ui/calendar.js:573
msgid "Next month"
msgstr "Mese successivo"
#: ../js/ui/calendar.js:1258
#: ../js/ui/calendar.js:780
msgid "Week %V"
msgstr "Settimana %V"
#. 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:1182
msgctxt "event list time"
msgid "All Day"
msgstr "Giornata"
#: ../js/ui/calendar.js:1288
msgid "Clear section"
msgstr "Annulla selezione"
#: ../js/ui/calendar.js:1436
#: ../js/ui/calendar.js:1515
msgid "Events"
msgstr "Eventi"
#: ../js/ui/calendar.js:1444
#: ../js/ui/calendar.js:1524
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e %B"
#: ../js/ui/calendar.js:1448
#: ../js/ui/calendar.js:1528
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e %B %Y"
#: ../js/ui/calendar.js:1541
#: ../js/ui/calendar.js:1613
msgid "Notifications"
msgstr "Notifiche"
#: ../js/ui/calendar.js:1678
#: ../js/ui/calendar.js:1764
msgid "No Notifications"
msgstr "Nessuna notifica"
#: ../js/ui/calendar.js:1681
#: ../js/ui/calendar.js:1767
msgid "No Events"
msgstr "Nessun evento"
@@ -576,40 +627,42 @@ msgstr "Password:"
msgid "Type again:"
msgstr "Inserire di nuovo:"
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "Connetti"
#: ../js/ui/components/networkAgent.js:231
#: ../js/ui/components/networkAgent.js:243
#: ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:291
#: ../js/ui/components/networkAgent.js:301
#: ../js/ui/components/networkAgent.js:233
#: ../js/ui/components/networkAgent.js:245
#: ../js/ui/components/networkAgent.js:273
#: ../js/ui/components/networkAgent.js:293
#: ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "Password: "
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "Chiave: "
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "Identità: "
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "Password chiave privata: "
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "Servizio: "
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "Richiesta autenticazione dalla rete wireless"
#: ../js/ui/components/networkAgent.js:319
#: ../js/ui/components/networkAgent.js:321
#: ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
@@ -618,39 +671,51 @@ msgstr ""
"È richiesta una password o una chiave di cifratura per accedere alla rete "
"wireless «%s»."
#: ../js/ui/components/networkAgent.js:323
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "Autenticazione via cavo 802.1X"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "Nome rete: "
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "Autenticazione DSL"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "Richiesto codice PIN"
#: ../js/ui/components/networkAgent.js:338
#: ../js/ui/components/networkAgent.js:340
#: ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "È necessario il codice PIN per il dispositivo mobile"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "Password rete mobile"
#: ../js/ui/components/networkAgent.js:346
#: ../js/ui/components/networkAgent.js:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "È richiesta una password per connettersi a «%s»."
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Gestore reti"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "Richiesta autenticazione"
@@ -671,294 +736,30 @@ msgstr "Autentica"
msgid "Sorry, that didn't work. Please try again."
msgstr "Errore nell'autenticazione. Provare di nuovo."
#: ../js/ui/components/telepathyClient.js:243
msgid "Invitation"
msgstr "Invito"
# A memora del test che ho fatto è "chiamata"... da verificare meglio
#: ../js/ui/components/telepathyClient.js:303
msgid "Call"
msgstr "Chiamata"
#: ../js/ui/components/telepathyClient.js:319
msgid "File Transfer"
msgstr "Trasferimento file"
#: ../js/ui/components/telepathyClient.js:423
msgid "Chat"
msgstr "Chat"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:936 ../js/ui/dateMenu.js:209
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:943
msgid "Yesterday, %H%M"
msgstr "Ieri, %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:950
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:957
msgid "%B %d, %H%M"
msgstr "%e %B, %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:963
msgid "%B %d %Y, %H%M"
msgstr "%e %B %Y, %H%M"
#. Translators: Time in 12h format */
#: ../js/ui/components/telepathyClient.js:969 ../js/ui/dateMenu.js:212
msgid "%l%M %p"
msgstr "%I%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:976
msgid "Yesterday, %l%M %p"
msgstr "Ieri, %I%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:983
msgid "%A, %l%M %p"
msgstr "%A, %I%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:990
msgid "%B %d, %l%M %p"
msgstr "%d %B, %I%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:996
msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y, %I%M %p"
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:1028
#: ../js/ui/components/telepathyClient.js:775
#, javascript-format
msgid "%s is now known as %s"
msgstr "%s ha cambiato nome in %s"
#. translators: argument is a room name like
#. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1132
#, javascript-format
msgid "Invitation to %s"
msgstr "Invito su %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:1136
#, javascript-format
msgid "%s is inviting you to join %s"
msgstr "%s ti sta invitando su %s"
#: ../js/ui/components/telepathyClient.js:1140
#: ../js/ui/components/telepathyClient.js:1175
#: ../js/ui/components/telepathyClient.js:1207
#: ../js/ui/components/telepathyClient.js:1273
msgid "Decline"
msgstr "Declina"
#: ../js/ui/components/telepathyClient.js:1146
#: ../js/ui/components/telepathyClient.js:1213
#: ../js/ui/components/telepathyClient.js:1278
msgid "Accept"
msgstr "Accetta"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1165
#, javascript-format
msgid "Video call from %s"
msgstr "Videochiamata da %s"
#. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1168
#, javascript-format
msgid "Call from %s"
msgstr "Chiamata da %s"
#. translators: this is a button label (verb), not a noun */
#: ../js/ui/components/telepathyClient.js:1182
msgid "Answer"
msgstr "Rispondi"
#. To translators: The first parameter is
#. * 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:1203
#, javascript-format
msgid "%s is sending you %s"
msgstr "%s ti sta inviando %s"
#. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1230
#, javascript-format
msgid "%s would like permission to see when you are online"
msgstr "%s chiede il permesso di vedere quando sei online"
#: ../js/ui/components/telepathyClient.js:1321
msgid "Network error"
msgstr "Errore di rete"
#: ../js/ui/components/telepathyClient.js:1323
msgid "Authentication failed"
msgstr "Autenticazione non riuscita"
#: ../js/ui/components/telepathyClient.js:1325
msgid "Encryption error"
msgstr "Errore di cifratura"
#: ../js/ui/components/telepathyClient.js:1327
msgid "Certificate not provided"
msgstr "Certificato non fornito"
#: ../js/ui/components/telepathyClient.js:1329
msgid "Certificate untrusted"
msgstr "Certificato non fidato"
#: ../js/ui/components/telepathyClient.js:1331
msgid "Certificate expired"
msgstr "Certificato scaduto"
#: ../js/ui/components/telepathyClient.js:1333
msgid "Certificate not activated"
msgstr "Certificato non attivato"
#: ../js/ui/components/telepathyClient.js:1335
msgid "Certificate hostname mismatch"
msgstr "Corrispondenza errata nel nome host del certificato"
#: ../js/ui/components/telepathyClient.js:1337
msgid "Certificate fingerprint mismatch"
msgstr "Corrispondenza errata nell'impronta digitare del certificato"
#: ../js/ui/components/telepathyClient.js:1339
msgid "Certificate self-signed"
msgstr "Certificato auto-firmato"
#: ../js/ui/components/telepathyClient.js:1341
msgid "Status is set to offline"
msgstr "Lo stato è impostato a fuori rete"
#: ../js/ui/components/telepathyClient.js:1343
msgid "Encryption is not available"
msgstr "La cifratura non è disponibile"
#: ../js/ui/components/telepathyClient.js:1345
msgid "Certificate is invalid"
msgstr "Il certificato non è valido"
#: ../js/ui/components/telepathyClient.js:1347
msgid "Connection has been refused"
msgstr "La connessione è stata rifiutata"
#: ../js/ui/components/telepathyClient.js:1349
msgid "Connection can't be established"
msgstr "Impossibile stabilire la connessione"
#: ../js/ui/components/telepathyClient.js:1351
msgid "Connection has been lost"
msgstr "Connessione persa"
#: ../js/ui/components/telepathyClient.js:1353
msgid "This account is already connected to the server"
msgstr "Questo account è già connesso al server"
#: ../js/ui/components/telepathyClient.js:1355
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr ""
"La connessione è stata sostituita da una nuova connessione usando la stessa "
"risorsa"
#: ../js/ui/components/telepathyClient.js:1357
msgid "The account already exists on the server"
msgstr "L'account esiste già sul server"
#: ../js/ui/components/telepathyClient.js:1359
msgid "Server is currently too busy to handle the connection"
msgstr "Il server è al momento troppo occupato per gestire la connessione"
#: ../js/ui/components/telepathyClient.js:1361
msgid "Certificate has been revoked"
msgstr "Il certificato è stato revocato"
#: ../js/ui/components/telepathyClient.js:1363
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Il certificato usa un algoritmo di cifratura non sicuro o è "
"crittograficamente debole"
#: ../js/ui/components/telepathyClient.js:1365
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
msgstr ""
"La lunghezza del certificato del server o la profondità della catena di "
"certificazione del server eccedono i limiti imposti dalla libreria "
"crittografica"
# indica lo stato del device BT, per esempio gli auricolari
# credo sia meglio l'aggettivo che il sostantivo
#: ../js/ui/components/telepathyClient.js:1367
msgid "Internal error"
msgstr "Errore interno"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1377
#, javascript-format
msgid "Unable to connect to %s"
msgstr "Impossibile connettersi a %s"
#: ../js/ui/components/telepathyClient.js:1382
msgid "View account"
msgstr "Visualizza account"
#: ../js/ui/components/telepathyClient.js:1419
msgid "Unknown reason"
msgstr "Motivo sconosciuto"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:155
msgid "Windows"
msgstr "Finestre"
#: ../js/ui/dash.js:250 ../js/ui/dash.js:291
#: ../js/ui/dash.js:252 ../js/ui/dash.js:293
msgid "Show Applications"
msgstr "Mostra applicazioni"
# cruscotto?!?!?!?!?!?!?
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:453
msgid "Dash"
msgstr "Dash"
#. 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:72
#: ../js/ui/dateMenu.js:73
msgid "%B %e %Y"
msgstr "%e %B %Y"
@@ -966,15 +767,15 @@ msgstr "%e %B %Y"
#. * below the time in the shell; it should combine the weekday and the
#. * date, e.g. "Tuesday February 17 2015".
#. */
#: ../js/ui/dateMenu.js:79
#: ../js/ui/dateMenu.js:80
msgid "%A %B %e %Y"
msgstr "%A %e %B %Y"
#: ../js/ui/dateMenu.js:159
#: ../js/ui/dateMenu.js:160
msgid "Add world clocks…"
msgstr "Aggiungi orologi mondiali…"
#: ../js/ui/dateMenu.js:160
#: ../js/ui/dateMenu.js:161
msgid "World Clocks"
msgstr "Orologi mondiali"
@@ -1119,10 +920,19 @@ msgstr "Installa"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Scaricare e installare «%s» da extensions.gnome.org?"
#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:580
msgid "Keyboard"
msgstr "Tastiera"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:64
msgid "Hide tray"
msgstr "Nascondi cassetto"
#: ../js/ui/legacyTray.js:104
msgid "Status Icons"
msgstr "Icone di stato"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "Nessuna estensione installata"
@@ -1177,7 +987,7 @@ msgstr "Visualizza sorgente"
msgid "Web Page"
msgstr "Pagina web"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:2133
msgid "System Information"
msgstr "Informazione di sistema"
@@ -1197,21 +1007,21 @@ msgstr "Panoramica"
msgid "Type to search…"
msgstr "Digita per cercare…"
#: ../js/ui/panel.js:351
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "Esci"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "Attività"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "Barra superiore"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@@ -1223,7 +1033,7 @@ msgstr "Inserire un comando"
msgid "Close"
msgstr "Chiudi"
#: ../js/ui/runDialog.js:277
#: ../js/ui/runDialog.js:281
msgid "Restarting…"
msgstr "Riavvio…"
@@ -1263,11 +1073,11 @@ msgstr "Impossibile bloccare"
msgid "Lock was blocked by an application"
msgstr "Il blocco è stato impedito da un'applicazione."
#: ../js/ui/search.js:609
#: ../js/ui/search.js:616
msgid "Searching…"
msgstr "Ricerca…"
#: ../js/ui/search.js:611
#: ../js/ui/search.js:618
msgid "No results."
msgstr "Nessun risultato."
@@ -1370,7 +1180,7 @@ msgstr "Non collegato"
msgid "Brightness"
msgstr "Luminosità"
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:603
msgid "Show Keyboard Layout"
msgstr "Mostra disposizione tastiera"
@@ -1543,10 +1353,6 @@ msgstr "Impostazioni VPN"
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Gestore reti"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
msgstr "Attivazione della connessione di rete non riuscita"
@@ -1755,12 +1561,12 @@ msgstr "Usa una modalità specifica, p.e. \"gdm\" per la schermata di accesso"
msgid "List possible modes"
msgstr "Elenca le modalità possibili"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "Sconosciuto"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "Avvio di «%s» non riuscito"

1115
po/ja.po

File diff suppressed because it is too large Load Diff

674
po/kk.po

File diff suppressed because it is too large Load Diff

847
po/ko.po

File diff suppressed because it is too large Load Diff

672
po/lt.po

File diff suppressed because it is too large Load Diff

1513
po/lv.po

File diff suppressed because it is too large Load Diff

760
po/nb.po

File diff suppressed because it is too large Load Diff

1348
po/nl.po

File diff suppressed because it is too large Load Diff

2487
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

1036
po/pa.po

File diff suppressed because it is too large Load Diff

834
po/pl.po

File diff suppressed because it is too large Load Diff

1406
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

646
po/ru.po

File diff suppressed because it is too large Load Diff

477
po/sk.po
View File

@@ -3,23 +3,22 @@
# This file is distributed under the same license as the gnome-shell package.
# Peter Mráz <etkinator@gmail.com>, 2011.
# Michal Štrba <faiface2202@gmail.com>, 2011.
# Dušan Kazik <prescott66@gmail.com>, 2012, 2013.
#
# Dušan Kazik <prescott66@gmail.com>, 2012, 2013, 2015.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-04 08:44+0000\n"
"PO-Revision-Date: 2015-03-04 11:52+0100\n"
"POT-Creation-Date: 2015-06-29 08:02+0000\n"
"PO-Revision-Date: 2015-06-29 12:41+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-DamnedLies-Scope: partial\n"
"X-Generator: Poedit 1.7.4\n"
"X-Generator: Poedit 1.8.1\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@@ -257,52 +256,52 @@ msgstr "Oneskoriť pohyb zamerania v režime myši, až kým sa ukazovateľ neza
msgid "Network Login"
msgstr "Sieťové prihlásenie"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Vyskytla sa chyba pri načítavaní dialógového okna nastavení pre %s:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "Rozšírenia pre Shell prostredia GNOME"
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:143 ../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:916
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:145 ../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:916
msgid "Cancel"
msgstr "Zrušiť"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
msgid "Next"
msgstr "Ďalej"
#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:59
#: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Odomknúť"
#: ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:213
msgctxt "button"
msgid "Sign In"
msgstr "Prihlásiť sa"
# button
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "Vybrať reláciu"
# https://bugzilla.gnome.org/show_bug.cgi?id=659972
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "Nie ste v zozname?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:847
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(napr., používateľ alebo %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269 ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:852 ../js/ui/components/networkAgent.js:271 ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Používateľské meno: "
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1180
msgid "Login Window"
msgstr "Prihlasovacie okno"
@@ -314,19 +313,84 @@ msgstr "Chyba pri overovaní totožnosti"
msgid "(or swipe finger)"
msgstr "(alebo prejdite prstom)"
#: ../js/misc/util.js:115
#: ../js/misc/util.js:119
msgid "Command not found"
msgstr "Príkaz nebol nájdený"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:152
msgid "Could not parse command:"
msgstr "Nepodarilo sa analyzovať príkaz:"
#: ../js/misc/util.js:156
#: ../js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Spustenie „%s“ zlyhalo:"
#. Translators: Time in 24h format */
#: ../js/misc/util.js:191
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/misc/util.js:197
msgid "Yesterday, %H%M"
msgstr "Včera o %H:%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/misc/util.js:203
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/misc/util.js:209
msgid "%B %d, %H%M"
msgstr "%d. %B, %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/misc/util.js:215
msgid "%B %d %Y, %H%M"
msgstr "%d. %B %Y, %H:%M"
#. Translators: Time in 12h format */
#: ../js/misc/util.js:220
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/misc/util.js:226
msgid "Yesterday, %l%M %p"
msgstr "Včera, %l:%M %p"
# DK: je tento format casu spravne? neviem zistit co ktore premenne znamenaju.
# ma sa v preklade zmenit "%e" na "%d" ?
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/misc/util.js:232
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/misc/util.js:238
msgid "%B %d, %l%M %p"
msgstr "%d. %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"*/
#: ../js/misc/util.js:244
msgid "%B %d %Y, %l%M %p"
msgstr "%d. %B %Y, %l:%M %p"
# PM: Nie som si istý
# TRANSLATORS: this is the title of the wifi captive portal login
# window, until we know the title of the actual login page
@@ -336,31 +400,31 @@ msgstr "Spustenie „%s“ zlyhalo:"
msgid "Web Authentication Redirect"
msgstr "Presmerovanie webového overenia totožnosti"
#: ../js/ui/appDisplay.js:785
#: ../js/ui/appDisplay.js:789
msgid "Frequently used applications will appear here"
msgstr "Tu sa objavia často používané aplikácie"
#: ../js/ui/appDisplay.js:905
#: ../js/ui/appDisplay.js:909
msgid "Frequent"
msgstr "Často používané"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:916
msgid "All"
msgstr "Všetky"
#: ../js/ui/appDisplay.js:1840
#: ../js/ui/appDisplay.js:1845
msgid "New Window"
msgstr "Nové okno"
#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1873 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Odstrániť z obľúbených"
#: ../js/ui/appDisplay.js:1874
#: ../js/ui/appDisplay.js:1879
msgid "Add to Favorites"
msgstr "Pridať do obľúbených"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1889
msgid "Show Details"
msgstr "Zobraziť podrobnosti"
@@ -374,43 +438,24 @@ msgstr "Program %s bol pridaný medzi obľúbené."
msgid "%s has been removed from your favorites."
msgstr "Program %s bol odstránený z obľúbených."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:649 ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Nastavenia"
#: ../js/ui/backgroundMenu.js:21
#: ../js/ui/backgroundMenu.js:19
msgid "Change Background…"
msgstr "Zmeniť pozadie…"
#: ../js/ui/backgroundMenu.js:21
msgid "Display Settings"
msgstr "Nastavenia displeja"
#: ../js/ui/backgroundMenu.js:22 ../js/ui/panel.js:650 ../js/ui/status/system.js:357
msgid "Settings"
msgstr "Nastavenia"
#. Translators: Enter 0-6 (Sunday-Saturday) for non-work days. Examples: "0" (Sunday) "6" (Saturday) "06" (Sunday and Saturday). */
#: ../js/ui/calendar.js:52
#: ../js/ui/calendar.js:53
msgctxt "calendar-no-work"
msgid "06"
msgstr "06"
#. 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:81
msgctxt "event list time"
msgid "All Day"
msgstr "Celý deň"
#. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */
#: ../js/ui/calendar.js:88 ../js/ui/calendar.js:1596
msgctxt "event list time"
msgid "%H%M"
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 */
#: ../js/ui/calendar.js:97
msgctxt "event list time"
msgid "%l%M%p"
msgstr "%l%M%p"
# MČ: nemali by tu byť tiež jednopísmenové? Občas som videl v kolendároch aj také použiť a ďalej sú dvojpísmenové.
# PK: v grid to skratene bude, inac v liste to moze byt 2 pismenove, kedze aj v
# originale dali Su
@@ -419,86 +464,94 @@ 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:111
#: ../js/ui/calendar.js:82
msgctxt "grid sunday"
msgid "S"
msgstr "N"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:113
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "P"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:115
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "U"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:117
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "S"
#. Translators: Calendar grid abbreviation for Thursday */
#: ../js/ui/calendar.js:119
#: ../js/ui/calendar.js:90
msgctxt "grid thursday"
msgid "T"
msgstr "Š"
#. Translators: Calendar grid abbreviation for Friday */
#: ../js/ui/calendar.js:121
#: ../js/ui/calendar.js:92
msgctxt "grid friday"
msgid "F"
msgstr "P"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:123
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:590
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "Predchádzajúci mesiac"
#: ../js/ui/calendar.js:600
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "Nasledujúci mesiac"
#: ../js/ui/calendar.js:807
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "%V. týždeň"
#: ../js/ui/calendar.js:1263
#. 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:1187
msgctxt "event list time"
msgid "All Day"
msgstr "Celý deň"
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "Vymazať úsek"
#: ../js/ui/calendar.js:1455
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "Udalosti"
#: ../js/ui/calendar.js:1463
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/calendar.js:1467
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:1560
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "Oznámenia"
#: ../js/ui/calendar.js:1700
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "Žiadne oznámenia"
#: ../js/ui/calendar.js:1703
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "Žiadne udalosti"
@@ -524,72 +577,76 @@ msgstr "Heslo:"
msgid "Type again:"
msgstr "Zadajte znovu:"
#: ../js/ui/components/networkAgent.js:138 ../js/ui/status/network.js:277 ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
#: ../js/ui/components/networkAgent.js:140 ../js/ui/status/network.js:277 ../js/ui/status/network.js:359 ../js/ui/status/network.js:919
msgid "Connect"
msgstr "Pripojiť"
#: ../js/ui/components/networkAgent.js:231 ../js/ui/components/networkAgent.js:243 ../js/ui/components/networkAgent.js:271 ../js/ui/components/networkAgent.js:291 ../js/ui/components/networkAgent.js:301
#: ../js/ui/components/networkAgent.js:233 ../js/ui/components/networkAgent.js:245 ../js/ui/components/networkAgent.js:273 ../js/ui/components/networkAgent.js:293 ../js/ui/components/networkAgent.js:303
msgid "Password: "
msgstr "Heslo: "
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "Kľúč: "
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "Identita: "
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "Heslo k súkromnému kľúču: "
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "Služba: "
#: ../js/ui/components/networkAgent.js:318
#: ../js/ui/components/networkAgent.js:320 ../js/ui/components/networkAgent.js:658
msgid "Authentication required by wireless network"
msgstr "Bezdrôtová sieť vyžaduje overenie totožnosti"
#: ../js/ui/components/networkAgent.js:319
#: ../js/ui/components/networkAgent.js:321 ../js/ui/components/networkAgent.js:659
#, javascript-format
msgid "Passwords or encryption keys are required to access the wireless network “%s”."
msgstr "Na prístup do bezdrôtovej siete „%s“ sú vyžadované heslá alebo šifrovacie kľúče."
#: ../js/ui/components/networkAgent.js:323
#: ../js/ui/components/networkAgent.js:325 ../js/ui/components/networkAgent.js:662
msgid "Wired 802.1X authentication"
msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "Názov siete: "
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332 ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "Overenie totožnosti k DSL"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339 ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "Požaduje sa kód PIN"
#: ../js/ui/components/networkAgent.js:338
#: ../js/ui/components/networkAgent.js:340 ../js/ui/components/networkAgent.js:673
msgid "PIN code is needed for the mobile broadband device"
msgstr "Pre zariadenie mobilnej širokopásmovej siete je potrebný kód PIN"
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:341
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:345
#: ../js/ui/components/networkAgent.js:348 ../js/ui/components/networkAgent.js:679
msgid "Mobile broadband network password"
msgstr "Heslo k mobilnej širokopásmovej sieti"
#: ../js/ui/components/networkAgent.js:346
#: ../js/ui/components/networkAgent.js:349 ../js/ui/components/networkAgent.js:663 ../js/ui/components/networkAgent.js:667 ../js/ui/components/networkAgent.js:680
#, javascript-format
msgid "A password is required to connect to “%s”."
msgstr "Na pripojenie k „%s“ sa požaduje heslo."
#: ../js/ui/components/networkAgent.js:647 ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Správca siete"
#: ../js/ui/components/polkitAgent.js:54
msgid "Authentication Required"
msgstr "Požaduje sa overenie totožnosti"
@@ -611,74 +668,9 @@ msgstr "Overiť totožnosť"
msgid "Sorry, that didn't work. Please try again."
msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:764 ../js/ui/dateMenu.js:210
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:771
msgid "Yesterday, %H%M"
msgstr "Včera o %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:778
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:785
msgid "%B %d, %H%M"
msgstr "%d. %B, %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:791
msgid "%B %d %Y, %H%M"
msgstr "%d. %B %Y, %H:%M"
#. Translators: Time in 12h format */
#: ../js/ui/components/telepathyClient.js:797 ../js/ui/dateMenu.js:213
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:804
msgid "Yesterday, %l%M %p"
msgstr "Včera, %l:%M %p"
# DK: je tento format casu spravne? neviem zistit co ktore premenne znamenaju.
# ma sa v preklade zmenit "%e" na "%d" ?
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. 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:811
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:818
msgid "%B %d, %l%M %p"
msgstr "%d. %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"*/
#: ../js/ui/components/telepathyClient.js:824
msgid "%B %d %Y, %l%M %p"
msgstr "%d. %B %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:856
#: ../js/ui/components/telepathyClient.js:757
#, javascript-format
msgid "%s is now known as %s"
msgstr "Kontakt %s odteraz vystupuje ako %s"
@@ -692,7 +684,7 @@ msgstr "Okná"
msgid "Show Applications"
msgstr "Zobrazí aplikácie"
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "Dok"
@@ -734,17 +726,17 @@ msgstr "Odhlásenie"
#, 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] "Používateľ %s bude automaticky odhlásený o %d sekúnd."
msgstr[1] "Používateľ %s bude automaticky odhlásený o %d sekundu."
msgstr[2] "Používateľ %s bude automaticky odhlásený o %d sekundy."
msgstr[0] "Používateľ %s bude automaticky odhlásený o %d sekundu."
msgstr[1] "Používateľ %s bude automaticky odhlásený o %d sekundy."
msgstr[2] "Používateľ %s bude automaticky odhlásený o %d sekúnd."
#: ../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] "Budete automaticky odhlásený o %d sekúnd."
msgstr[1] "Budete automaticky odhlásený o %d sekundu."
msgstr[2] "Budete automaticky odhlásený o %d sekundy."
msgstr[0] "Budete automaticky odhlásený o %d sekundu."
msgstr[1] "Budete automaticky odhlásený o %d sekundy."
msgstr[2] "Budete automaticky odhlásený o %d sekúnd."
#: ../js/ui/endSessionDialog.js:78
msgctxt "button"
@@ -765,9 +757,9 @@ msgstr "Inštalácia aktualizácií a vypnutie"
#, 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] "Systém sa automaticky vypne o %d sekúnd."
msgstr[1] "Systém sa automaticky vypne o %d sekundu."
msgstr[2] "Systém sa automaticky vypne o %d sekundy."
msgstr[0] "Systém sa automaticky vypne o %d sekundu."
msgstr[1] "Systém sa automaticky vypne o %d sekundy."
msgstr[2] "Systém sa automaticky vypne o %d sekúnd."
#: ../js/ui/endSessionDialog.js:91
msgctxt "checkbox"
@@ -793,9 +785,9 @@ msgstr "Reštart"
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Systém sa automaticky reštartuje o %d sekúnd."
msgstr[1] "Systém sa automaticky reštartuje o %d sekundu."
msgstr[2] "Systém sa automaticky reštartuje o %d sekundy."
msgstr[0] "Systém sa automaticky reštartuje o %d sekundu."
msgstr[1] "Systém sa automaticky reštartuje o %d sekundy."
msgstr[2] "Systém sa automaticky reštartuje o %d sekúnd."
#: ../js/ui/endSessionDialog.js:119
msgctxt "title"
@@ -806,9 +798,9 @@ msgstr "Reštart a inštalácia aktualizácií"
#, 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] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekúnd."
msgstr[1] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundu."
msgstr[2] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundy."
msgstr[0] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundu."
msgstr[1] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekundy."
msgstr[2] "Systém sa automaticky reštartuje a nainštaluje aktualizácie o %d sekúnd."
#: ../js/ui/endSessionDialog.js:127
msgctxt "button"
@@ -858,10 +850,19 @@ msgstr "Inštalovať"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Stiahnuť a nainštalovať „%s“ z extensions.gnome.org?"
#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:747 ../js/ui/status/keyboard.js:713
msgid "Keyboard"
msgstr "Klávesnica"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:66
msgid "Hide tray"
msgstr "Skryť lištu"
#: ../js/ui/legacyTray.js:107
msgid "Status Icons"
msgstr "Stavová ikona"
#: ../js/ui/lookingGlass.js:643
msgid "No extensions installed"
msgstr "Žiadne nainštalované rozšírenia"
@@ -913,7 +914,7 @@ msgstr "Zobraziť zdroj"
msgid "Web Page"
msgstr "Webová stránka"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:1486
msgid "System Information"
msgstr "Informácie o systéme"
@@ -934,21 +935,21 @@ msgstr "Prehľad"
msgid "Type to search…"
msgstr "Zadajte text na vyhľadanie…"
#: ../js/ui/panel.js:351
#: ../js/ui/panel.js:352
msgid "Quit"
msgstr "Ukončiť"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "Aktivity"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "Horná lišta"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@@ -956,7 +957,7 @@ msgstr "toggle-switch-intl"
msgid "Enter a Command"
msgstr "Zadajte príkaz"
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:162
msgid "Close"
msgstr "Zavrieť"
@@ -977,39 +978,39 @@ msgstr "%A, %e. %B"
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "%d nových správ"
msgstr[1] "%d nová správa"
msgstr[2] "%d nové správy"
msgstr[0] "%d nová správa"
msgstr[1] "%d nové správy"
msgstr[2] "%d nových správ"
#: ../js/ui/screenShield.js:146
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d nových oznámení"
msgstr[1] "%d nové oznámenie"
msgstr[2] "%d nové oznámenia"
msgstr[0] "%d nové oznámenie"
msgstr[1] "%d nové oznámenia"
msgstr[2] "%d nových oznámení"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:365
msgid "Lock"
msgstr "Uzamknúť"
#: ../js/ui/screenShield.js:668
#: ../js/ui/screenShield.js:684
msgid "GNOME needs to lock the screen"
msgstr "Prostredie GNOME vyžaduje uzamknutie obrazovky"
#: ../js/ui/screenShield.js:795 ../js/ui/screenShield.js:1271
#: ../js/ui/screenShield.js:805 ../js/ui/screenShield.js:1271
msgid "Unable to lock"
msgstr "Nepodarilo sa uzamknúť obrazovku"
#: ../js/ui/screenShield.js:796 ../js/ui/screenShield.js:1272
#: ../js/ui/screenShield.js:806 ../js/ui/screenShield.js:1272
msgid "Lock was blocked by an application"
msgstr "Uzamknutie bolo zablokované aplikáciou"
#: ../js/ui/search.js:609
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "Hľadá sa…"
#: ../js/ui/search.js:611
#: ../js/ui/search.js:619
msgid "No results."
msgstr "Žiadne výsledky."
@@ -1076,11 +1077,11 @@ msgstr "Poskakujúce klávesy"
msgid "Mouse Keys"
msgstr "Myš klávesmi"
#: ../js/ui/status/accessibility.js:144
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "Vysoký kontrast"
#: ../js/ui/status/accessibility.js:193
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "Veľký text"
@@ -1100,9 +1101,9 @@ msgstr "Nastavenia Bluetooth"
#, javascript-format
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "%d pripojených zariadení"
msgstr[1] "%d pripojené zariadenie"
msgstr[2] "%d pripojené zariadenia"
msgstr[0] "%d pripojené zariadenie"
msgstr[1] "%d pripojené zariadenia"
msgstr[2] "%d pripojených zariadení"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1310
msgid "Not Connected"
@@ -1113,7 +1114,7 @@ msgid "Brightness"
msgstr "Jas"
# menu item
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:736
msgid "Show Keyboard Layout"
msgstr "Zobraziť rozloženie klávesnice"
@@ -1284,10 +1285,6 @@ msgstr "Nastavenia VPN"
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1657
msgid "Network Manager"
msgstr "Správca siete"
#: ../js/ui/status/network.js:1697
msgid "Activation of network connection failed"
msgstr "Aktivácia pripojenia k sieti zlyhala"
@@ -1331,24 +1328,24 @@ msgstr "Režim v lietadle"
msgid "On"
msgstr "Zapnutý"
#: ../js/ui/status/system.js:317
#: ../js/ui/status/system.js:337
msgid "Switch User"
msgstr "Prepnúť používateľa"
#: ../js/ui/status/system.js:322
#: ../js/ui/status/system.js:342
msgid "Log Out"
msgstr "Odhlásiť sa"
# action button
#: ../js/ui/status/system.js:341
#: ../js/ui/status/system.js:361
msgid "Orientation Lock"
msgstr "Uzamknutie orientácie"
#: ../js/ui/status/system.js:349
#: ../js/ui/status/system.js:369
msgid "Suspend"
msgstr "Uspať"
#: ../js/ui/status/system.js:352
#: ../js/ui/status/system.js:372
msgid "Power Off"
msgstr "Vypnúť"
@@ -1406,13 +1403,13 @@ msgstr "Uchovať zmeny"
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "Zmeny nastavení budú vrátené za %d sekúnd"
msgstr[1] "Zmeny nastavení budú vrátené za %d sekundu"
msgstr[2] "Zmeny nastavení budú vrátené za %d sekundy"
msgstr[0] "Zmeny nastavení budú vrátené za %d sekundu"
msgstr[1] "Zmeny nastavení budú vrátené za %d sekundy"
msgstr[2] "Zmeny nastavení budú vrátené za %d sekúnd"
#. Translators: This represents the size of a window. The first number is
#. * the width of the window and the second is the height. */
#: ../js/ui/windowManager.js:599
#: ../js/ui/windowManager.js:605
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@@ -1447,15 +1444,39 @@ msgstr "Vždy navrchu"
#: ../js/ui/windowMenu.js:89
msgid "Always on Visible Workspace"
msgstr "Vždy vo viditeľnom priestore"
msgstr "Vždy vo viditeľnom pracovnom priestore"
#: ../js/ui/windowMenu.js:106
#: ../js/ui/windowMenu.js:105
msgid "Move to Workspace Left"
msgstr "Presunúť do ľavého pracovného priestoru"
#: ../js/ui/windowMenu.js:110
msgid "Move to Workspace Right"
msgstr "Presunúť do pravého pracovného priestoru"
#: ../js/ui/windowMenu.js:115
msgid "Move to Workspace Up"
msgstr "Presunúť do vyššieho priestoru"
msgstr "Presunúť do vyššieho pracovného priestoru"
#: ../js/ui/windowMenu.js:111
#: ../js/ui/windowMenu.js:120
msgid "Move to Workspace Down"
msgstr "Presunúť do nižšieho priestoru"
msgstr "Presunúť do nižšieho pracovného priestoru"
#: ../js/ui/windowMenu.js:136
msgid "Move to Monitor Up"
msgstr "Presunúť na monitor vyššie"
#: ../js/ui/windowMenu.js:142
msgid "Move to Monitor Down"
msgstr "Presunúť na monitor nižšie"
#: ../js/ui/windowMenu.js:148
msgid "Move to Monitor Left"
msgstr "Presunúť na monitor vľavo"
#: ../js/ui/windowMenu.js:154
msgid "Move to Monitor Right"
msgstr "Presunúť na monitor vpravo"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar"
@@ -1467,9 +1488,9 @@ msgstr "Kalendár Evolution"
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u výstupov"
msgstr[1] "%u výstup"
msgstr[2] "%u výstupy"
msgstr[0] "%u výstup"
msgstr[1] "%u výstupy"
msgstr[2] "%u výstupov"
#. translators:
#. * The number of sound inputs on a particular device
@@ -1477,9 +1498,9 @@ msgstr[2] "%u výstupy"
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u vstupov"
msgstr[1] "%u vstup"
msgstr[2] "%u vstupy"
msgstr[0] "%u vstup"
msgstr[1] "%u vstupy"
msgstr[2] "%u vstupov"
#: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds"
@@ -1501,21 +1522,21 @@ msgstr "Použitie zvláštneho režimu, napr. „gdm“ pre prihlasovaciu obraz
msgid "List possible modes"
msgstr "Zoznam možných režimov"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "Neznámy"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "Zlyhalo spustenie „%s“"
#: ../src/shell-keyring-prompt.c:714
#: ../src/shell-keyring-prompt.c:742
msgid "Passwords do not match."
msgstr "Heslá sa nezhodujú."
#: ../src/shell-keyring-prompt.c:722
#: ../src/shell-keyring-prompt.c:750
msgid "Password cannot be blank"
msgstr "Heslo nemôže byť prázdne"
@@ -1524,6 +1545,14 @@ msgstr "Heslo nemôže byť prázdne"
msgid "Authentication dialog was dismissed by the user"
msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%H%M"
#~ msgctxt "event list time"
#~ msgid "%l%M%p"
#~ msgstr "%l%M%p"
#~ msgid "Invitation"
#~ msgstr "Pozvánka"

1036
po/sl.po

File diff suppressed because it is too large Load Diff

972
po/sr.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