Compare commits

...

73 Commits

Author SHA1 Message Date
a91c1caf42 Bump version to 3.16.3
Update NEWS.
2015-07-02 14:26:44 +02:00
90f14d0762 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-07-02 14:21:38 +02:00
77f2e3abde 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-26 18:04:39 +02:00
a02019cf9e main: Fix a memory leak
We are pointlessly calling g_settings_list_keys() twice, without
freeing the result from the first call.
2015-06-26 18:04:31 +02:00
a341b74aeb 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:04:11 +02:00
9e0a5fa3a9 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:59:41 +02:00
49856d4961 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:21:28 +02:00
4db34fca36 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 14:01:35 +02:00
3dfced7976 Bump version to 3.16.2
Update NEWS.
2015-05-14 15:31:02 +02:00
3e8b7faab8 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:15:54 +02:00
2a3e410d71 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 13:59:48 +02:00
518e7d9fc5 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 13:59:48 +02:00
0954efd875 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-13 19:00:53 +02:00
8d913c5297 make expanders more visible for alt-tab
https://bugzilla.gnome.org/show_bug.cgi?id=745058
2015-05-11 15:21:04 +02:00
58b9b10ed3 Added Occitan translation 2015-05-10 12:29:23 +00:00
sun
fb46f0b808 update zh_CN translation 2015-05-03 10:09:43 +08:00
79c020fdb9 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:34:09 +02:00
f8eb9e763d 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:47 +02:00
ed6cb19283 Updated Icelandic translation 2015-04-27 15:30:20 +00:00
95c903aa40 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:57:56 +02:00
e4974beebf 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:57:56 +02:00
5ec9f15500 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:32:35 +02:00
b4ebb4d98f calendar: make day with events more prominent
https://bugzilla.gnome.org/show_bug.cgi?id=747715
2015-04-15 13:03:18 +02:00
d18ec919dd Bump version to 3.16.1
Update NEWS.
2015-04-14 23:10:16 +02:00
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
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
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
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
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
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
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
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
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
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
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
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
c6d2946ce6 Updated Latvian translation 2015-04-03 20:33:51 +03:00
86304418a9 Updated Dutch translation 3.16 2015-04-03 11:20:40 +02:00
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
8521556723 Update style 2015-03-30 17:40:21 +02:00
9f5ac0e6d5 Updated Russian translation 2015-03-29 18:12:15 +00:00
cc38dd1d49 Updated Russian translation 2015-03-29 18:00:56 +00:00
66a5c0c094 Fixed Russian translation 2015-03-29 09:00:00 +03:00
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
e87656af16 WorkspacesView: remove unused GSettings
https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:12:25 -07:00
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
e1b575dddc System: remove unused GSettings
https://bugzilla.gnome.org/show_bug.cgi?id=746509
2015-03-27 13:12:22 -07:00
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
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
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
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
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
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
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
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
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
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
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
a4b5583995 Updated Slovak translation 2015-03-27 15:47:12 +00:00
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
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
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
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
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
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
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
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
9a01a7ae07 workspacesView: Add missing semicolon 2015-03-26 00:05:38 +01:00
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
2d71456944 Minor fixes the the file header 2015-03-23 21:31:27 +02:00
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
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
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
49 changed files with 4286 additions and 3643 deletions

52
NEWS
View File

@ -1,3 +1,55 @@
3.16.3
======
* Handle touch events in OSK on wayland [Rui; #750287]
* Misc. bug fixes [Florian, Rui, Ray; #749383, #749529, #750714, #751517,
#751541]
Contributors:
Rui Matos, Florian Müllner, Ray Strode
3.16.2
======
* 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]
* Increase visibility of expanders in alt-tab popup [Jakub; #745058]
* Ensure suspend inhibitors are released when VT switched away [Rui; #749228]
* Misc. bug fixes [Rui, Florian; #748541, #749279]
Contributors:
Rui Matos, Florian Müllner, Meet Parikh, Jakub Steiner
Translations:
Sveinn í Felli [is], sun [zh_CN], Cédric Valmary [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]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.16.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[3.16.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -76,7 +76,7 @@ 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.16.0
MUTTER_MIN_VERSION=3.16.1
GTK_MIN_VERSION=3.15.0
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3

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

@ -488,10 +488,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;
@ -561,7 +560,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; }
@ -710,8 +709,9 @@ StScrollBar {
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);

View File

@ -488,10 +488,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;
@ -561,7 +560,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; }
@ -710,8 +709,9 @@ StScrollBar {
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);

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

@ -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);

View File

@ -49,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',
@ -283,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();
@ -496,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;
@ -510,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;
@ -525,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;
@ -574,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;
@ -607,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
@ -616,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
@ -630,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;
@ -641,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;

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,

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,
@ -525,7 +523,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 +753,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 +782,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 +824,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())
@ -1804,8 +1801,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 +1862,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

@ -1106,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) {
@ -1128,6 +1130,8 @@ const Message = new Lang.Class({
this._actionBin.scale_y = 0;
this.expanded = false;
}
this.emit('unexpanded');
},
canClose: function() {
@ -1248,10 +1252,6 @@ const NotificationMessage = new Lang.Class({
this.setUseBodyMarkup(n.bannerBodyMarkup);
},
canClose: function() {
return !this.notification.resident;
},
_onClicked: function() {
this.notification.activate();
},

View File

@ -158,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()];
}));
},
@ -274,13 +266,6 @@ 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.connect('updated', Lang.bind(this,
function() {
if (this._banner && this._banner.expanded)
this._ackMessages();
}));
this._notifyTimeoutId = 0;
this._presence = contact.get_presence_type();
@ -295,11 +280,28 @@ 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');
},
@ -326,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() {
@ -369,9 +372,10 @@ const ChatSource = new Lang.Class({
_updateAvatarIcon: function() {
this.iconUpdated();
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ gicon: this.getIcon() });
if (this._notifiction)
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ gicon: this.getIcon() });
},
open: function() {
@ -412,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 = [];
@ -461,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;
@ -474,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);
},
@ -501,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();
@ -528,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);
},
@ -565,9 +581,10 @@ const ChatSource = new Lang.Class({
},
_presenceChanged: function (contact, presence, status, message) {
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ secondaryGIcon: this.getSecondaryIcon() });
if (this._notification)
this._notification.update(this._notification.title,
this._notification.bannerBodyText,
{ secondaryGIcon: this.getSecondaryIcon() });
},
_pendingRemoved: function(channel, message) {
@ -577,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() {
@ -600,6 +621,13 @@ const ChatNotification = new Lang.Class({
this._timestampTimeoutId = 0;
},
destroy: function(reason) {
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
this._timestampTimeoutId = 0;
this.parent(reason);
},
/**
* appendMessage:
* @message: An object with the properties:
@ -682,6 +710,7 @@ const ChatNotification = new Lang.Class({
// Reset the old message timeout
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
this._timestampTimeoutId = 0;
let message = { realMessage: props.group != 'meta',
showTimestamp: false };
@ -830,6 +859,10 @@ const ChatNotificationBanner = new Lang.Class({
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;

View File

@ -242,8 +242,6 @@ const ShowAppsIcon = new Lang.Class({
_init: function() {
this.parent();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this.toggleButton = new St.Button({ style_class: 'show-apps',
track_hover: true,
can_focus: true,
@ -272,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();
@ -430,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() {
@ -864,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();
@ -943,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

@ -114,6 +114,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,6 +213,10 @@ const Keyboard = new Lang.Class({
this._daemonProxy = null;
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();
@ -725,3 +758,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) {

View File

@ -1,4 +1,5 @@
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;
@ -28,8 +29,9 @@ 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;
@ -100,6 +102,7 @@ const LegacyTray = new Lang.Class({
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 });
@ -173,7 +176,15 @@ const LegacyTray = new Lang.Class({
}));
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) {
@ -204,11 +215,7 @@ const LegacyTray = new Lang.Class({
this._horizontalBarrier.y2 == y2)
return;
if (this._horizontalBarrier) {
this._pressureBarrier.removeBarrier(this._horizontalBarrier);
this._horizontalBarrier.destroy();
this._horizontalBarrier = null;
}
this._unsetBarrier();
let directions = (rtl ? Meta.BarrierDirection.NEGATIVE_X : Meta.BarrierDirection.POSITIVE_X);
this._horizontalBarrier = new Meta.Barrier({ display: global.display,
@ -218,6 +225,15 @@ const LegacyTray = new Lang.Class({
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;
@ -238,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

@ -444,55 +444,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 +512,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);
},

View File

@ -258,6 +258,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) {
@ -508,6 +510,7 @@ 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._buttonBox = null;
@ -753,10 +756,6 @@ const Source = new Lang.Class({
return this.count > 1;
},
get isClearable() {
return !this.isChat && !this.resident;
},
countUpdated: function() {
this.emit('count-updated');
},
@ -929,8 +928,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 });
@ -981,6 +978,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();
@ -1031,9 +1036,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));
@ -1046,9 +1048,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);

View File

@ -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

@ -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;

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

@ -416,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));
@ -434,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

@ -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

@ -295,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" }),
@ -516,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++)
@ -527,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.
@ -605,16 +598,12 @@ 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();
},

View File

@ -17,9 +17,7 @@ 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';
@ -95,10 +93,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 +125,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

View File

@ -197,6 +197,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));
@ -220,6 +222,14 @@ const WorkspaceTracker = new Lang.Class({
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 +239,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 &&
@ -627,6 +641,8 @@ 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) {
@ -915,6 +931,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;
});
@ -1626,14 +1644,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);
@ -1658,9 +1688,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

@ -167,6 +167,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 +184,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

@ -50,6 +50,7 @@ nb
ne
nl
nn
oc
or
pa
pl

View File

@ -6,7 +6,7 @@
# Ibrahim Saed <ibraheem5000@gmail.com>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-22 15:29+0200\n"
"PO-Revision-Date: 2015-03-22 15:55+0200\n"
@ -19,7 +19,6 @@ msgstr ""
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Virtaal 0.7.1\n"
"&& n%100<=10 ? 3: n%100>=11 ? 4 : 5;\n"
"X-Project-Style: gnome\n"
#: ../data/50-gnome-shell-system.xml.in.h:1

933
po/is.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

1348
po/nl.po

File diff suppressed because it is too large Load Diff

2115
po/oc.po Normal file

File diff suppressed because it is too large Load Diff

244
po/ru.po
View File

@ -19,8 +19,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-16 17:46+0000\n"
"PO-Revision-Date: 2015-03-16 22:16+0300\n"
"POT-Creation-Date: 2015-03-29 18:01+0000\n"
"PO-Revision-Date: 2015-03-29 20:32+0300\n"
"Last-Translator: Stas Solovey <whats_up@tut.by>\n"
"Language-Team: Русский <gnome-cyr@gnome.org>\n"
"Language: ru\n"
@ -29,7 +29,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
"X-Generator: Gtranslator 2.91.6\n"
"X-Generator: Gtranslator 2.91.7\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -310,12 +310,12 @@ msgstr "Задержка изменения фокуса в режиме мыш
msgid "Network Login"
msgstr "Сетевая авторизация"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Возникла ошибка загрузки диалогового окна параметров для %s:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "Расширения GNOME Shell"
@ -340,25 +340,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "Войти"
#: ../js/gdm/loginDialog.js:280
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "Выбрать сеанс"
#: ../js/gdm/loginDialog.js:421
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "Нет в списке?"
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:840
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(например, пользователь или %s)"
#: ../js/gdm/loginDialog.js:835 ../js/ui/components/networkAgent.js:271
#: ../js/gdm/loginDialog.js:845 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Имя пользователя: "
#: ../js/gdm/loginDialog.js:1170
#: ../js/gdm/loginDialog.js:1173
msgid "Login Window"
msgstr "Окно входа в систему"
@ -456,31 +456,31 @@ msgstr "%d %b. %Y, %l%M %p"
msgid "Web Authentication Redirect"
msgstr "Перенаправление для проверки подлинности"
#: ../js/ui/appDisplay.js:792
#: ../js/ui/appDisplay.js:788
msgid "Frequently used applications will appear here"
msgstr "Здесь появляются часто используемые приложения"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:908
msgid "Frequent"
msgstr "Популярные"
#: ../js/ui/appDisplay.js:919
#: ../js/ui/appDisplay.js:915
msgid "All"
msgstr "Все"
#: ../js/ui/appDisplay.js:1850
#: ../js/ui/appDisplay.js:1844
msgid "New Window"
msgstr "Новое окно"
#: ../js/ui/appDisplay.js:1878 ../js/ui/dash.js:291
#: ../js/ui/appDisplay.js:1872 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "Удалить из избранного"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1878
msgid "Add to Favorites"
msgstr "Добавить в избранное"
#: ../js/ui/appDisplay.js:1894
#: ../js/ui/appDisplay.js:1888
msgid "Show Details"
msgstr "Показать подробности"
@ -495,7 +495,7 @@ msgid "%s has been removed from your favorites."
msgstr "Приложение %s удалено из избранного."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:337
#: ../js/ui/status/system.js:334
msgid "Settings"
msgstr "Параметры"
@ -555,55 +555,55 @@ msgctxt "grid saturday"
msgid "S"
msgstr "Сб"
#: ../js/ui/calendar.js:563
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "Предыдущий месяц"
#: ../js/ui/calendar.js:573
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "Следующий месяц"
#: ../js/ui/calendar.js:780
#: ../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:1182
#: ../js/ui/calendar.js:1187
msgctxt "event list time"
msgid "All Day"
msgstr "Весь день"
#: ../js/ui/calendar.js:1288
#: ../js/ui/calendar.js:1293
msgid "Clear section"
msgstr "Очистить секцию"
#: ../js/ui/calendar.js:1515
#: ../js/ui/calendar.js:1520
msgid "Events"
msgstr "События"
# fix для даты в календаре и на экране блокировки, за разъяснением обращаться к Stas Solovey <whats_up@tut.by>
#: ../js/ui/calendar.js:1524
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %d %b."
# fix для даты в календаре и на экране блокировки
#: ../js/ui/calendar.js:1528
#: ../js/ui/calendar.js:1533
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %b. %Y"
#: ../js/ui/calendar.js:1613
#: ../js/ui/calendar.js:1618
msgid "Notifications"
msgstr "Уведомления"
#: ../js/ui/calendar.js:1764
#: ../js/ui/calendar.js:1769
msgid "No Notifications"
msgstr "Уведомлений нет"
#: ../js/ui/calendar.js:1767
#: ../js/ui/calendar.js:1772
msgid "No Events"
msgstr "Событий нет"
@ -738,7 +738,7 @@ msgstr "Не удалось подтвердить подлинность. По
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:775
#: ../js/ui/components/telepathyClient.js:732
#, javascript-format
msgid "%s is now known as %s"
msgstr "Контакт %s теперь известен как %s"
@ -747,11 +747,11 @@ msgstr "Контакт %s теперь известен как %s"
msgid "Windows"
msgstr "Окна"
#: ../js/ui/dash.js:252 ../js/ui/dash.js:293
#: ../js/ui/dash.js:250 ../js/ui/dash.js:291
msgid "Show Applications"
msgstr "Показать приложения"
#: ../js/ui/dash.js:453
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "Панель приложений"
@ -927,7 +927,7 @@ msgstr "Установить"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Загрузить и установить расширение «%s» из extensions.gnome.org?"
#: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:580
#: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:724
msgid "Keyboard"
msgstr "Клавиатура"
@ -936,7 +936,7 @@ msgstr "Клавиатура"
msgid "Hide tray"
msgstr "Скрыть лоток"
#: ../js/ui/legacyTray.js:104
#: ../js/ui/legacyTray.js:105
msgid "Status Icons"
msgstr "Значки состояния"
@ -992,7 +992,7 @@ msgstr "Показать код"
msgid "Web Page"
msgstr "Веб-страница"
#: ../js/ui/messageTray.js:2133
#: ../js/ui/messageTray.js:1507
msgid "System Information"
msgstr "Системная информация"
@ -1065,7 +1065,7 @@ msgstr[0] "%d новое уведомление"
msgstr[1] "%d новых уведомления"
msgstr[2] "%d новых уведомлений"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:342
msgid "Lock"
msgstr "Заблокировать"
@ -1081,11 +1081,11 @@ msgstr "Не удалось заблокировать"
msgid "Lock was blocked by an application"
msgstr "Блокировке помешало приложение"
#: ../js/ui/search.js:616
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "Поиск…"
#: ../js/ui/search.js:618
#: ../js/ui/search.js:619
msgid "No results."
msgstr "Ничего не найдено."
@ -1149,11 +1149,11 @@ msgstr "Отскакивающие клавиши"
msgid "Mouse Keys"
msgstr "Клавиши мыши"
#: ../js/ui/status/accessibility.js:144
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "Высокая контрастность"
#: ../js/ui/status/accessibility.js:193
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "Крупный текст"
@ -1188,7 +1188,7 @@ msgstr "Не подключено"
msgid "Brightness"
msgstr "Яркость"
#: ../js/ui/status/keyboard.js:603
#: ../js/ui/status/keyboard.js:747
msgid "Show Keyboard Layout"
msgstr "Показать раскладку клавиатуры"
@ -1373,19 +1373,21 @@ msgstr "Полностью заряжена"
msgid "Estimating…"
msgstr "Выполняется подсчёт…"
# нужно в две строки, иначе не влезает в выпадающую панель
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr ""
"Разряжается (%d%%)\n"
"Осталось — %d%02d"
"Осталось %02d ч. %d мин.\n"
"Разряжается (%d%%)"
# нужно в две строки, иначе не влезает в выпадающую панель
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgstr ""
"Заряжается (%d%%)\n"
"До полной — %d%02d"
"До полной %02d ч. %d мин.\n"
"Заряжается (%d%%)"
# Источник Бесперебойного Питания
#: ../js/ui/status/power.js:119
@ -1404,23 +1406,23 @@ msgstr "Режим авиаперелёта"
msgid "On"
msgstr "Включено"
#: ../js/ui/status/system.js:317
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "Сменить пользователя"
#: ../js/ui/status/system.js:322
#: ../js/ui/status/system.js:319
msgid "Log Out"
msgstr "Завершить сеанс"
#: ../js/ui/status/system.js:341
#: ../js/ui/status/system.js:338
msgid "Orientation Lock"
msgstr "Заблокировать положение"
#: ../js/ui/status/system.js:349
#: ../js/ui/status/system.js:346
msgid "Suspend"
msgstr "Ждущий режим"
#: ../js/ui/status/system.js:352
#: ../js/ui/status/system.js:349
msgid "Power Off"
msgstr "Выключить"
@ -1482,7 +1484,7 @@ msgstr[2] "Изменения параметров будут отменены
#. 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:613
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1593,143 +1595,3 @@ msgstr "Пароль не может быть пустым"
#: ../src/shell-polkit-authentication-agent.c:346
msgid "Authentication dialog was dismissed by the user"
msgstr "Аутентификация отклонена пользователем"
#~ 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 "Приглашение"
#~ msgid "Call"
#~ msgstr "Вызов"
#~ msgid "File Transfer"
#~ msgstr "Передача файлов"
#~ msgid "Chat"
#~ msgstr "Чат"
#~ msgid "Invitation to %s"
#~ msgstr "Приглашение в %s"
#~ msgid "%s is inviting you to join %s"
#~ msgstr "%s приглашает вас присоединиться к %s"
#~ msgid "Decline"
#~ msgstr "Отказаться"
#~ msgid "Accept"
#~ msgstr "Принять"
#~ msgid "Video call from %s"
#~ msgstr "Видеозвонок от %s"
#~ msgid "Call from %s"
#~ msgstr "Вас вызывает %s"
#~ msgid "Answer"
#~ msgstr "Ответить"
#~ msgid "%s is sending you %s"
#~ msgstr "%s отправляет вам %s"
#~ msgid "%s would like permission to see when you are online"
#~ msgstr "%s хочет видеть, когда вы доступны в сети"
#~ msgid "Network error"
#~ msgstr "Ошибка сети"
#~ msgid "Authentication failed"
#~ msgstr "Ошибка аутентификации"
#~ msgid "Encryption error"
#~ msgstr "Ошибка шифрования"
#~ msgid "Certificate not provided"
#~ msgstr "Сертификат не предоставляется"
#~ msgid "Certificate untrusted"
#~ msgstr "Недоверенный сертификат"
#~ msgid "Certificate expired"
#~ msgstr "Срок действия сертификата истёк"
#~ msgid "Certificate not activated"
#~ msgstr "Сертификат не активирован"
#~ msgid "Certificate hostname mismatch"
#~ msgstr "Имя узла сертификата не совпадает"
#~ msgid "Certificate fingerprint mismatch"
#~ msgstr "Отпечаток сертификата не совпадает"
#~ msgid "Certificate self-signed"
#~ msgstr "Самоподписанный сертификат"
#~ msgid "Status is set to offline"
#~ msgstr "Установлен статус «не в сети»"
#~ msgid "Encryption is not available"
#~ msgstr "Шифрование недоступно"
#~ msgid "Certificate is invalid"
#~ msgstr "Недействительный сертификат"
#~ msgid "Connection has been refused"
#~ msgstr "В соединении отказано"
#~ msgid "Connection can't be established"
#~ msgstr "Соединение не может быть установлено"
#~ msgid "Connection has been lost"
#~ msgstr "Соединение потеряно"
#~ msgid "This account is already connected to the server"
#~ msgstr "Эта учётная запись уже подключена к серверу"
#~ msgid ""
#~ "Connection has been replaced by a new connection using the same resource"
#~ msgstr "Соединение было заменено новым, используя тот же источник"
#~ msgid "The account already exists on the server"
#~ msgstr "Учётная запись уже существует на сервере"
#~ msgid "Server is currently too busy to handle the connection"
#~ msgstr ""
#~ "Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
#~ msgid "Certificate has been revoked"
#~ msgstr "Сертификат аннулирован"
#~ msgid ""
#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak"
#~ msgstr ""
#~ "Сертификат использует небезопасный алгоритм шифрования или он "
#~ "криптографически нестоек"
#~ msgid ""
#~ "The length of the server certificate, or the depth of the server "
#~ "certificate chain, exceed the limits imposed by the cryptography library"
#~ msgstr ""
#~ "Длина сертификата сервера, или глубина цепочки сертификатов сервера, "
#~ "превышает пределы, установленные библиотекой криптографии"
#~ msgid "Internal error"
#~ msgstr "Внутренняя ошибка"
#~ msgid "Unable to connect to %s"
#~ msgstr "Не удалось подключиться к %s"
#~ msgid "View account"
#~ msgstr "Показать учётную запись"
#~ msgid "Unknown reason"
#~ msgstr "Неизвестная причина"
#~ msgid "Show the message list"
#~ msgstr "Показать список уведомлений"

361
po/sk.po
View File

@ -7,10 +7,9 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-\n"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-13 16:16+0000\n"
"PO-Revision-Date: 2015-03-13 17:44+0100\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-27 08:57+0000\n"
"PO-Revision-Date: 2015-03-27 16:41+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n"
@ -19,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-DamnedLies-Scope: partial\n"
"X-Generator: Vé 0.1.4\n"
"X-Generator: Poedit 1.7.4\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -53,8 +52,7 @@ msgstr "Otvoriť ponuku aplikácií"
msgid "GNOME Shell"
msgstr "Shell prostredia GNOME"
#: ../data/gnome-shell.desktop.in.in.h:2
#: ../data/gnome-shell-wayland.desktop.in.in.h:2
#: ../data/gnome-shell.desktop.in.in.h:2 ../data/gnome-shell-wayland.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Správa okien a spúšťanie aplikácií"
@ -72,17 +70,11 @@ msgstr "Shell prostredia GNOME (kompozitor pre wayland)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Povoliť vnútorné nástroje užitočné pre vývojárov a testerov z dialógového "
"okna Alt-F2"
msgstr "Povoliť vnútorné nástroje užitočné pre vývojárov a testerov z dialógového okna Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Umožňuje prístup k vnútorným ladiacim a sledovacím nástrojom pomocou "
"dialógového okna Alt-F2."
msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog."
msgstr "Umožňuje prístup k vnútorným ladiacim a sledovacím nástrojom pomocou dialógového okna Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "UUIDs of extensions to enable"
@ -90,43 +82,28 @@ msgstr "Vlastnosť UUID rozšírení určených na povolenie"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
msgid ""
"GNOME Shell extensions have a UUID property; this key lists extensions which "
"should be loaded. Any extension that wants to be loaded needs to be in this "
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
"GNOME Shell extensions have a UUID property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension D-Bus methods on "
"org.gnome.Shell."
msgstr ""
"Rozšírenia pre Shell prostredia GNOME majú vlastnosť UUID; tento kľúč "
"obsahuje zoznam rozšírení, ktoré by mali byť načítané. Každé rozšírenie, "
"ktoré je potrebné načítať, musí byť v tomto zozname. Tento zoznam môžete "
"upraviť aj ručne pomocou metód DBus EnableExtension a DisableExtension v org."
"gnome.Shell."
"Rozšírenia pre Shell prostredia GNOME majú vlastnosť UUID; tento kľúč obsahuje zoznam rozšírení, ktoré by mali byť načítané. Každé rozšírenie, ktoré je potrebné načítať, musí byť v tomto zozname. Tento zoznam môžete upraviť aj ručne pomocou metód DBus "
"EnableExtension a DisableExtension v org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility"
msgstr "Zakáže kontrolu kompatibility verzií rozšírení"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid ""
"GNOME Shell will only load extensions that claim to support the current "
"running version. Enabling this option will disable this check and try to "
"load all extensions regardless of the versions they claim to support."
msgid "GNOME Shell will only load extensions that claim to support the current running version. Enabling this option will disable this check and try to load all extensions regardless of the versions they claim to support."
msgstr ""
"Shell prostredia GNOME načíta len rozšírenia, ktoré deklarujú podporu pre "
"práve spustenú verziu prostredia. Povolením tejto voľby zakážete túto "
"kontrolu a umožníte načítanie všetkých rozšírení bez ohľadu na to, pre ktorú "
"verziu prostredia deklarujú podporu."
"Shell prostredia GNOME načíta len rozšírenia, ktoré deklarujú podporu pre práve spustenú verziu prostredia. Povolením tejto voľby zakážete túto kontrolu a umožníte načítanie všetkých rozšírení bez ohľadu na to, pre ktorú verziu prostredia deklarujú podporu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
msgstr "Zoznam identifikátorov súborov plochy pre obľúbené aplikácie"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Aplikácie zodpovedajúce týmto identifikátorom budú zobrazené medzi "
"obľúbenými aplikáciami."
msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
msgstr "Aplikácie zodpovedajúce týmto identifikátorom budú zobrazené medzi obľúbenými aplikáciami."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
@ -153,32 +130,18 @@ msgstr "Vždy zobraziť položku „Odhlásiť sa“ v ponuke používateľa."
# description
#: ../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 ""
"Tento kľúč preváži automatické skrývanie položky „Odhlásiť sa“ v situáciách "
"s jedným používateľom alebo jednou reláciou."
msgid "This key overrides the automatic hiding of the 'Log out' menu item in single-user, single-session situations."
msgstr "Tento kľúč preváži automatické skrývanie položky „Odhlásiť sa“ v situáciách s jedným používateľom alebo jednou reláciou."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Whether to remember password for mounting encrypted or remote filesystems"
msgstr ""
"Určiť, či bude zapamätané heslo pre pripojenie zašifrovaných alebo "
"prenosných súborových systémov"
msgstr "Určiť, či bude zapamätané heslo pre pripojenie zašifrovaných alebo prenosných súborových systémov"
# description
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
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 "
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"Shell bude po pripojení zašifrovaného alebo prenosného súborového systému "
"požadovať heslo. Ak bude možné toto heslo uložiť pre neskoršie použitie, "
"zobrazí sa zaškrtávacie pole „Zapamätať heslo“. Tento kľúč nastaví "
"predvolený stav zaškrtávacieho poľa."
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 'Remember Password' checkbox will be present. This key sets the default state of the checkbox."
msgstr "Shell bude po pripojení zašifrovaného alebo prenosného súborového systému požadovať heslo. Ak bude možné toto heslo uložiť pre neskoršie použitie, zobrazí sa zaškrtávacie pole „Zapamätať heslo“. Tento kľúč nastaví predvolený stav zaškrtávacieho poľa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar"
@ -201,11 +164,8 @@ msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade "
"aktivít."
msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Klávesová skratka na otvorenie pohľadu „Zobraziť aplikácie“ v prehľade aktivít."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to open the overview"
@ -233,11 +193,8 @@ msgstr "Klávesová skratka, s ktorou sa zamerá na aktívne oznámenia."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid ""
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr ""
"Klávesová skratka, ktorá pozastaví a znovu spustí všetky animácie(tween), "
"pre ladiace účely"
msgid "Keybinding that pauses and resumes all running tweens, for debugging purposes"
msgstr "Klávesová skratka, ktorá pozastaví a znovu spustí všetky animácie(tween), pre ladiace účely"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "Which keyboard to use"
@ -254,35 +211,21 @@ msgstr "Obmedziť prepínač na aktuálny pracovný priestor."
# desc
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid ""
"If true, only applications that have windows on the current workspace are "
"shown in the switcher. Otherwise, all applications are included."
msgstr ""
"Ak je true, iba aplikácie, ktoré majú okná na aktuálnom pracovnom priestore "
"budú zobrazené v prepínači. Inak budú zahrnuté všetky aplikácie."
msgid "If true, only applications that have windows on the current workspace are shown in the switcher. Otherwise, all applications are included."
msgstr "Ak je true, iba aplikácie, ktoré majú okná na aktuálnom pracovnom priestore budú zobrazené v prepínači. Inak budú zahrnuté všetky aplikácie."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
msgid "The application icon mode."
msgstr "Režim ikonizácie aplikácií."
#: ../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 ""
"Konfiguruje, ako sa majú zobraziť okná v prepínači. Platné možnosti sú "
"„thumbnail-only“ (zobrazí miniatúru okna), „app-icon-only“ (zobrazí iba "
"ikonu aplikácie) alebo „both“ (zobrazí oboje)."
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 "Konfiguruje, ako sa majú zobraziť okná v prepínači. Platné možnosti sú „thumbnail-only“ (zobrazí miniatúru okna), „app-icon-only“ (zobrazí iba ikonu aplikácie) alebo „both“ (zobrazí oboje)."
# desc
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid ""
"If true, only windows from the current workspace are shown in the switcher. "
"Otherwise, all windows are included."
msgstr ""
"Ak je true, iba okná z aktuálneho pracovného priestoru budú zobrazené v "
"prepínači. Inak budú zahrnuté všetky okná."
msgid "If true, only windows from the current workspace are shown in the switcher. Otherwise, all windows are included."
msgstr "Ak je true, iba okná z aktuálneho pracovného priestoru budú zobrazené v prepínači. Inak budú zahrnuté všetky okná."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Attach modal dialog to the parent window"
@ -290,9 +233,7 @@ msgstr "Pripojiť modálne dialógové okno k rodičovskému oknu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Tento kľúč preváži kľúč v org.gnome.mutter po spustení Shellu prostredia "
"GNOME."
msgstr "Tento kľúč preváži kľúč v org.gnome.mutter po spustení Shellu prostredia GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "Enable edge tiling when dropping windows on screen edges"
@ -324,10 +265,7 @@ msgstr "Vyskytla sa chyba pri načítavaní dialógového okna nastavení pre %s
msgid "GNOME Shell Extensions"
msgstr "Rozšírenia pre Shell prostredia GNOME"
#: ../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
#: ../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ť"
@ -335,8 +273,7 @@ msgstr "Zrušiť"
msgid "Next"
msgstr "Ďalej"
#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59
#: ../js/gdm/authPrompt.js:213 ../js/ui/shellMountOperation.js:403 ../js/ui/unlockDialog.js:59
msgid "Unlock"
msgstr "Odomknúť"
@ -346,26 +283,25 @@ msgid "Sign In"
msgstr "Prihlásiť sa"
# button
#: ../js/gdm/loginDialog.js:280
#: ../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:421
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "Nie ste v zozname?"
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:840
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(napr., používateľ alebo %s)"
#: ../js/gdm/loginDialog.js:835 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
#: ../js/gdm/loginDialog.js:845 ../js/ui/components/networkAgent.js:271 ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "Používateľské meno: "
#: ../js/gdm/loginDialog.js:1170
#: ../js/gdm/loginDialog.js:1173
msgid "Login Window"
msgstr "Prihlasovacie okno"
@ -502,8 +438,7 @@ 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:650
#: ../js/ui/status/system.js:337
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650 ../js/ui/status/system.js:337
msgid "Settings"
msgstr "Nastavenia"
@ -566,53 +501,53 @@ msgctxt "grid saturday"
msgid "S"
msgstr "S"
#: ../js/ui/calendar.js:563
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "Predchádzajúci mesiac"
#: ../js/ui/calendar.js:573
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "Nasledujúci mesiac"
#: ../js/ui/calendar.js:780
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "%V. týždeň"
#. 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
#: ../js/ui/calendar.js:1183
msgctxt "event list time"
msgid "All Day"
msgstr "Celý deň"
#: ../js/ui/calendar.js:1288
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "Vymazať úsek"
#: ../js/ui/calendar.js:1515
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "Udalosti"
#: ../js/ui/calendar.js:1524
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%A, %e. %B"
#: ../js/ui/calendar.js:1528
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:1613
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "Oznámenia"
#: ../js/ui/calendar.js:1764
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "Žiadne oznámenia"
#: ../js/ui/calendar.js:1767
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "Žiadne udalosti"
@ -638,16 +573,11 @@ msgstr "Heslo:"
msgid "Type again:"
msgstr "Zadajte znovu:"
#: ../js/ui/components/networkAgent.js:140 ../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: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
#: ../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: "
@ -667,23 +597,16 @@ msgstr "Heslo k súkromnému kľúču: "
msgid "Service: "
msgstr "Služba: "
#: ../js/ui/components/networkAgent.js:320
#: ../js/ui/components/networkAgent.js:658
#: ../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:321
#: ../js/ui/components/networkAgent.js:659
#: ../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."
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:325
#: ../js/ui/components/networkAgent.js:662
#: ../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"
@ -691,18 +614,15 @@ msgstr "Overenie totožnosti k drôtovej sieti 802.1X"
msgid "Network name: "
msgstr "Názov siete: "
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
#: ../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:339
#: ../js/ui/components/networkAgent.js:672
#: ../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:340
#: ../js/ui/components/networkAgent.js:673
#: ../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"
@ -710,15 +630,11 @@ msgstr "Pre zariadenie mobilnej širokopásmovej siete je potrebný kód PIN"
msgid "PIN: "
msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:348
#: ../js/ui/components/networkAgent.js:679
#: ../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:349
#: ../js/ui/components/networkAgent.js:663
#: ../js/ui/components/networkAgent.js:667
#: ../js/ui/components/networkAgent.js:680
#: ../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."
@ -750,7 +666,7 @@ msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
#. Translators: this is the other person changing their old IM name to their new
#. IM name. */
#: ../js/ui/components/telepathyClient.js:775
#: ../js/ui/components/telepathyClient.js:728
#, javascript-format
msgid "%s is now known as %s"
msgstr "Kontakt %s odteraz vystupuje ako %s"
@ -806,17 +722,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"
@ -837,9 +753,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"
@ -865,9 +781,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"
@ -877,14 +793,10 @@ msgstr "Reštart a inštalácia aktualizácií"
#: ../js/ui/endSessionDialog.js:121
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
"The system will automatically restart and install updates in %d seconds."
msgstr[0] ""
"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."
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 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"
@ -903,9 +815,7 @@ msgstr "Vypnúť po inštalácii aktualizácií"
#: ../js/ui/endSessionDialog.js:338
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Systém je napájaný z batérie. Pred inštaláciou aktualizácií pripojte "
"napájací zdroj."
msgstr "Systém je napájaný z batérie. Pred inštaláciou aktualizácií pripojte napájací zdroj."
#: ../js/ui/endSessionDialog.js:355
msgid "Some applications are busy or have unsaved work."
@ -936,17 +846,16 @@ 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:580
#: ../js/ui/keyboard.js:714 ../js/ui/status/keyboard.js:724
msgid "Keyboard"
msgstr "Klávesnica"
#. translators: 'Hide' is a verb */
#: ../js/ui/legacyTray.js:59
#| msgid "Hide Text"
#: ../js/ui/legacyTray.js:64
msgid "Hide tray"
msgstr "Skryť lištu"
#: ../js/ui/legacyTray.js:91
#: ../js/ui/legacyTray.js:105
msgid "Status Icons"
msgstr "Stavová ikona"
@ -968,8 +877,7 @@ msgstr "Skryť chyby"
msgid "Show Errors"
msgstr "Zobraziť chyby"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71
#: ../js/ui/status/location.js:176
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:71 ../js/ui/status/location.js:176
msgid "Enabled"
msgstr "Povolené"
@ -977,8 +885,7 @@ msgstr "Povolené"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:179 ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Zakázané"
@ -1003,7 +910,7 @@ msgstr "Zobraziť zdroj"
msgid "Web Page"
msgstr "Webová stránka"
#: ../js/ui/messageTray.js:2133
#: ../js/ui/messageTray.js:1507
msgid "System Information"
msgstr "Informácie o systéme"
@ -1067,17 +974,17 @@ 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
msgid "Lock"
@ -1178,10 +1085,7 @@ msgstr "Veľký text"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1282
#: ../js/ui/status/network.js:1393 ../js/ui/status/rfkill.js:91
#: ../js/ui/status/rfkill.js:118
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178 ../js/ui/status/network.js:360 ../js/ui/status/network.js:1282 ../js/ui/status/network.js:1393 ../js/ui/status/rfkill.js:91 ../js/ui/status/rfkill.js:118
msgid "Turn Off"
msgstr "Vypnúť"
@ -1193,9 +1097,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"
@ -1206,7 +1110,7 @@ msgid "Brightness"
msgstr "Jas"
# menu item
#: ../js/ui/status/keyboard.js:603
#: ../js/ui/status/keyboard.js:747
msgid "Show Keyboard Layout"
msgstr "Zobraziť rozloženie klávesnice"
@ -1236,8 +1140,7 @@ msgid "<unknown>"
msgstr "<neznáme>"
# DK: pripojenie, zariadenie
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1308
#: ../js/ui/status/network.js:1512
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1308 ../js/ui/status/network.js:1512
msgid "Off"
msgstr "Vypnuté"
@ -1496,9 +1399,9 @@ 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. */
@ -1557,9 +1460,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
@ -1567,9 +1470,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"
@ -1591,12 +1494,12 @@ 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“"
@ -1712,8 +1615,7 @@ msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "This account is already connected to the server"
#~ msgstr "Tento účet je už pripojený k serveru"
#~ msgid ""
#~ "Connection has been replaced by a new connection using the same resource"
#~ msgid "Connection has been replaced by a new connection using the same resource"
#~ msgstr "Pripojenie bolo nahradené novým, ktoré používa rovnaký zdroj"
#~ msgid "The account already exists on the server"
@ -1725,18 +1627,11 @@ msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "Certificate has been revoked"
#~ msgstr "Certifikát bol zrušený"
#~ msgid ""
#~ "Certificate uses an insecure cipher algorithm or is cryptographically weak"
#~ msgstr ""
#~ "Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je "
#~ "kryptograficky slabý"
#~ msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
#~ msgstr "Šifrovací algoritmus používaný certifikátom nie je bezpečný alebo je kryptograficky slabý"
#~ msgid ""
#~ "The length of the server certificate, or the depth of the server "
#~ "certificate chain, exceed the limits imposed by the cryptography library"
#~ msgstr ""
#~ "Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera "
#~ "presahuje limit stanovený kryptografickou knižnicou."
#~ msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
#~ msgstr "Dĺžka certifikátu servera, alebo hĺbka reťazca certifikátu servera presahuje limit stanovený kryptografickou knižnicou."
#~ msgid "Internal error"
#~ msgstr "Vnútorná chyba"
@ -1846,31 +1741,17 @@ msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgstr "Maximálna úroveň presnosti určenia polohy."
#~ msgid ""
#~ "Configures the maximum level of location accuracy applications are "
#~ "allowed to see. Valid options are 'off' (disable location tracking), "
#~ "'country', 'city', 'neighborhood', 'street', and 'exact' (typically "
#~ "requires GPS receiver). Please keep in mind that this only controls what "
#~ "GeoClue will allow applications to see and they can find user's location "
#~ "on their own using network resources (albeit with street-level accuracy "
#~ "at best)."
#~ "Configures the maximum level of location accuracy applications are allowed to see. Valid options are 'off' (disable location tracking), 'country', 'city', 'neighborhood', 'street', and 'exact' (typically requires GPS receiver). Please keep in mind that "
#~ "this only controls what GeoClue will allow applications to see and they can find user's location on their own using network resources (albeit with street-level accuracy at best)."
#~ msgstr ""
#~ "Konfiguruje maximálnu úroveň presnosti určenia polohy, ktorú aplikácie "
#~ "môžu získať. Povolené sú voľby 'off' (zakáže sledovanie polohy), "
#~ "'country' (krajina), 'city' (mesto), 'neighborhood' (okolie), "
#~ "'street' (ulica), 'exact' (presne, pri čom je štandardne požadované "
#~ "použitie prijímača GPS). Uvedomte si, že toto nastavenie ovplyvňuje "
#~ "povolenia GeoClue a aplikácie môžu tiež získať údaje o polohe použitím "
#~ "sieťových prostriedkov (aj keď prinajlepšom s presnosťou na ulicu)."
#~ "Konfiguruje maximálnu úroveň presnosti určenia polohy, ktorú aplikácie môžu získať. Povolené sú voľby 'off' (zakáže sledovanie polohy), 'country' (krajina), 'city' (mesto), 'neighborhood' (okolie), 'street' (ulica), 'exact' (presne, pri čom je "
#~ "štandardne požadované použitie prijímača GPS). Uvedomte si, že toto nastavenie ovplyvňuje povolenia GeoClue a aplikácie môžu tiež získať údaje o polohe použitím sieťových prostriedkov (aj keď prinajlepšom s presnosťou na ulicu)."
#~ msgid "Arrangement of buttons on the titlebar"
#~ msgstr "Usporiadanie tlačidiel na titulku okna"
#~ msgid ""
#~ "This key overrides the key in org.gnome.desktop.wm.preferences when "
#~ "running GNOME Shell."
#~ msgstr ""
#~ "Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení "
#~ "Shellu prostredia GNOME."
#~ msgid "This key overrides the key in org.gnome.desktop.wm.preferences when running GNOME Shell."
#~ msgstr "Tento kľúč preváži kľúč v org.gnome.desktop.wm.preferences po spustení Shellu prostredia GNOME."
#~ msgid "Extension"
#~ msgstr "Rozšírenie"

View File

@ -21,8 +21,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-03-03 22:33+0000\n"
"PO-Revision-Date: 2015-03-04 17:55+0800\n"
"POT-Creation-Date: 2015-04-25 08:00+0000\n"
"PO-Revision-Date: 2015-04-17 19:36+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"Language: zh_CN\n"
@ -30,6 +30,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.7.5\n"
#: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System"
@ -287,55 +288,55 @@ msgstr "将鼠标模式下焦点的更改推迟到指针停止移动之后"
msgid "Network Login"
msgstr "网络登录"
#: ../js/extensionPrefs/main.js:123
#: ../js/extensionPrefs/main.js:122
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "载入 %s 的首选想对话框出错:"
#: ../js/extensionPrefs/main.js:155
#: ../js/extensionPrefs/main.js:154
msgid "GNOME Shell Extensions"
msgstr "配置 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 "取消"
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:217
#: ../js/gdm/authPrompt.js:169 ../js/gdm/authPrompt.js:215
msgid "Next"
msgstr "下一步"
#: ../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 "解锁"
#: ../js/gdm/authPrompt.js:215
#: ../js/gdm/authPrompt.js:213
msgctxt "button"
msgid "Sign In"
msgstr "登录"
#: ../js/gdm/loginDialog.js:276
#: ../js/gdm/loginDialog.js:281
msgid "Choose Session"
msgstr "选择会话"
#: ../js/gdm/loginDialog.js:417
#: ../js/gdm/loginDialog.js:431
msgid "Not listed?"
msgstr "未列出?"
#: ../js/gdm/loginDialog.js:826
#: ../js/gdm/loginDialog.js:840
#, javascript-format
msgid "(e.g., user or %s)"
msgstr "(如 user 或 %s)"
#: ../js/gdm/loginDialog.js:831 ../js/ui/components/networkAgent.js:269
#: ../js/ui/components/networkAgent.js:287
#: ../js/gdm/loginDialog.js:845 ../js/ui/components/networkAgent.js:271
#: ../js/ui/components/networkAgent.js:289
msgid "Username: "
msgstr "用户名:"
#: ../js/gdm/loginDialog.js:1166
#: ../js/gdm/loginDialog.js:1173
msgid "Login Window"
msgstr "登录窗口"
@ -347,50 +348,112 @@ msgstr "认证出错"
msgid "(or swipe finger)"
msgstr "(或滑动手指)"
#: ../js/misc/util.js:115
#: ../js/misc/util.js:119
msgid "Command not found"
msgstr "命令未找到"
#: ../js/misc/util.js:148
#: ../js/misc/util.js:152
msgid "Could not parse command:"
msgstr "不能解析命令:"
#: ../js/misc/util.js:156
#: ../js/misc/util.js:160
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "运行“%s”失败"
#. 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 "昨天 %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 "%m月%d日, %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/misc/util.js:215
msgid "%B %d %Y, %H%M"
msgstr "%Y年%m月%d日, %H:%M"
#. Translators: Time in 12h format */
#: ../js/misc/util.js:220
msgid "%l%M %p"
msgstr "%p %-l:%M"
#. 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 "昨天%p %-l:%M"
#. 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%p %-l:%M"
#. 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 "%m月%d日%p %-l:%M"
#. 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 "%Y年%m月%d日%p %-l:%M"
#. 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 "网页认证重定向"
#: ../js/ui/appDisplay.js:785
#: ../js/ui/appDisplay.js:788
msgid "Frequently used applications will appear here"
msgstr "常用的应用程序会出现在这里"
#: ../js/ui/appDisplay.js:905
#: ../js/ui/appDisplay.js:908
msgid "Frequent"
msgstr "常用"
#: ../js/ui/appDisplay.js:912
#: ../js/ui/appDisplay.js:915
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:1840
#: ../js/ui/appDisplay.js:1844
msgid "New Window"
msgstr "新窗口"
#: ../js/ui/appDisplay.js:1868 ../js/ui/dash.js:289
#: ../js/ui/appDisplay.js:1872 ../js/ui/dash.js:289
msgid "Remove from Favorites"
msgstr "从收藏夹中移除"
#: ../js/ui/appDisplay.js:1874
#: ../js/ui/appDisplay.js:1878
msgid "Add to Favorites"
msgstr "添加到收藏夹"
#: ../js/ui/appDisplay.js:1884
#: ../js/ui/appDisplay.js:1888
msgid "Show Details"
msgstr "显示细节"
@ -404,8 +467,8 @@ msgstr "%s 已经添加到了您的收藏夹。"
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
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:650
#: ../js/ui/status/system.js:334
msgid "Settings"
msgstr "设置"
@ -414,119 +477,104 @@ msgid "Change Background…"
msgstr "更换壁纸..."
#. 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 "周日和周六"
#. 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 "全天"
#. 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 "%p %-l:%M"
#. 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 "日"
#. Translators: Calendar grid abbreviation for Monday */
#: ../js/ui/calendar.js:113
#: ../js/ui/calendar.js:84
msgctxt "grid monday"
msgid "M"
msgstr "一"
#. Translators: Calendar grid abbreviation for Tuesday */
#: ../js/ui/calendar.js:115
#: ../js/ui/calendar.js:86
msgctxt "grid tuesday"
msgid "T"
msgstr "二"
#. Translators: Calendar grid abbreviation for Wednesday */
#: ../js/ui/calendar.js:117
#: ../js/ui/calendar.js:88
msgctxt "grid wednesday"
msgid "W"
msgstr "三"
#. 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 "五"
#. Translators: Calendar grid abbreviation for Saturday */
#: ../js/ui/calendar.js:123
#: ../js/ui/calendar.js:94
msgctxt "grid saturday"
msgid "S"
msgstr "六"
#: ../js/ui/calendar.js:590
#: ../js/ui/calendar.js:564
msgid "Previous month"
msgstr "上个月"
#: ../js/ui/calendar.js:600
#: ../js/ui/calendar.js:574
msgid "Next month"
msgstr "下个月"
#: ../js/ui/calendar.js:807
#: ../js/ui/calendar.js:781
msgid "Week %V"
msgstr "第 %V 星期"
#: ../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 "全天"
#: ../js/ui/calendar.js:1289
msgid "Clear section"
msgstr "清除选中项目"
#: ../js/ui/calendar.js:1455
#: ../js/ui/calendar.js:1516
msgid "Events"
msgstr "事件"
#: ../js/ui/calendar.js:1463
#: ../js/ui/calendar.js:1525
msgctxt "calendar heading"
msgid "%A, %B %d"
msgstr "%m月%d日 %A"
#: ../js/ui/calendar.js:1467
#: ../js/ui/calendar.js:1529
msgctxt "calendar heading"
msgid "%A, %B %d, %Y"
msgstr "%Y年%m月%d日 %A"
#: ../js/ui/calendar.js:1560
#: ../js/ui/calendar.js:1614
msgid "Notifications"
msgstr "提示"
#: ../js/ui/calendar.js:1700
#: ../js/ui/calendar.js:1765
msgid "No Notifications"
msgstr "无提示"
#: ../js/ui/calendar.js:1703
#: ../js/ui/calendar.js:1768
msgid "No Events"
msgstr "无事件"
@ -551,79 +599,93 @@ msgstr "密码:"
msgid "Type again:"
msgstr "再输一次:"
#: ../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 "连接"
#: ../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 "密码:"
#: ../js/ui/components/networkAgent.js:236
#: ../js/ui/components/networkAgent.js:238
msgid "Key: "
msgstr "密钥:"
#: ../js/ui/components/networkAgent.js:275
#: ../js/ui/components/networkAgent.js:277
msgid "Identity: "
msgstr "身份:"
#: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:279
msgid "Private key password: "
msgstr "私人密钥密码:"
#: ../js/ui/components/networkAgent.js:289
#: ../js/ui/components/networkAgent.js:291
msgid "Service: "
msgstr "服务:"
#: ../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 "无线网络要求身份认证"
#: ../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 "访问无线网络“%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 "有线 802.1X 认证"
#: ../js/ui/components/networkAgent.js:325
#: ../js/ui/components/networkAgent.js:327
msgid "Network name: "
msgstr "网络名称:"
#: ../js/ui/components/networkAgent.js:330
#: ../js/ui/components/networkAgent.js:332
#: ../js/ui/components/networkAgent.js:666
msgid "DSL authentication"
msgstr "DSL 认证"
#: ../js/ui/components/networkAgent.js:337
#: ../js/ui/components/networkAgent.js:339
#: ../js/ui/components/networkAgent.js:672
msgid "PIN code required"
msgstr "需要 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 "移动宽带设备需要 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 "移动宽带网络密码"
#: ../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 "连接到“%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"
msgstr "需要认证"
@ -644,71 +706,9 @@ msgstr "认证"
msgid "Sorry, that didn't work. Please try again."
msgstr "抱歉,您的输入有误。请重试。"
#. 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 "昨天 %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 "%m月%d日, %H:%M"
#. Translators: this is the month name, day number, year
#. number followed by a time string in 24h format.
#. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:791
msgid "%B %d %Y, %H%M"
msgstr "%Y年%m月%d日, %H:%M"
#. Translators: Time in 12h format */
#: ../js/ui/components/telepathyClient.js:797 ../js/ui/dateMenu.js:213
msgid "%l%M %p"
msgstr "%p %-l:%M"
#. 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 "昨天%p %-l:%M"
#. 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%p %-l:%M"
#. 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 "%m月%d日%p %-l:%M"
#. 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 "%Y年%m月%d日%p %-l:%M"
#. 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 "%s 现在叫做 %s"
@ -721,7 +721,7 @@ msgstr "窗口"
msgid "Show Applications"
msgstr "显示应用程序"
#: ../js/ui/dash.js:451
#: ../js/ui/dash.js:449
msgid "Dash"
msgstr "Dash"
@ -878,10 +878,19 @@ msgstr "安装"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "从 extensions.gnome.org 下载并安装“%s”"
#: ../js/ui/keyboard.js:706 ../js/ui/status/keyboard.js:576
#: ../js/ui/keyboard.js:718 ../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"
msgstr "未安装扩展"
@ -934,7 +943,7 @@ msgstr "查看源"
msgid "Web Page"
msgstr "网页"
#: ../js/ui/messageTray.js:2131
#: ../js/ui/messageTray.js:1504
msgid "System Information"
msgstr "系统信息"
@ -954,21 +963,21 @@ msgstr "概览"
msgid "Type to search…"
msgstr "输入以搜索..."
#: ../js/ui/panel.js:351
#: ../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". */
#: ../js/ui/panel.js:403
#: ../js/ui/panel.js:404
msgid "Activities"
msgstr "活动"
#: ../js/ui/panel.js:754
#: ../js/ui/panel.js:755
msgid "Top Bar"
msgstr "顶栏"
#: ../js/ui/popupMenu.js:288
#: ../js/ui/popupMenu.js:289
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -1002,7 +1011,7 @@ msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "%d 条新通知"
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:345
#: ../js/ui/screenShield.js:432 ../js/ui/status/system.js:342
msgid "Lock"
msgstr "锁定"
@ -1018,11 +1027,11 @@ msgstr "无法锁定"
msgid "Lock was blocked by an application"
msgstr "一个应用程序阻止了锁定"
#: ../js/ui/search.js:609
#: ../js/ui/search.js:617
msgid "Searching…"
msgstr "正在搜索..."
#: ../js/ui/search.js:611
#: ../js/ui/search.js:619
msgid "No results."
msgstr "无结果。"
@ -1086,11 +1095,11 @@ msgstr "筛选键"
msgid "Mouse Keys"
msgstr "鼠标按键"
#: ../js/ui/status/accessibility.js:144
#: ../js/ui/status/accessibility.js:167
msgid "High Contrast"
msgstr "高对比度"
#: ../js/ui/status/accessibility.js:193
#: ../js/ui/status/accessibility.js:202
msgid "Large Text"
msgstr "大号文本"
@ -1123,7 +1132,7 @@ msgstr "无连接"
msgid "Brightness"
msgstr "亮度"
#: ../js/ui/status/keyboard.js:599
#: ../js/ui/status/keyboard.js:736
msgid "Show Keyboard Layout"
msgstr "显示键盘布局"
@ -1292,10 +1301,6 @@ msgstr "VPN 设置"
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"
msgstr "启用网络连接失败"
@ -1338,23 +1343,23 @@ msgstr "乘机模式"
msgid "On"
msgstr "开"
#: ../js/ui/status/system.js:317
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "切换用户"
#: ../js/ui/status/system.js:322
#: ../js/ui/status/system.js:319
msgid "Log Out"
msgstr "注销"
#: ../js/ui/status/system.js:341
#: ../js/ui/status/system.js:338
msgid "Orientation Lock"
msgstr "方向锁定"
#: ../js/ui/status/system.js:349
#: ../js/ui/status/system.js:346
msgid "Suspend"
msgstr "挂起"
#: ../js/ui/status/system.js:352
#: ../js/ui/status/system.js:349
msgid "Power Off"
msgstr "关机"
@ -1414,7 +1419,7 @@ msgstr[0] "设置更改将在 %d 后还原"
#. 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:613
#, javascript-format
msgid "%d x %d"
msgstr "%d x %d"
@ -1499,12 +1504,12 @@ msgstr "使用指定模式,如 “gdm”用于登录屏幕的模式"
msgid "List possible modes"
msgstr "列出可用的模式"
#: ../src/shell-app.c:247
#: ../src/shell-app.c:239
msgctxt "program"
msgid "Unknown"
msgstr "未知"
#: ../src/shell-app.c:488
#: ../src/shell-app.c:480
#, c-format
msgid "Failed to launch “%s”"
msgstr "启动“%s”失败"
@ -1520,3 +1525,11 @@ msgstr "密码不能为空"
#: ../src/shell-polkit-authentication-agent.c:346
msgid "Authentication dialog was dismissed by the user"
msgstr "认证对话框被用户驳回"
#~ msgctxt "event list time"
#~ msgid "%H%M"
#~ msgstr "%H%M"
#~ msgctxt "event list time"
#~ msgid "%l%M%p"
#~ msgstr "%p %-l:%M"

View File

@ -24,6 +24,8 @@
#include "gtkactionobservable.h"
#include "gtkactionobserver.h"
#include <clutter/clutter.h>
#include <string.h>
/**
@ -396,6 +398,26 @@ gtk_action_muxer_query_action (GActionGroup *action_group,
return FALSE;
}
static GVariant *
get_platform_data (void)
{
gchar time[32];
GVariantBuilder *builder;
GVariant *result;
g_snprintf (time, 32, "_TIME%d", clutter_get_current_event_time ());
builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}"));
g_variant_builder_add (builder, "{sv}", "desktop-startup-id",
g_variant_new_string (time));
result = g_variant_builder_end (builder);
g_variant_builder_unref (builder);
return result;
}
static void
gtk_action_muxer_activate_action (GActionGroup *action_group,
const gchar *action_name,
@ -408,7 +430,14 @@ gtk_action_muxer_activate_action (GActionGroup *action_group,
group = gtk_action_muxer_find_group (muxer, action_name, &unprefixed_name);
if (group)
g_action_group_activate_action (group->group, unprefixed_name, parameter);
{
if (G_IS_REMOTE_ACTION_GROUP (group->group))
g_remote_action_group_activate_action_full (G_REMOTE_ACTION_GROUP (group->group),
unprefixed_name, parameter,
get_platform_data ());
else
g_action_group_activate_action (group->group, unprefixed_name, parameter);
}
else if (muxer->parent)
g_action_group_activate_action (G_ACTION_GROUP (muxer->parent), action_name, parameter);
}
@ -425,7 +454,15 @@ gtk_action_muxer_change_action_state (GActionGroup *action_group,
group = gtk_action_muxer_find_group (muxer, action_name, &unprefixed_name);
if (group)
g_action_group_change_action_state (group->group, unprefixed_name, state);
{
if (G_IS_REMOTE_ACTION_GROUP (group->group))
g_remote_action_group_change_action_state_full (G_REMOTE_ACTION_GROUP (group->group),
unprefixed_name,
state,
get_platform_data ());
else
g_action_group_change_action_state (group->group, unprefixed_name, state);
}
else if (muxer->parent)
g_action_group_change_action_state (G_ACTION_GROUP (muxer->parent), action_name, state);
}

View File

@ -181,7 +181,6 @@ shell_prefs_init (void)
g_object_get (G_OBJECT (settings), "schema-id", &schema_id, NULL);
keys = g_settings_list_keys (settings);
for (keys = k = g_settings_list_keys (settings); *k; k++)
meta_prefs_override_preference_schema (*k, schema_id);

View File

@ -83,12 +83,18 @@ scan_startup_wm_class_to_id (ShellAppSystem *self)
for (l = apps; l != NULL; l = l->next)
{
GAppInfo *info = l->data;
const char *startup_wm_class, *id;
const char *startup_wm_class, *id, *old_id;
id = g_app_info_get_id (info);
startup_wm_class = g_desktop_app_info_get_startup_wm_class (G_DESKTOP_APP_INFO (info));
if (startup_wm_class != NULL)
if (startup_wm_class == NULL)
continue;
/* In case multiple .desktop files set the same StartupWMClass, prefer
* the one where ID and StartupWMClass match */
old_id = g_hash_table_lookup (priv->startup_wm_class_to_id, startup_wm_class);
if (old_id == NULL || strcmp (id, startup_wm_class) == 0)
g_hash_table_insert (priv->startup_wm_class_to_id,
g_strdup (startup_wm_class), g_strdup (id));
}

View File

@ -39,7 +39,7 @@
#include <malloc.h>
#endif
#ifdef __OpenBSD__
#if defined __OpenBSD__ || defined __FreeBSD__
#include <sys/sysctl.h>
#endif
@ -1278,6 +1278,30 @@ shell_global_reexec_self (ShellGlobal *global)
g_ptr_array_add (arr, *args_p);
}
g_ptr_array_add (arr, NULL);
#elif defined __FreeBSD__
char *buf;
char *buf_p;
char *buf_end;
gint mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ARGS, getpid() };
if (sysctl (mib, G_N_ELEMENTS (mib), NULL, &len, NULL, 0) == -1)
return;
buf = g_malloc0 (len);
if (sysctl (mib, G_N_ELEMENTS (mib), buf, &len, NULL, 0) == -1) {
g_warning ("failed to get command line args: %d", errno);
g_free (buf);
return;
}
buf_end = buf+len;
arr = g_ptr_array_new ();
/* The value returned by sysctl is NUL-separated */
for (buf_p = buf; buf_p < buf_end; buf_p = buf_p + strlen (buf_p) + 1)
g_ptr_array_add (arr, buf_p);
g_ptr_array_add (arr, NULL);
#else
return;
@ -1297,7 +1321,7 @@ shell_global_reexec_self (ShellGlobal *global)
execvp (arr->pdata[0], (char**)arr->pdata);
g_warning ("failed to reexec: %s", g_strerror (errno));
g_ptr_array_free (arr, TRUE);
#if defined __linux__
#if defined __linux__ || defined __FreeBSD__
g_free (buf);
#elif defined __OpenBSD__
g_free (args);
@ -1440,7 +1464,7 @@ shell_global_sync_pointer (ShellGlobal *global)
event.type = CLUTTER_MOTION;
event.time = shell_global_get_current_time (global);
event.flags = 0;
event.flags = CLUTTER_EVENT_FLAG_SYNTHETIC;
event.stage = global->stage;
event.x = x;
event.y = y;

View File

@ -5,6 +5,9 @@
#include <sys/types.h>
#include <sys/wait.h>
#include <GL/gl.h>
#include <cogl/cogl.h>
#include "shell-util.h"
#include <glib/gi18n-lib.h>
#include <gtk/gtk.h>
@ -358,3 +361,45 @@ shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
clutter_actor_hide (CLUTTER_ACTOR (texture));
}
}
typedef const gchar *(*ShellGLGetString) (GLenum);
static const gchar *
get_gl_vendor (void)
{
static const gchar *vendor = NULL;
if (!vendor)
{
ShellGLGetString gl_get_string;
gl_get_string = (ShellGLGetString) cogl_get_proc_address ("glGetString");
if (gl_get_string)
vendor = gl_get_string (GL_VENDOR);
}
return vendor;
}
gboolean
shell_util_need_background_refresh (void)
{
if (!clutter_check_windowing_backend (CLUTTER_WINDOWING_X11))
return FALSE;
if (g_strcmp0 (get_gl_vendor (), "NVIDIA Corporation") == 0)
return TRUE;
return FALSE;
}
void
shell_util_text_insert_keyval (ClutterActor *actor,
guint keyval)
{
ClutterEvent event = { 0 };
event.type = CLUTTER_KEY_PRESS;
event.key.keyval = keyval;
clutter_actor_event (actor, &event, FALSE);
}

View File

@ -45,6 +45,11 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
void shell_util_cursor_tracker_to_clutter (MetaCursorTracker *tracker,
ClutterTexture *texture);
gboolean shell_util_need_background_refresh (void);
void shell_util_text_insert_keyval (ClutterActor *actor,
guint keyval);
G_END_DECLS
#endif /* __SHELL_UTIL_H__ */

View File

@ -92,8 +92,6 @@ struct _StThemeNode {
guint background_position_set : 1;
guint background_repeat : 1;
gboolean margin_set : 4;
guint properties_computed : 1;
guint geometry_computed : 1;
guint background_computed : 1;

View File

@ -1672,25 +1672,13 @@ do_margin_property_term (StThemeNode *node,
return;
if (left)
{
node->margin[ST_SIDE_LEFT] = value;
node->margin_set |= 1 << ST_SIDE_LEFT;
}
node->margin[ST_SIDE_LEFT] = value;
if (right)
{
node->margin[ST_SIDE_RIGHT] = value;
node->margin_set |= 1 << ST_SIDE_RIGHT;
}
node->margin[ST_SIDE_RIGHT] = value;
if (top)
{
node->margin[ST_SIDE_TOP] = value;
node->margin_set |= 1 << ST_SIDE_TOP;
}
node->margin[ST_SIDE_TOP] = value;
if (bottom)
{
node->margin[ST_SIDE_BOTTOM] = value;
node->margin_set |= 1 << ST_SIDE_BOTTOM;
}
node->margin[ST_SIDE_BOTTOM] = value;
}
static void
@ -3188,18 +3176,10 @@ _st_theme_node_apply_margins (StThemeNode *node,
_st_theme_node_ensure_geometry (node);
// In the case that a CSS margin is not specified, we don't to set a value
// of 0 to the clutter actor margin. In this manner it allows to use Clutter
// margin values set in the code. However, the margins that are set both in
// the code and in the CSS on the same side, the result is unpredictable.
if (node->margin_set & 1 << ST_SIDE_LEFT)
clutter_actor_set_margin_left (actor, st_theme_node_get_margin(node, ST_SIDE_LEFT));
if (node->margin_set & 1 << ST_SIDE_RIGHT)
clutter_actor_set_margin_right (actor, st_theme_node_get_margin(node, ST_SIDE_RIGHT));
if (node->margin_set & 1 << ST_SIDE_TOP)
clutter_actor_set_margin_top (actor, st_theme_node_get_margin(node, ST_SIDE_TOP));
if (node->margin_set & 1 << ST_SIDE_BOTTOM)
clutter_actor_set_margin_bottom (actor, st_theme_node_get_margin(node, ST_SIDE_BOTTOM));
clutter_actor_set_margin_left (actor, st_theme_node_get_margin(node, ST_SIDE_LEFT));
clutter_actor_set_margin_right (actor, st_theme_node_get_margin(node, ST_SIDE_RIGHT));
clutter_actor_set_margin_top (actor, st_theme_node_get_margin(node, ST_SIDE_TOP));
clutter_actor_set_margin_bottom (actor, st_theme_node_get_margin(node, ST_SIDE_BOTTOM));
}
static GetFromTermResult