Compare commits

...

113 Commits

Author SHA1 Message Date
Giovanni Campagna
3e79d293f7 LayoutManager: implement new design for the startup animation
The design calls for two different startup animations, in the GDM
and in the normal session case.
In both cases, we implement fading from the previous situation
by acquiring the root background pixmap and turning it into a TFP
texture, which is then animated and blended by Clutter as normal.

https://bugzilla.gnome.org/show_bug.cgi?id=682429
2013-02-05 00:11:19 +01:00
Giovanni Campagna
d457073c10 Util: add an accessor for the root background pixmap
The background of the root window is accessible as the _XROOTPMAP_ID
property on the root window. Given that the root window is always
fully covered by the Composite Overlay Window, we use that as temporary
storage while the COW is not mapped, that is, before the GDM greeter
is started and between killing the greeter and starting GDM from the
session.

https://bugzilla.gnome.org/show_bug.cgi?id=682429
2013-02-05 00:11:19 +01:00
Giovanni Campagna
8b2864ee70 Main: move the stage hierarchy initialization to LayoutManager
It is cleaner to concentrate all layout and chrome management
in one place, instead of having it scattered around the codebase.

https://bugzilla.gnome.org/show_bug.cgi?id=682429
2013-02-05 00:11:19 +01:00
Giovanni Campagna
af1c799246 ScreenShield: remove blur effect from the background
It's badly implemented, slow and actually not needed, now that we
have a different image.
Let's keep desaturation instead.

https://bugzilla.gnome.org/show_bug.cgi?id=688210
2013-02-05 00:11:18 +01:00
Giovanni Campagna
f6aa0ee532 ScreenShield: use different settings for the lock screen background
The design calls for the ability to set a different background in the
lock screen, to differentiate it from the normal desktop.

https://bugzilla.gnome.org/show_bug.cgi?id=688210
2013-02-05 00:11:18 +01:00
Giovanni Campagna
b0e22a795e Adapt for MetaBackgroundActor API changes
MetaBackgroundActor can now be constructed as a standard GObject, and
accepts a GnomeBG settings object, which we retrieve from the default
one to share textures.

https://bugzilla.gnome.org/show_bug.cgi?id=688210
2013-02-05 00:11:18 +01:00
Giovanni Campagna
f91671498b LayoutManager: Remove broken startup animation
It doesn't make sense to animate blindly a MetaBackgroundActor, given that
it shows the content of _XROOTPMAP_ID, so if gnome-settings-daemon is fast
we're animating the configured background, not the plymouth screen. And anyway
it would be animated on top of the standard MetaBackgroundActor...
It makes even less sense now that mutter renders the background on its own
(and blocks the first paint cycle until the background image is ready)
We need to do something better here, but for now, remove this.

https://bugzilla.gnome.org/show_bug.cgi?id=688210
2013-02-05 00:11:18 +01:00
Milo Casagrande
443f02cd92 [l10n] Updated Italian translation. 2013-02-04 18:14:28 +01:00
Florian Müllner
b682c8e052 main: Move KeybindingMode into Shell
Having the definition in C instead of Javascript allows sharing
the corresponding header with gnome-settings-daemon.

https://bugzilla.gnome.org/show_bug.cgi?id=643111
2013-02-04 16:48:40 +01:00
Florian Müllner
d07c8dcd9c volume: Suppress a critical warning
gvc_mixer_stream_get_port() emits a warning in the no-ports case,
which we can avoid by rearranging the check for that case.

https://bugzilla.gnome.org/show_bug.cgi?id=693049
2013-02-04 12:42:36 +01:00
Stefano Facchini
9bcce4f271 Fix typo in gnome-shell-extension-prefs
Environment variables should be checked for zero length,
instead of non-zero. This prevented the script to run
correctly in a jhbuild shell for example.

https://bugzilla.gnome.org/show_bug.cgi?id=693031
2013-02-04 12:00:42 +01:00
Rui Matos
eab497a814 layout: Call _startupAnimation() on init
Commit 8e231cb2ec inadvertently removed
it.

https://bugzilla.gnome.org/show_bug.cgi?id=693067
2013-02-04 11:23:38 +01:00
Giovanni Campagna
a8c8df6ee8 StImText: don't translate keyboard state again
Clutter translates keyboard state internally, and clears the lock bits
from modifier state, so translating again results in the wrong keysym.
Given that Clutter already gives us a fine keysym, we don't need this.

https://bugzilla.gnome.org/show_bug.cgi?id=692586
2013-02-03 16:45:28 +01:00
Giovanni Campagna
b3549f421d UserMenu: don't show a lock icon when we're not actually locked
The screen shield can now be active (forcing the lock-screen session mode)
without being locked.

https://bugzilla.gnome.org/show_bug.cgi?id=693007
2013-02-03 14:59:58 +01:00
Giovanni Campagna
ae0accb5a4 ScreenShield: separate notifications for active and locked
Now that we have an explicit active-but-not-locked state, we should
use different signals to notify changes. lock-status-changed is
renamed to active-changed, and a new locked-changed is introduced.

https://bugzilla.gnome.org/show_bug.cgi?id=693007
2013-02-03 14:59:58 +01:00
Chao-Hsiung Liao
d367566db9 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2013-02-02 18:39:58 +08:00
Yaron Shahrabani
35812208e7 Updated Hebrew translation. 2013-02-02 12:06:39 +02:00
Gheyret Kenji
afaff724f6 Updated Uyghur translation
Signed-off-by: Gheyret Kenji <gheyret@gmail.com>
2013-02-02 13:19:42 +09:00
Ray Strode
ec8dfb0cad doap: add myself to doap file
This is so hopefully darkxst's mango request will show
up for me to approve.
2013-02-01 17:30:35 -05:00
Jasper St. Pierre
7798da8dff layout: Remove an unused variable
The tray barrier was removed when the hot corner to activate the message
tray was removed.

https://bugzilla.gnome.org/show_bug.cgi?id=677215
2013-02-01 12:55:01 -05:00
Florian Müllner
89a49ce72e windowManager: Respect icon geometry when minimizing
When using a dock or window-list with the shell, it makes sense for
us to minimize to the location requested rather than the activities
button.

https://bugzilla.gnome.org/show_bug.cgi?id=692997
2013-02-01 17:38:33 +01:00
Florian Müllner
655dce6a4b st-theme-node: Recalculate properties on stylesheet changes
As theme nodes keep a cache of matched properties, we need to make
sure to update it when the list of stylesheets changes. In particular
this fixes a regression from commit dc2ec0a8f9, which caused
extensions with stylesheets to crash the shell when re-enabled (for
instances when coming back from the lock screen).

https://bugzilla.gnome.org/show_bug.cgi?id=692994
2013-02-01 17:28:40 +01:00
Florian Müllner
2cf403a3e9 st-theme: Add "custom-stylesheets-changed" signal
StThemeNodes cache matched properties from stylesheets, so when the
list of custom stylesheets changes, the node may miss better matches
(when a stylesheet was added) or have pointers to invalid memory in
the list (when a stylesheet was removed).
In order to allow theme nodes to listen for stylesheet changes, add
an appropriate signal to StTheme.

https://bugzilla.gnome.org/show_bug.cgi?id=692994
2013-02-01 17:28:39 +01:00
Wouter Bolsterlee
4351ad2414 Updated Dutch translation 2013-02-01 17:00:13 +01:00
Florian Müllner
fd2944fa8d userMenu: Update logout item when always-show-log-out changes
https://bugzilla.gnome.org/show_bug.cgi?id=692996
2013-02-01 14:56:28 +01:00
Florian Müllner
f4626cf8ad workspace: Make previews of minimized windows translucent
Because the comment says so! Seriously, Jakub suggested this after
bug 682887 brought back a rebranded default shortcut for minimize.

https://bugzilla.gnome.org/show_bug.cgi?id=692999
2013-02-01 14:54:38 +01:00
Florian Müllner
65bf0d20e7 keyboard: Fix a warning
While we handle the case where ibus_bus_get_global_engine() returns
NULL, this case actually generates an exception we have to catch to
avoid some (harmless) console spam.

https://bugzilla.gnome.org/show_bug.cgi?id=692995
2013-02-01 13:06:00 +01:00
Piotr Drąg
2f496de98a Updated Polish translation 2013-01-31 20:03:14 +01:00
Giovanni Campagna
644b8304ab ScreenShield: fix wrong signal value in ActiveChanged
ActiveChanged should be about active, not locked.

https://bugzilla.gnome.org/show_bug.cgi?id=691964
2013-01-31 18:25:31 +01:00
Giovanni Campagna
5c4570fcaa ScreenShield: fix regression in GDM greeter
The initial state of the lock screen is HIDDEN, and hideLockScreen
enforces that now, so reflect it in Clutter state too.

https://bugzilla.gnome.org/show_bug.cgi?id=692948
2013-01-31 16:57:38 +01:00
Giovanni Campagna
ac0bd3b116 Fix bad rebase and regression in 3f6f597 2013-01-31 16:07:16 +01:00
Giovanni Campagna
7ad881d0ec ScreenShield: emit lock-status-changed at the end of animation for manual locking too
gnome-settings-daemon uses lock-status-changed/ActiveChanged to drive
screen blanking, so must wait for the animation end before emitting it.

https://bugzilla.gnome.org/show_bug.cgi?id=691964
2013-01-31 14:10:21 +01:00
Giovanni Campagna
9a25224890 ScreenShield: lower the shield when the user is idle but before locking
In time span between idle and lock the shield should behave like autologin,
but should prevent accidental reactivation (for example when using a touch
screen) by showing the curtain.

https://bugzilla.gnome.org/show_bug.cgi?id=692560
2013-01-31 14:10:20 +01:00
Giovanni Campagna
3f6f597093 ScreenShield: only emit ActiveChanged at the end of the idle fading
gnome-settings-daemon wants to use ActiveChanged to drive screen
blanking policies.
I also added two big comments that should cover all cases, to clear
up what's happening when the idle timers fire.

https://bugzilla.gnome.org/show_bug.cgi?id=691964
2013-01-31 14:07:26 +01:00
Giovanni Campagna
9ab22fe551 ScreenShield: fix fallout from 8cb3884
We must remove music notifications before we're destroyed, otherwise
they get destroyed with us.
Also, integrate a review comment I previously forgot.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:45:57 +01:00
Giovanni Campagna
9794e71a86 Add policy for builtin message sources
Some notifications, despite being emitted by shell code, should appear
to be from application or "separable" system components. Do that by
associating them with a notification-daemon policy.

Note that for this to look really good, empathy should rename itself
to Chat.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Giovanni Campagna
8cb3884fae ScreenShield: decouple detailed notifications from resident notifications
The designs says that only music notifications should be shown in full
in the screenshield, the others should be either shown as a summary or
with very light details.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Giovanni Campagna
098bd4509b MessageTray: introduce configurable per-source notification policy
Allow message tray sources to provide a NotificationPolicy object,
that will configure how and if the source is displayed. For notification
daemon sources, this object is hooked to GSettings.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Giovanni Campagna
4dc5bac72f NotificationDaemon: improve associating sources with applications
Try harder to find a ShellApp for a notification source, by looking
at the PID, tray icon wm_class and desktop-entry libnotify hint.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Giovanni Campagna
b150869b51 MessageTray: clean up source tracking
Use the new Hash.Map class, and store signal connections along with
the source and summaryItem. This allows to remove sources without destroying
them.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Giovanni Campagna
daf8be9f78 Add a new Hash module
A simple implementation of the ES6 Map proposal, internally
done as a hash table, using System.addressOf() to support keys that
are arbitrary objects.
Should help replacing linear searches in various places around the shell.

https://bugzilla.gnome.org/show_bug.cgi?id=685926
2013-01-31 13:20:08 +01:00
Inaki Larranaga Murgoitio
d14cf1e80b Updated Basque language 2013-01-30 22:02:44 +01:00
Inaki Larranaga Murgoitio
605d34008e Updated Basque language 2013-01-30 22:00:50 +01:00
Kjartan Maraas
d3135414cc Updated Norwegian bokmål translation 2013-01-29 18:29:45 +01:00
Giovanni Campagna
b3f29b46cf NetworkMenu: defer calling syncSectionTitle until after pushing the device
syncSectionTitle looks at device list for the section, to understand if
the section should be visible or not, so obviously it needs to see the
new device.

I wonder when this broke.

https://bugzilla.gnome.org/show_bug.cgi?id=692749
2013-01-29 15:28:02 +01:00
Giovanni Campagna
4545719e18 MessageTray: disconnect signal to notification early
Similar to the previous patch, this adds robustness and prevents more
stacktraces and confusion in the state machine.

https://bugzilla.gnome.org/show_bug.cgi?id=692693
2013-01-28 21:02:46 +01:00
Giovanni Campagna
cc60afa31a Disconnect content-updated signal early
During the box pointer animation, other events can trigger an updateState,
losing the information that the summary is hiding and thus never disconnecting
the signals. Then, this stale connections can cause stacktraces, as they
fire when summaryBoxPointerItem is null.

https://bugzilla.gnome.org/show_bug.cgi?id=692693
2013-01-28 21:02:45 +01:00
Giovanni Campagna
85743ede7e MessageTray: fix reentrancy problem in hideNotificationCompleted
Hiding notificationWidget with a telepathy notification causes
unfocused to be emitted, which causes a reentrant updateState.
If another notification is queued, it is shown before the old
one is cleared.

https://bugzilla.gnome.org/show_bug.cgi?id=683986
2013-01-28 21:02:45 +01:00
Jasper St. Pierre
8e231cb2ec layout: Merge Chrome and LayoutManager
The two classes have been gaining each other's functionality for a little
while, adding the new code wherever it was more convenient. Rather than
have a clear delineation between "This Manages Shell Chrome" and "This
Manages Shell Layout", I think it's better off if we just accept that
the responsibilities are pretty much the same.

https://bugzilla.gnome.org/show_bug.cgi?id=692677
2013-01-28 12:41:06 -05:00
Jasper St. Pierre
72405cd43f layout: Shuffle code around
This will make the next diff much cleaner.

https://bugzilla.gnome.org/show_bug.cgi?id=692677
2013-01-28 12:41:06 -05:00
Cosimo Cecchi
a9ad9d5e6d remoteSearch: fix fallout from RemoteSearchProvider refactor
RemoteSearchProvider.title was removed, but we were still using it in a
few places.

https://bugzilla.gnome.org/show_bug.cgi?id=692723
2013-01-28 12:34:19 -05:00
Jasper St. Pierre
2d79c7333f main: Fix a bad rebase
This wasn't meant to be here...
2013-01-28 12:14:41 -05:00
Jasper St. Pierre
7a79cfd76b keyboard: Do the initial redraw in _init
It doesn't seem like there's anything preventing us from doing this.

https://bugzilla.gnome.org/show_bug.cgi?id=692678
2013-01-28 12:10:32 -05:00
Rui Matos
6600d6b6d9 status/power: Init the proxy asynchronously
Blocking the compositor is evil!

https://bugzilla.gnome.org/show_bug.cgi?id=692715
2013-01-28 17:35:02 +01:00
Hashem Nasarat
8ca25aed8b viewSelector: stop launching app from empty search
In the overview, when there is no text in the search entry, this._searchActive
will be set to false. Moving the Clutter.Return code block ensures that
pressing enter in the search field after deleting the characters of a search
will no longer launch the #1 application for the previous search.

https://bugzilla.gnome.org/show_bug.cgi?id=692391
2013-01-27 20:29:26 +01:00
Kjartan Maraas
1db353a0fc Updated Norwegian bokmål translation 2013-01-27 12:54:02 +01:00
A S Alam
2d384eb546 PA Update (alam): Punjabi Translation completed 2013-01-27 09:27:42 +00:00
Jasper St. Pierre
5d1de33026 Use the standard apps tree for gnome-control-center panels desktop files
gnome-control-center is planning on removing its own tree in the
future. Since it already installs these applications into
/usr/share/applications, just use this for now.

https://bugzilla.gnome.org/show_bug.cgi?id=692483
2013-01-26 19:56:01 -05:00
Jasper St. Pierre
f2ba49fa35 app-system: Remove unused get_settings_tree method
The last use for this is long-gone.

https://bugzilla.gnome.org/show_bug.cgi?id=692483
2013-01-26 19:56:00 -05:00
Matej Urbančič
772ae1cae4 Updated Slovenian translation 2013-01-26 20:08:46 +01:00
Fabio Tomat
1d267f2642 Added Friulian translation 2013-01-26 04:09:31 +01:00
Fabio Tomat
cba299160a Added Friulian language 2013-01-26 04:09:22 +01:00
Nilamdyuti Goswami
ea33193e73 Assamese translation updated 2013-01-25 17:43:05 +05:30
Jasper St. Pierre
ef69c228fd workspace: Use a better algorithm for computing individual thumbnail scale
The one we had before could make unmaximized windows appear to be bigger
than maximized ones, for a few reasons. Ensure that this doesn't happen
again, and add some comments to explain the whys and needs for twiddling
the individual thumbnail size.

https://bugzilla.gnome.org/show_bug.cgi?id=686944
2013-01-24 15:14:03 -05:00
Jasper St. Pierre
7ba0f07732 workspace: Clamp individual maximized scales to WINDOW_CLONE_MAXIMUM_SCALE
We clamp the overall layout's scale to WINDOW_CLONE_MAXIMUM_SCALE, but since
we do a bit of tweaking to try and make super small windows a tad larger, it's
theoretically possible that windows may become larger than the proper maximum
scale. Fix this issue.

https://bugzilla.gnome.org/show_bug.cgi?id=686944
2013-01-24 15:13:54 -05:00
Cosimo Cecchi
07696086a2 appDisplay: set hscrollbar_policy = NEVER on the category view actor
https://bugzilla.gnome.org/show_bug.cgi?id=686881
2013-01-24 15:10:02 -05:00
Cosimo Cecchi
426581eb1e scroll-view: reserve scrollbar allocation when policy is automatic
This is useful to avoid reflowing the layout when there's a
center-aligned block and a scrollbar appears.

https://bugzilla.gnome.org/show_bug.cgi?id=686881
2013-01-24 15:10:02 -05:00
Tobias Endrigkeit
fe88811a40 [l10n] Updated German translation 2013-01-24 20:09:42 +01:00
Cosimo Cecchi
30aaa6e26c searchDisplay: set a max width on the search results scrolled child
On large displays, we don't want the search results list to expand
across the whole screen; set a maximum width of 1000px.
Unfortunately, since in St max-width only affects size requisition, we
need a little custom layout manager to have it applied to the allocation
too.

https://bugzilla.gnome.org/show_bug.cgi?id=692453
2013-01-24 12:06:46 -05:00
Cosimo Cecchi
4bd071bf3c viewSelector: clean up active search state code
'active' isn't terribly clear about just what is active; also, make it
private, remove an useless extra object state we were saving, and
refactor some messy code.
Based on a patch by Tanner Doshier.

https://bugzilla.gnome.org/show_bug.cgi?id=692454
2013-01-24 12:04:20 -05:00
Daniel Mustieles
309ac65447 Updated Spanish translation 2013-01-24 16:42:18 +01:00
Hashem Nasarat
fe246470ce Make Show Applications button depress when held down
The way it currently exists is awkward and not how most virtual buttons
work. This patch causes the "clicked" look to occur when the button is held.

https://bugzilla.gnome.org/show_bug.cgi?id=692319
2013-01-24 12:41:15 +00:00
Tanner Doshier
660cfe707c searchDisplay: Make list results span all available horizontal space
https://bugzilla.gnome.org/show_bug.cgi?id=691967
2013-01-22 23:44:21 -05:00
Jasper St. Pierre
a0d7d7bc4b loginDialog: Allow right-clicking on button items
In a gdm session, we may not know what mouse orientation the user
may be in, so it makes sense to support both the left and right
mouse buttons to activate login or other items.

Additionally, add the behavior to all modal dialog items, even in
a user session, because it's unlikely that the user will right-click
on buttons, and it makes for an easier implementation.

https://bugzilla.gnome.org/show_bug.cgi?id=688748
2013-01-22 23:42:53 -05:00
Мирослав Николић
758764ea75 Updated Serbian translation 2013-01-22 21:10:34 +01:00
Piotr Drąg
6935c62a61 Updated POTFILES.in 2013-01-22 16:41:03 +01:00
Dan Winship
a34d4d9124 network: more NM 0.9.6 compatibility
Virtual device support requires
NMGtk.utils_get_connection_device_name(), so don't try to support
virtual devices with older NM.
2013-01-21 16:01:08 -05:00
Dan Winship
c49bb5aa03 network: add support for virtual device types (vlan, bond, bridge)
Virtual devices may not actually exist until their corresponding
connections are brought up. So we need new code to create fake device
wrapper objects for them based on the corresponding NMConnections.

https://bugzilla.gnome.org/show_bug.cgi?id=677144
https://bugzilla.gnome.org/show_bug.cgi?id=677146
https://bugzilla.gnome.org/show_bug.cgi?id=677148
2013-01-21 16:01:08 -05:00
Giovanni Campagna
427750d6af ShellGlobal: improve code to emit sound events
Use libcanberra-gtk3 and improve the set of context properties to correctly
associate the sounds with the shell.

https://bugzilla.gnome.org/show_bug.cgi?id=642831
2013-01-21 18:03:23 +01:00
Nilamdyuti Goswami
b9ad5f8727 Assamese translation updated 2013-01-21 19:42:56 +05:30
Kjartan Maraas
c776826425 Updated Norwegian bokmål translation 2013-01-20 21:46:55 +01:00
Daniel Mustieles
a8ede18db5 Updated Spanish translation 2013-01-20 12:05:39 +01:00
Giovanni Campagna
9aa84ec54a MessageTray: restore symbolic icons to notification buttons
These were lost when we moved away with StIconType. The idea was that
apps needed to include -symbolic in their action IDs, but apps were
not updated, and it never makes sense to have non symbolic icons there,
so let's restore the previous behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=692091
2013-01-19 19:41:24 +01:00
Giovanni Campagna
91a6520c3b MessageTray: don't show expanded content when the notification is collapsed
This fixes the image and scrollbars peeking through in banner mode,
because StTable wasn't able to allocate them at the restricted height
imposed by CSS.

https://bugzilla.gnome.org/show_bug.cgi?id=692091
2013-01-19 19:41:23 +01:00
Giovanni Campagna
45fde4888e Notification: fix regression in notification image handling
We must set the image after calling .update(), because we're passing
clear: true and thus we're removing the image too.
Also, we need to specify an explicit icon size, or St.Icon will use
the default (48px)

https://bugzilla.gnome.org/show_bug.cgi?id=692091
2013-01-19 19:41:23 +01:00
Giovanni Campagna
484ef5f2f6 MessageTray: simplify image handling
Remove duplicate checks before calling unsetImage, and set properties
directly in the constructor.

https://bugzilla.gnome.org/show_bug.cgi?id=692091
2013-01-19 19:41:23 +01:00
Jasper St. Pierre
cdd354739a configure.ac: Remove deprecated macro
AM_PROG_CC_C_O has been deprecated upstream for some time now.

As a side effect, this makes "git grep taskpanel" turn up blank!

https://bugzilla.gnome.org/show_bug.cgi?id=692052
2013-01-19 13:38:04 -05:00
Jasper St. Pierre
420f544bf3 configure.ac: Rearrange pkg-config checks
https://bugzilla.gnome.org/show_bug.cgi?id=692052
2013-01-19 13:38:03 -05:00
Jasper St. Pierre
15b33189ae configure.ac: Remove old introspection infrastructure
This hasn't been needed in quite some time.

https://bugzilla.gnome.org/show_bug.cgi?id=692052
2013-01-19 13:37:18 -05:00
Jasper St. Pierre
685a9f36f6 configure.ac: Remove checks for JS_NewGlobalObject
The need for this is long gone.

https://bugzilla.gnome.org/show_bug.cgi?id=692052
2013-01-19 13:37:18 -05:00
Jasper St. Pierre
3b57812e29 configure.ac: Use GNOME_COMPILE_WARNINGS
This is now implemented as standard in gnome-common.

https://bugzilla.gnome.org/show_bug.cgi?id=692052
2013-01-19 13:37:18 -05:00
Giovanni Campagna
d583c48992 NetworkMenu: don't queue menu updates for destroyed devices
It will cause an exception as the work ID is now invalid, and may block
new devices from appearing for example when NM is restarted.

https://bugzilla.gnome.org/show_bug.cgi?id=684279
2013-01-19 03:07:03 +01:00
Giovanni Campagna
0e636ea67e NetworkMenu: don't clear the section when queuing an update
It's the very first thing that queueing does.

https://bugzilla.gnome.org/show_bug.cgi?id=684279
2013-01-19 03:07:03 +01:00
Duarte Loreto
c9ce1bd30f Updated Portuguese translation and converted to New Spelling (Novo AO) 2013-01-19 00:37:51 +00:00
Rui Matos
f2cbc3192c switcherPopup: Hide the top level actor on _init
destroy() checks if we are visible to decide whether to destroy the
actor immediately or after a fade out animation. Since actors are
visible by default it would always end up destroying only after the
animation time.

https://bugzilla.gnome.org/show_bug.cgi?id=691963
2013-01-19 00:27:36 +01:00
Giovanni Campagna
56d76791f1 PointerWatcher: keep a reference to the idle monitor
If nothing references the idle monitor, it can be finalized at GC,
causing it to have no effect. Worse, if the finalization happens at
wrong time, the pointer watcher can be permanently off, disabling the
message tray.

https://bugzilla.gnome.org/show_bug.cgi?id=691976
2013-01-18 21:14:09 +01:00
Giovanni Campagna
df2cab877f MessageTray: wait until the tray is hidden to switch styles
Switching style on Overview::hiding creates a weird effect, as the noise
texture is shown while the overview is still visibile. Instead, wait for
the tray to be fully hidden, then apply the new style.
As now the switch is invisible, there is no need for the transition
(which introduced the same problem on overview showing)

https://bugzilla.gnome.org/show_bug.cgi?id=689091
2013-01-18 21:07:12 +01:00
Giovanni Campagna
27ad8305e5 Overview: apply extra padding to windows in external monitor
Add an style class targetting workspaces located outside the overview,
and use it for extra padding around the window clones. Padding is passed
down and applied inside LayoutStrategy, consolidating code that previously
handled the bottom side only.

https://bugzilla.gnome.org/show_bug.cgi?id=690171
2013-01-18 20:58:07 +01:00
Giovanni Campagna
c97b4dd48e ViewSelector: use Params to pass optional parameters to addPage
This allows to introduce new parameters without making the signature
overly complex.

https://bugzilla.gnome.org/show_bug.cgi?id=690171
2013-01-18 20:53:20 +01:00
Giovanni Campagna
59ecd610b1 MessageTray: pass keyboard events to tray icons
Synthetize XKeyEvents for clicks emulated by StButton using Return or
Space.

https://bugzilla.gnome.org/show_bug.cgi?id=687425
2013-01-18 20:53:20 +01:00
Jasper St. Pierre
42c1285ead messageTray: Remove code for ignoring num lock / scroll lock
Clutter now ignores these masks, so we can remove code that depends
on this.

https://bugzilla.gnome.org/show_bug.cgi?id=691731
2013-01-18 14:25:32 -05:00
Jasper St. Pierre
622c1c9236 shell-global: Move shell_fonts_init() back to main
We do not need any stage-specific code, so let's move
the initialization back to where other components are
initialized.

https://bugzilla.gnome.org/show_bug.cgi?id=691745
2013-01-18 00:25:42 -05:00
Duarte Loreto
2d88508f9d Updated Portuguese translation and converted to New Spelling (Novo AO) 2013-01-18 00:02:32 +00:00
Florian Müllner
86efba4ecc Bump version to 3.7.4.1
Update NEWS.
2013-01-17 13:56:38 +01:00
Jasper St. Pierre
90fae00aa6 screenshot: Immediately show the flash spot
The "flash" effect looks awkward when it fades in and out. Real
camera have an immediate flash of light, which then seems to fade
out as our eyes readjust the rapid change in lighting.

https://bugzilla.gnome.org/show_bug.cgi?id=691875
2013-01-16 17:19:16 -05:00
Rico Tzschichholz
d497ed4040 build: Drop obsololete variable from configure.ac
LIBEDATASERVERUI_MIN_VERSION is not used
2013-01-16 23:13:20 +01:00
Ihar Hrachyshka
c4a21ae5ad Updated Belarusian translation. 2013-01-16 16:09:54 +03:00
Mathieu Bridon
5e5798bee9 dateMenu: Add "Open Clocks" entry
This is similar to how the dateMenu already allows opening the calendar
application. However, the new entry only appears if GNOME Clocks is
installed, as it is not a core GNOME application.

https://bugzilla.gnome.org/show_bug.cgi?id=644390
2013-01-16 05:06:55 +02:00
Mathieu Bridon
d793077b91 dateMenu: Move the "Open Calendar" entry
The design calls for it to be in the left column rather than the right
one.

https://bugzilla.gnome.org/show_bug.cgi?id=644390
2013-01-16 05:06:52 +02:00
Jeremy Bicha
3e826f9249 build: Bump gsettings-desktop-schemas requirement
Needed for f7212cf80c
2013-01-15 12:18:53 -05:00
Bastien Nocera
2adfb60dc4 data: Remove unused show-full-name in schema
It's now in gsettings-desktop-schemas.

https://bugzilla.gnome.org/show_bug.cgi?id=689561
2013-01-15 09:53:08 +01:00
Bastien Nocera
f7212cf80c userMenu: Use show-full-name-in-top-bar setting
For the non-locked case, from gsettings-desktop-schemas' privacy
schema. For the locked case, from the privacy schema.

https://bugzilla.gnome.org/show_bug.cgi?id=689561
2013-01-15 09:53:08 +01:00
Rico Tzschichholz
69556643bb Depend on gjs 1.35.4
Needed for 9548cd8341
2013-01-15 09:25:36 +01:00
79 changed files with 11169 additions and 7087 deletions

14
NEWS
View File

@@ -1,3 +1,17 @@
3.7.4.1
=======
* userMenu: Use show-full-name-in-top-bar setting [Bastien; #689561]
* dateMenu: Add "Open Clocks" entry [Mathieu; #644390]
* screenshot: Immediately show the flash spot [Jasper; #691875]
* Misc. bug fixes [Rico, Jeremy]
Contributors:
Jeremy Bicha, Mathieu Bridon, Bastien Nocera, Jasper St. Pierre,
Rico Tzschichholz
Translations:
Ihar Hrachyshka [be]
3.7.4 3.7.4
===== =====
* Make menu separators crisp [Giovanni, Allan; #641745] * Make menu separators crisp [Giovanni, Allan; #641745]

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.7.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.7.4.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@@ -16,8 +16,6 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Checks for programs. # Checks for programs.
AC_PROG_CC AC_PROG_CC
# Needed for per-target cflags, like in gnomeshell-taskpanel
AM_PROG_CC_C_O
# Initialize libtool # Initialize libtool
LT_PREREQ([2.2.6]) LT_PREREQ([2.2.6])
@@ -62,15 +60,14 @@ fi
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder) AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11 CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.33.2 GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.7.4 MUTTER_MIN_VERSION=3.7.4
GTK_MIN_VERSION=3.3.9 GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.35.0 GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3 LIBEDATASERVER_MIN_VERSION=3.5.3
LIBEDATASERVERUI_MIN_VERSION=3.5.3
TELEPATHY_GLIB_MIN_VERSION=0.17.5 TELEPATHY_GLIB_MIN_VERSION=0.17.5
TELEPATHY_LOGGER_MIN_VERSION=0.2.4 TELEPATHY_LOGGER_MIN_VERSION=0.2.4
POLKIT_MIN_VERSION=0.100 POLKIT_MIN_VERSION=0.100
@@ -96,7 +93,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION libstartup-notification-1.0 >= $STARTUP_NOTIFICATION_MIN_VERSION
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra libcanberra libcanberra-gtk3
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
@@ -104,30 +101,14 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION) gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS
CFLAGS=$GNOME_SHELL_CFLAGS
LIBS=$GNOME_SHELL_LIBS
AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION) PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.2.2) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
AC_MSG_CHECKING([for bluetooth support]) AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0], PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
@@ -174,6 +155,19 @@ if test "x$use_systemd" = "xyes"; then
AC_DEFINE(WITH_SYSTEMD, 1, [systemd support]) AC_DEFINE(WITH_SYSTEMD, 1, [systemd support])
fi fi
GNOME_KEYBINDINGS_KEYSDIR=`$PKG_CONFIG --variable keysdir gnome-keybindings`
AC_SUBST([GNOME_KEYBINDINGS_KEYSDIR])
GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS
CFLAGS=$GNOME_SHELL_CFLAGS
LIBS=$GNOME_SHELL_LIBS
AC_CHECK_FUNCS(XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter` MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter`
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter` MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter`
AC_SUBST(MUTTER_GIR_DIR) AC_SUBST(MUTTER_GIR_DIR)
@@ -199,16 +193,6 @@ fi
# Sets GLIB_GENMARSHAL and GLIB_MKENUMS # Sets GLIB_GENMARSHAL and GLIB_MKENUMS
AM_PATH_GLIB_2_0() AM_PATH_GLIB_2_0()
G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
AC_SUBST(G_IR_SCANNER)
G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
AC_SUBST(G_IR_COMPILER)
G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
AC_SUBST(G_IR_GENERATE)
GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
AC_SUBST(GIRDIR)
TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
AC_SUBST(TYPELIBDIR)
GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) GTK_DOC_CHECK([1.15], [--flavour no-tmpl])
@@ -224,32 +208,7 @@ if test "$enable_man" != no; then
fi fi
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
# Stay command-line compatible with the gnome-common configure option. Here GNOME_COMPILE_WARNINGS([error])
# minimum/yes/maximum are the same, however.
AC_ARG_ENABLE(compile_warnings,
AS_HELP_STRING([--enable-compile-warnings=@<:@no/minimum/yes/maximum/error@:>@],[Turn on compiler warnings]),,
enable_compile_warnings=error)
changequote(,)dnl
if test "$enable_compile_warnings" != no ; then
if test "x$GCC" = "xyes"; then
case " $CFLAGS " in
*[\ \ ]-Wall[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Wall" ;;
esac
case " $CFLAGS " in
*[\ \ ]-Wmissing-prototypes[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Wmissing-prototypes" ;;
esac
if test "$enable_compile_warnings" = error ; then
case " $CFLAGS " in
*[\ \ ]-Werror[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
esac
fi
fi
fi
changequote([,])dnl
AC_ARG_ENABLE(jhbuild-wrapper-script, AC_ARG_ENABLE(jhbuild-wrapper-script,
AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no) AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no)

View File

@@ -65,11 +65,6 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
menuitem in single-user, single-session situations. menuitem in single-user, single-session situations.
</_description> </_description>
</key> </key>
<key name="show-full-name" type="b">
<default>true</default>
<_summary>Show full name in the user menu</_summary>
<_description>Whether the users full name is shown in the user menu or not.</_description>
</key>
<key name="remember-mount-password" type="b"> <key name="remember-mount-password" type="b">
<default>false</default> <default>false</default>
<_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary> <_summary>Whether to remember password for mounting encrypted or remote filesystems</_summary>

View File

@@ -727,6 +727,10 @@ StScrollBar StButton#vhandle:active {
-vertical-spacing: 32px; -vertical-spacing: 32px;
} }
.window-picker.external-monitor {
padding: 32px;
}
/* Dash */ /* Dash */
#dash { #dash {
@@ -751,10 +755,6 @@ StScrollBar StButton#vhandle:active {
height: 24px; height: 24px;
} }
#viewSelector {
spacing: 1em;
}
/* Search Box */ /* Search Box */
#searchEntry { #searchEntry {
@@ -779,6 +779,10 @@ StScrollBar StButton#vhandle:active {
spacing: 18px; spacing: 18px;
} }
#searchResultsBin {
max-width: 1000px;
}
#searchResultsContent { #searchResultsContent {
padding-right: 20px; padding-right: 20px;
spacing: 16px; spacing: 16px;
@@ -959,7 +963,8 @@ StScrollBar StButton#vhandle:active {
color: white; color: white;
} }
.show-apps:checked > .overview-icon { .show-apps:checked > .overview-icon,
.show-apps:active > .overview-icon {
background-gradient-start: rgba(255, 255, 255, .05); background-gradient-start: rgba(255, 255, 255, .05);
background-gradient-end: rgba(255, 255, 255, .15); background-gradient-end: rgba(255, 255, 255, .15);
background-gradient-direction: vertical; background-gradient-direction: vertical;
@@ -1313,7 +1318,6 @@ StScrollBar StButton#vhandle:active {
#message-tray { #message-tray {
background: #2e3436 url(message-tray-background.png); background: #2e3436 url(message-tray-background.png);
background-repeat: repeat; background-repeat: repeat;
transition-duration: 250ms;
height: 72px; height: 72px;
} }
@@ -2413,6 +2417,7 @@ StScrollBar StButton#vhandle:active {
.screen-shield-notifications-box { .screen-shield-notifications-box {
spacing: 18px; spacing: 18px;
max-width: 34em;
} }
.screen-shield-notification-source { .screen-shield-notification-source {

View File

@@ -66,4 +66,11 @@ its dependencies to build from tarballs.</description>
<gnome:userid>fmuellner</gnome:userid> <gnome:userid>fmuellner</gnome:userid>
</foaf:Person> </foaf:Person>
</maintainer> </maintainer>
<maintainer>
<foaf:Person>
<foaf:name>Ray Strode</foaf:name>
<foaf:mbox rdf:resource="mailto:halfline@gmail.com" />
<gnome:userid>halfline</gnome:userid>
</foaf:Person>
</maintainer>
</Project> </Project>

View File

@@ -28,6 +28,7 @@ nobase_dist_js_DATA = \
misc/extensionUtils.js \ misc/extensionUtils.js \
misc/fileUtils.js \ misc/fileUtils.js \
misc/gnomeSession.js \ misc/gnomeSession.js \
misc/hash.js \
misc/history.js \ misc/history.js \
misc/jsParse.js \ misc/jsParse.js \
misc/loginManager.js \ misc/loginManager.js \

View File

@@ -128,6 +128,7 @@ const UserListItem = new Lang.Class({
let layout = new St.BoxLayout({ vertical: false }); let layout = new St.BoxLayout({ vertical: false });
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item', this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true, can_focus: true,
child: layout, child: layout,
reactive: true, reactive: true,
@@ -492,6 +493,7 @@ const SessionListItem = new Lang.Class({
this.id = id; this.id = id;
this.actor = new St.Button({ style_class: 'login-dialog-session-list-item', this.actor = new St.Button({ style_class: 'login-dialog-session-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true, can_focus: true,
reactive: true, reactive: true,
x_fill: true, x_fill: true,
@@ -552,6 +554,7 @@ const SessionList = new Lang.Class({
this.actor.child = this._box; this.actor.child = this._box;
this._button = new St.Button({ style_class: 'login-dialog-session-list-button', this._button = new St.Button({ style_class: 'login-dialog-session-list-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true, can_focus: true,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
@@ -674,7 +677,7 @@ const LoginDialog = new Lang.Class({
this.parent({ shellReactive: true, this.parent({ shellReactive: true,
styleClass: 'login-dialog', styleClass: 'login-dialog',
parentActor: parentActor, parentActor: parentActor,
keybindingMode: Main.KeybindingMode.LOGIN_SCREEN, keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN,
shouldFadeIn: false }); shouldFadeIn: false });
this.connect('destroy', this.connect('destroy',
Lang.bind(this, this._onDestroy)); Lang.bind(this, this._onDestroy));
@@ -787,6 +790,7 @@ const LoginDialog = new Lang.Class({
let notListedLabel = new St.Label({ text: _("Not listed?"), let notListedLabel = new St.Label({ text: _("Not listed?"),
style_class: 'login-dialog-not-listed-label' }); style_class: 'login-dialog-not-listed-label' });
this._notListedButton = new St.Button({ style_class: 'login-dialog-not-listed-button', this._notListedButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true, can_focus: true,
child: notListedLabel, child: notListedLabel,
reactive: true, reactive: true,

141
js/misc/hash.js Normal file
View File

@@ -0,0 +1,141 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const System = imports.system;
const Params = imports.misc.params;
// This is an implementation of EcmaScript SameValue algorithm,
// which returns true if two values are not observably distinguishable.
// It was taken from http://wiki.ecmascript.org/doku.php?id=harmony:egal
//
// In the future, we may want to use the 'is' operator instead.
function _sameValue(x, y) {
if (x === y) {
// 0 === -0, but they are not identical
return x !== 0 || 1 / x === 1 / y;
}
// NaN !== NaN, but they are identical.
// NaNs are the only non-reflexive value, i.e., if x !== x,
// then x is a NaN.
// isNaN is broken: it converts its argument to number, so
// isNaN("foo") => true
return x !== x && y !== y;
}
const _hashers = {
object: function(o) { return o ? System.addressOf(o) : 'null'; },
function: function(f) { return System.addressOf(f); },
string: function(s) { return s; },
number: function(n) { return String(n); },
undefined: function() { return 'undefined'; },
};
/* Map is meant to be similar in usage to ES6 Map, which is
described at http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets,
without requiring more than ES5 + Gjs extensions.
Known differences from other implementations:
Polyfills around the web usually implement HashMaps for
primitive values and reversed WeakMaps for object keys,
but we want real maps with real O(1) semantics in all cases,
and the easiest way is to have different hashers for different
types.
Known differences from the ES6 specification:
- Map is a Lang.Class, not a ES6 class, so inheritance,
prototype, sealing, etc. work differently.
- items(), keys() and values() don't return iterators,
they return actual arrays, so they incur a full copy everytime
they're called, and they don't see changes if you mutate
the table while iterating
(admittedly, the ES6 spec is a bit unclear on this, and
the reference code would just blow up)
*/
const Map = new Lang.Class({
Name: 'Map',
_init: function(iterable) {
this._pool = { };
if (iterable) {
for (let i = 0; i < iterable.length; i++) {
let [key, value] = iterable[i];
this.set(key, value);
}
}
},
_hashKey: function(key) {
let type = typeof(key);
return type + ':' + _hashers[type](key);
},
_internalGet: function(key) {
let hash = this._hashKey(key);
let node = this._pool[hash];
if (node && _sameValue(node.key, key))
return [true, node.value];
else
return [false, null];
},
get: function(key) {
return this._internalGet(key)[1];
},
has: function(key) {
return this._internalGet(key)[0];
},
set: function(key, value) {
let hash = this._hashKey(key);
let node = this._pool[hash];
if (node) {
node.key = key;
node.value = value;
} else {
this._pool[hash] = { key: key, value: value };
}
},
delete: function(key) {
let hash = this._hashKey(key);
let node = this._pool[hash];
if (node && _sameValue(node.key, key)) {
delete this._pool[hash];
return [node.key, node.value];
} else {
return [null, null];
}
},
keys: function() {
let pool = this._pool;
return Object.getOwnPropertyNames(pool).map(function(hash) {
return pool[hash].key;
});
},
values: function() {
let pool = this._pool;
return Object.getOwnPropertyNames(pool).map(function(hash) {
return pool[hash].value;
});
},
items: function() {
let pool = this._pool;
return Object.getOwnPropertyNames(pool).map(function(hash) {
return [pool[hash].key, pool[hash].value];
});
},
size: function() {
return Object.getOwnPropertyNames(this._pool).length;
},
});

View File

@@ -153,6 +153,7 @@ const ViewByCategories = new Lang.Class({
y_fill: false, y_fill: false,
style_class: 'vfade' }); style_class: 'vfade' });
this._categoryScroll.add_actor(this._categoryBox); this._categoryScroll.add_actor(this._categoryBox);
this._categoryScroll.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true }); this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true });
this.actor.add(this._categoryScroll, { expand: false, y_fill: false, y_align: St.Align.START }); this.actor.add(this._categoryScroll, { expand: false, y_fill: false, y_align: St.Align.START });

View File

@@ -88,7 +88,9 @@ const AutomountManager = new Lang.Class({
if (!this._loginManager.sessionActive) if (!this._loginManager.sessionActive)
return; return;
global.play_theme_sound(0, 'device-added-media'); global.play_theme_sound(0, 'device-added-media',
_("External drive connected"),
null);
}, },
_onDriveDisconnected: function() { _onDriveDisconnected: function() {
@@ -97,7 +99,9 @@ const AutomountManager = new Lang.Class({
if (!this._loginManager.sessionActive) if (!this._loginManager.sessionActive)
return; return;
global.play_theme_sound(0, 'device-removed-media'); global.play_theme_sound(0, 'device-removed-media',
_("External drive disconnected"),
null);
}, },
_onDriveEjectButton: function(monitor, drive) { _onDriveEjectButton: function(monitor, drive) {

View File

@@ -293,7 +293,6 @@ const AutorunResidentSource = new Lang.Class({
_init: function(manager) { _init: function(manager) {
this.parent(_("Removable Devices"), 'media-removable'); this.parent(_("Removable Devices"), 'media-removable');
this.showInLockScreen = false;
this._mounts = []; this._mounts = [];
@@ -301,6 +300,10 @@ const AutorunResidentSource = new Lang.Class({
this._notification = new AutorunResidentNotification(this._manager, this); this._notification = new AutorunResidentNotification(this._manager, this);
}, },
_createPolicy: function() {
return new MessageTray.NotificationPolicy({ showInLockScreen: false });
},
buildRightClickMenu: function() { buildRightClickMenu: function() {
return null; return null;
}, },

View File

@@ -20,8 +20,8 @@ const Recorder = new Lang.Class({
Main.wm.addKeybinding('toggle-recording', Main.wm.addKeybinding('toggle-recording',
this._bindingSettings, this._bindingSettings,
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleRecorder)); Lang.bind(this, this._toggleRecorder));
}, },

View File

@@ -13,6 +13,7 @@ const Tp = imports.gi.TelepathyGLib;
const History = imports.misc.history; const History = imports.misc.history;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const Params = imports.misc.params; const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@@ -415,6 +416,8 @@ const TelepathyClient = new Lang.Class({
_ensureAppSource: function() { _ensureAppSource: function() {
if (this._appSource == null) { if (this._appSource == null) {
this._appSource = new MessageTray.Source(_("Chat"), 'empathy'); this._appSource = new MessageTray.Source(_("Chat"), 'empathy');
this._appSource.policy = new NotificationDaemon.NotificationApplicationPolicy('empathy');
Main.messageTray.add(this._appSource); Main.messageTray.add(this._appSource);
this._appSource.connect('destroy', Lang.bind(this, function () { this._appSource.connect('destroy', Lang.bind(this, function () {
this._appSource = null; this._appSource = null;
@@ -484,6 +487,10 @@ const ChatSource = new Lang.Class({
return rightClickMenu; return rightClickMenu;
}, },
_createPolicy: function() {
return new NotificationDaemon.NotificationApplicationPolicy('empathy');
},
_updateAlias: function() { _updateAlias: function() {
let oldAlias = this.title; let oldAlias = this.title;
let newAlias = this._contact.get_alias(); let newAlias = this._contact.get_alias();
@@ -1048,6 +1055,10 @@ const ApproverSource = new Lang.Class({
})); }));
}, },
_createPolicy: function() {
return new NotificationDaemon.NotificationApplicationPolicy('empathy');
},
destroy: function() { destroy: function() {
if (this._invalidId != 0) { if (this._invalidId != 0) {
this._dispatchOp.disconnect(this._invalidId); this._dispatchOp.disconnect(this._invalidId);

View File

@@ -84,12 +84,26 @@ const DateMenuButton = new Lang.Class({
})); }));
vbox.add(this._calendar.actor); vbox.add(this._calendar.actor);
let separator = new PopupMenu.PopupSeparatorMenuItem();
separator.setColumnWidths(1);
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._openClocksItem = new PopupMenu.PopupMenuItem(_("Open Clocks"));
this._openClocksItem.connect('activate', Lang.bind(this, this._onOpenClocksActivate));
this._openClocksItem.actor.can_focus = false;
vbox.add(this._openClocksItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
Shell.AppSystem.get_default().connect('installed-changed',
Lang.bind(this, this._appInstalledChanged));
this._appInstalledChanged();
item = this.menu.addSettingsAction(_("Date and Time Settings"), 'gnome-datetime-panel.desktop'); item = this.menu.addSettingsAction(_("Date and Time Settings"), 'gnome-datetime-panel.desktop');
if (item) { if (item) {
let separator = new PopupMenu.PopupSeparatorMenuItem();
separator.setColumnWidths(1);
vbox.add(separator.actor, {y_align: St.Align.END, expand: true, y_fill: false});
item.actor.show_on_set_parent = false; item.actor.show_on_set_parent = false;
item.actor.can_focus = false; item.actor.can_focus = false;
item.actor.reparent(vbox); item.actor.reparent(vbox);
@@ -109,11 +123,6 @@ const DateMenuButton = new Lang.Class({
// Event list // Event list
vbox.add(this._eventList.actor, { expand: true }); vbox.add(this._eventList.actor, { expand: true });
this._openCalendarItem = new PopupMenu.PopupMenuItem(_("Open Calendar"));
this._openCalendarItem.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
// Whenever the menu is opened, select today // Whenever the menu is opened, select today
this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) { this.menu.connect('open-state-changed', Lang.bind(this, function(menu, isOpen) {
if (isOpen) { if (isOpen) {
@@ -147,6 +156,11 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated(); this._sessionUpdated();
}, },
_appInstalledChanged: function() {
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
this._openClocksItem.actor.visible = app !== null;
},
_setEventsVisibility: function(visible) { _setEventsVisibility: function(visible) {
this._openCalendarItem.actor.visible = visible; this._openCalendarItem.actor.visible = visible;
this._separator.visible = visible; this._separator.visible = visible;
@@ -198,5 +212,11 @@ const DateMenuButton = new Lang.Class({
let app = Gio.AppInfo.get_default_for_type('text/calendar', false); let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
app.launch([], global.create_app_launch_context()); app.launch([], global.create_app_launch_context());
},
_onOpenClocksActivate: function() {
this.menu.close();
let app = Shell.AppSystem.get_default().lookup_app('gnome-clocks.desktop');
app.activate();
} }
}); });

View File

@@ -142,7 +142,6 @@ const Keyboard = new Lang.Class({
this._focusInExtendedKeys = false; this._focusInExtendedKeys = false;
this._timestamp = global.display.get_current_time_roundtrip(); this._timestamp = global.display.get_current_time_roundtrip();
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw));
this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA }); this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged)); this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
@@ -161,9 +160,8 @@ const Keyboard = new Lang.Class({
})); }));
this._keyboardRequested = false; this._keyboardRequested = false;
this._keyboardRestingId = 0; this._keyboardRestingId = 0;
},
init: function () { Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._redraw));
this._redraw(); this._redraw();
}, },
@@ -637,11 +635,7 @@ const KeyboardSource = new Lang.Class({
this.keepTrayOnSummaryClick = true; this.keepTrayOnSummaryClick = true;
}, },
handleSummaryClick: function() { handleSummaryClick: function(button) {
let event = Clutter.get_current_event();
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
return false;
this.open(); this.open();
return true; return true;
}, },

File diff suppressed because it is too large Load Diff

View File

@@ -3,6 +3,7 @@
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const Params = imports.misc.params; const Params = imports.misc.params;
@@ -101,6 +102,7 @@ const Lightbox = new Lang.Class({
}, },
show: function() { show: function() {
Tweener.removeTweens(this.actor);
if (this._fadeInTime) { if (this._fadeInTime) {
this.shown = false; this.shown = false;
this.actor.opacity = 0; this.actor.opacity = 0;
@@ -110,17 +112,20 @@ const Lightbox = new Lang.Class({
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
this.shown = true; this.shown = true;
this.emit('shown');
}) })
}); });
} else { } else {
this.actor.opacity = 255 * this._fadeFactor; this.actor.opacity = 255 * this._fadeFactor;
this.shown = true; this.shown = true;
this.emit('shown');
} }
this.actor.show(); this.actor.show();
}, },
hide: function() { hide: function() {
this.shown = false; this.shown = false;
Tweener.removeTweens(this.actor);
if (this._fadeOutTime) { if (this._fadeOutTime) {
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
@@ -197,3 +202,4 @@ const Lightbox = new Lang.Class({
this.highlight(null); this.highlight(null);
} }
}); });
Signals.addSignalMethods(Lightbox.prototype);

View File

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

View File

@@ -38,20 +38,6 @@ const XdndHandler = imports.ui.xdndHandler;
const Util = imports.misc.util; const Util = imports.misc.util;
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides'; const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const KeybindingMode = {
NONE: 0, // block all keybindings
NORMAL: 1 << 0, // window mode
OVERVIEW: 1 << 1,
LOCK_SCREEN: 1 << 2,
UNLOCK_SCREEN: 1 << 3,
LOGIN_SCREEN: 1 << 4,
MESSAGE_TRAY: 1 << 5,
SYSTEM_MODAL: 1 << 6,
LOOKING_GLASS: 1 << 7,
ALL: ~0,
};
let componentManager = null; let componentManager = null;
let panel = null; let panel = null;
@@ -69,13 +55,14 @@ let shellDBusService = null;
let shellMountOpDBusService = null; let shellMountOpDBusService = null;
let screenSaverDBus = null; let screenSaverDBus = null;
let modalCount = 0; let modalCount = 0;
let keybindingMode = KeybindingMode.NORMAL; let keybindingMode = Shell.KeyBindingMode.NORMAL;
let modalActorFocusStack = []; let modalActorFocusStack = [];
let uiGroup = null; let uiGroup = null;
let magnifier = null; let magnifier = null;
let xdndHandler = null; let xdndHandler = null;
let keyboard = null; let keyboard = null;
let layoutManager = null; let layoutManager = null;
let background = null;
let _startDate; let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
@@ -83,15 +70,15 @@ let _overridesSettings = null;
function _sessionUpdated() { function _sessionUpdated() {
wm.setCustomKeybindingHandler('panel-main-menu', wm.setCustomKeybindingHandler('panel-main-menu',
KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null); sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null);
wm.allowKeybinding('overlay-key', KeybindingMode.NORMAL | wm.allowKeybinding('overlay-key', Shell.KeyBindingMode.NORMAL |
KeybindingMode.OVERVIEW); Shell.KeyBindingMode.OVERVIEW);
wm.setCustomKeybindingHandler('panel-run-dialog', wm.setCustomKeybindingHandler('panel-run-dialog',
KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
sessionMode.hasRunDialog ? openRunDialog : null); sessionMode.hasRunDialog ? openRunDialog : null);
if (sessionMode.isGreeter) if (sessionMode.isGreeter)
screenShield.showDialog(); screenShield.showDialog();
@@ -124,38 +111,17 @@ function start() {
tracker.connect('startup-sequence-changed', _queueCheckWorkspaces); tracker.connect('startup-sequence-changed', _queueCheckWorkspaces);
// The stage is always covered so Clutter doesn't need to clear it; however // Setup the stage hierarchy early
// the color is used as the default contents for the Mutter root background layoutManager = new Layout.LayoutManager();
// actor so set it anyways. // For backward compatibility
global.stage.color = DEFAULT_BACKGROUND_COLOR; uiGroup = layoutManager.uiGroup;
global.stage.no_clear_hint = true;
let backgroundActor = global.window_group.background;
background = backgroundActor.settings;
_defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css'; _defaultCssStylesheet = global.datadir + '/theme/gnome-shell.css';
loadTheme(); loadTheme();
// Set up stage hierarchy to group all UI actors under one container.
uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
uiGroup.connect('allocate',
function (actor, box, flags) {
let children = uiGroup.get_children();
for (let i = 0; i < children.length; i++)
children[i].allocate_preferred_size(flags);
});
uiGroup.connect('get-preferred-width',
function(actor, forHeight, alloc) {
let width = global.stage.width;
[alloc.min_size, alloc.natural_size] = [width, width];
});
uiGroup.connect('get-preferred-height',
function(actor, forWidth, alloc) {
let height = global.stage.height;
[alloc.min_size, alloc.natural_size] = [height, height];
});
global.window_group.reparent(uiGroup);
global.overlay_group.reparent(uiGroup);
global.stage.add_actor(uiGroup);
layoutManager = new Layout.LayoutManager();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager(); ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
overview = new Overview.Overview(); overview = new Overview.Overview();
@@ -173,7 +139,6 @@ function start() {
componentManager = new Components.ComponentManager(); componentManager = new Components.ComponentManager();
layoutManager.init(); layoutManager.init();
keyboard.init();
overview.init(); overview.init();
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT, global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
@@ -210,6 +175,14 @@ function start() {
ExtensionDownloader.init(); ExtensionDownloader.init();
ExtensionSystem.init(); ExtensionSystem.init();
// Run the startup animation as soon as the mainloop is idle enough
// This is necessary to have it smooth and without interruptions from
// completed IO tasks
GLib.idle_add(GLib.PRIORITY_LOW, function() {
layoutManager.startupAnimation();
return false;
});
} }
let _workspaces = []; let _workspaces = [];
@@ -518,7 +491,7 @@ function isInModalStack(actor) {
* - options: Meta.ModalOptions flags to indicate that the pointer is * - options: Meta.ModalOptions flags to indicate that the pointer is
* already grabbed * already grabbed
* *
* - keybindingMode: used to set the current Main.KeybindingMode to filter * - keybindingMode: used to set the current Shell.KeyBindingMode to filter
* global keybindings; the default of NONE will filter * global keybindings; the default of NONE will filter
* out all keybindings * out all keybindings
* *
@@ -527,7 +500,7 @@ function isInModalStack(actor) {
function pushModal(actor, params) { function pushModal(actor, params) {
params = Params.parse(params, { timestamp: global.get_current_time(), params = Params.parse(params, { timestamp: global.get_current_time(),
options: 0, options: 0,
keybindingMode: KeybindingMode.NONE }); keybindingMode: Shell.KeyBindingMode.NONE });
if (modalCount == 0) { if (modalCount == 0) {
if (!global.begin_modal(params.timestamp, params.options)) { if (!global.begin_modal(params.timestamp, params.options)) {
@@ -588,7 +561,7 @@ function popModal(actor, timestamp) {
global.stage.set_key_focus(null); global.stage.set_key_focus(null);
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL); global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
keybindingMode = KeybindingMode.NORMAL; keybindingMode = Shell.KeyBindingMode.NORMAL;
throw new Error('incorrect pop'); throw new Error('incorrect pop');
} }
@@ -637,7 +610,7 @@ function popModal(actor, timestamp) {
global.end_modal(timestamp); global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL); global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
Meta.enable_unredirect_for_screen(global.screen); Meta.enable_unredirect_for_screen(global.screen);
keybindingMode = KeybindingMode.NORMAL; keybindingMode = Shell.KeyBindingMode.NORMAL;
} }
function createLookingGlass() { function createLookingGlass() {

View File

@@ -18,6 +18,7 @@ const BoxPointer = imports.ui.boxpointer;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const GrabHelper = imports.ui.grabHelper; const GrabHelper = imports.ui.grabHelper;
const Hash = imports.misc.hash;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const PointerWatcher = imports.ui.pointerWatcher; const PointerWatcher = imports.ui.pointerWatcher;
@@ -243,6 +244,36 @@ function makeCloseButton() {
return closeButton; return closeButton;
} }
function strHasSuffix(string, suffix) {
return string.substr(-suffix.length) == suffix;
}
// NotificationPolicy:
// An object that holds all bits of configurable policy related to a notification
// source, such as whether to play sound or honour the critical bit.
//
// A notification without a policy object will inherit the default one.
const NotificationPolicy = new Lang.Class({
Name: 'NotificationPolicy',
_init: function(params) {
params = Params.parse(params, { enable: true,
enableSound: true,
showBanners: true,
forceExpanded: false,
showInLockScreen: true,
detailsInLockScreen: false
});
Lang.copyProperties(params, this);
},
// Do nothing for the default policy. These methods are only useful for the
// GSettings policy.
store: function() { },
destroy: function() { }
});
Signals.addSignalMethods(NotificationPolicy.prototype);
// Notification: // Notification:
// @source: the notification's Source // @source: the notification's Source
// @title: the title // @title: the title
@@ -314,6 +345,7 @@ const Notification = new Lang.Class({
this.resident = false; this.resident = false;
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name // 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
this.isTransient = false; this.isTransient = false;
this.isMusic = false;
this.forFeedback = false; this.forFeedback = false;
this.expanded = false; this.expanded = false;
this.focused = false; this.focused = false;
@@ -321,8 +353,8 @@ const Notification = new Lang.Class({
this._destroyed = false; this._destroyed = false;
this._useActionIcons = false; this._useActionIcons = false;
this._customContent = false; this._customContent = false;
this._bannerBodyText = null; this.bannerBodyText = null;
this._bannerBodyMarkup = false; this.bannerBodyMarkup = false;
this._titleFitsInBannerMode = true; this._titleFitsInBannerMode = true;
this._titleDirection = Clutter.TextDirection.DEFAULT; this._titleDirection = Clutter.TextDirection.DEFAULT;
this._spacing = 0; this._spacing = 0;
@@ -429,7 +461,7 @@ const Notification = new Lang.Class({
this._actionArea = null; this._actionArea = null;
this._buttonBox = null; this._buttonBox = null;
} }
if (this._imageBin && params.clear) if (params.clear)
this.unsetImage(); this.unsetImage();
if (!this._scrollArea && !this._actionArea && !this._imageBin) if (!this._scrollArea && !this._actionArea && !this._imageBin)
@@ -474,12 +506,12 @@ const Notification = new Lang.Class({
// is done correctly automatically. // is done correctly automatically.
this._table.set_text_direction(this._titleDirection); this._table.set_text_direction(this._titleDirection);
// Unless the notification has custom content, we save this._bannerBodyText // Unless the notification has custom content, we save this.bannerBodyText
// to add it to the content of the notification if the notification is // to add it to the content of the notification if the notification is
// expandable due to other elements in its content area or due to the banner // expandable due to other elements in its content area or due to the banner
// not fitting fully in the single-line mode. // not fitting fully in the single-line mode.
this._bannerBodyText = this._customContent ? null : banner; this.bannerBodyText = this._customContent ? null : banner;
this._bannerBodyMarkup = params.bannerMarkup; this.bannerBodyMarkup = params.bannerMarkup;
banner = banner ? banner.replace(/\n/g, ' ') : ''; banner = banner ? banner.replace(/\n/g, ' ') : '';
@@ -487,7 +519,7 @@ const Notification = new Lang.Class({
this._bannerLabel.queue_relayout(); this._bannerLabel.queue_relayout();
// Add the bannerBody now if we know for sure we'll need it // Add the bannerBody now if we know for sure we'll need it
if (this._bannerBodyText && this._bannerBodyText.indexOf('\n') > -1) if (this.bannerBodyText && this.bannerBodyText.indexOf('\n') > -1)
this._addBannerBody(); this._addBannerBody();
if (params.body) if (params.body)
@@ -511,7 +543,8 @@ const Notification = new Lang.Class({
this._table.add_style_class_name('multi-line-notification'); this._table.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ style_class: 'notification-scrollview', this._scrollArea = new St.ScrollView({ style_class: 'notification-scrollview',
vscrollbar_policy: this._scrollPolicy, vscrollbar_policy: this._scrollPolicy,
hscrollbar_policy: Gtk.PolicyType.NEVER }); hscrollbar_policy: Gtk.PolicyType.NEVER,
visible: this.expanded });
this._table.add(this._scrollArea, { row: 1, this._table.add(this._scrollArea, { row: 1,
col: 2 }); col: 2 });
this._updateLastColumnSettings(); this._updateLastColumnSettings();
@@ -552,10 +585,10 @@ const Notification = new Lang.Class({
}, },
_addBannerBody: function() { _addBannerBody: function() {
if (this._bannerBodyText) { if (this.bannerBodyText) {
let text = this._bannerBodyText; let text = this.bannerBodyText;
this._bannerBodyText = null; this.bannerBodyText = null;
this.addBody(text, this._bannerBodyMarkup); this.addBody(text, this.bannerBodyMarkup);
} }
}, },
@@ -587,6 +620,7 @@ const Notification = new Lang.Class({
this._addBannerBody(); this._addBannerBody();
} }
this._actionArea = actor; this._actionArea = actor;
this._actionArea.visible = this.expanded;
if (!props) if (!props)
props = {}; props = {};
@@ -609,13 +643,15 @@ const Notification = new Lang.Class({
}, },
setImage: function(image) { setImage: function(image) {
if (this._imageBin) this.unsetImage();
this.unsetImage();
if (!image) if (!image)
return; return;
this._imageBin = new St.Bin();
this._imageBin.child = image; this._imageBin = new St.Bin({ opacity: 230,
this._imageBin.opacity = 230; child: image,
visible: this.expanded });
this._table.add_style_class_name('multi-line-notification'); this._table.add_style_class_name('multi-line-notification');
this._table.add_style_class_name('notification-with-image'); this._table.add_style_class_name('notification-with-image');
this._addBannerBody(); this._addBannerBody();
@@ -665,9 +701,10 @@ const Notification = new Lang.Class({
let button = new St.Button({ can_focus: true }); let button = new St.Button({ can_focus: true });
button._actionId = id; button._actionId = id;
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) { let iconName = strHasSuffix(id, '-symbolic') ? id : id + '-symbolic';
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(iconName)) {
button.add_style_class_name('notification-icon-button'); button.add_style_class_name('notification-icon-button');
button.child = new St.Icon({ icon_name: id }); button.child = new St.Icon({ icon_name: iconName });
} else { } else {
button.add_style_class_name('notification-button'); button.add_style_class_name('notification-button');
button.label = label; button.label = label;
@@ -843,7 +880,7 @@ const Notification = new Lang.Class({
}, },
_canExpandContent: function() { _canExpandContent: function() {
return this._bannerBodyText || return this.bannerBodyText ||
(!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification')); (!this._titleFitsInBannerMode && !this._table.has_style_class_name('multi-line-notification'));
}, },
@@ -856,6 +893,14 @@ const Notification = new Lang.Class({
this.expanded = true; this.expanded = true;
this.actor.remove_style_class_name('notification-unexpanded'); this.actor.remove_style_class_name('notification-unexpanded');
// Show additional content that we keep hidden in banner mode
if (this._imageBin)
this._imageBin.show();
if (this._actionArea)
this._actionArea.show();
if (this._scrollArea)
this._scrollArea.show();
// The banner is never shown when the title did not fit, so this // The banner is never shown when the title did not fit, so this
// can be an if-else statement. // can be an if-else statement.
if (!this._titleFitsInBannerMode) { if (!this._titleFitsInBannerMode) {
@@ -887,12 +932,23 @@ const Notification = new Lang.Class({
if (this._destroyed) if (this._destroyed)
return; return;
this.expanded = false; this.expanded = false;
// Hide additional content that we keep hidden in banner mode
if (this._imageBin)
this._imageBin.hide();
if (this._actionArea)
this._actionArea.hide();
if (this._scrollArea)
this._scrollArea.hide();
// Make sure we don't line wrap the title, and ellipsize it instead. // Make sure we don't line wrap the title, and ellipsize it instead.
this._titleLabel.clutter_text.line_wrap = false; this._titleLabel.clutter_text.line_wrap = false;
this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.END; this._titleLabel.clutter_text.ellipsize = Pango.EllipsizeMode.END;
// Restore banner opacity in case the notification is shown in the // Restore banner opacity in case the notification is shown in the
// banner mode again on update. // banner mode again on update.
this._bannerLabel.opacity = 255; this._bannerLabel.opacity = 255;
// Restore height requisition // Restore height requisition
this.actor.add_style_class_name('notification-unexpanded'); this.actor.add_style_class_name('notification-unexpanded');
this.emit('collapsed'); this.emit('collapsed');
@@ -1060,10 +1116,11 @@ const Source = new Lang.Class({
this.isTransient = false; this.isTransient = false;
this.isChat = false; this.isChat = false;
this.isMuted = false; this.isMuted = false;
this.showInLockScreen = true;
this.keepTrayOnSummaryClick = false; this.keepTrayOnSummaryClick = false;
this.notifications = []; this.notifications = [];
this.policy = this._createPolicy();
}, },
get count() { get count() {
@@ -1082,6 +1139,10 @@ const Source = new Lang.Class({
this.emit('count-updated'); this.emit('count-updated');
}, },
_createPolicy: function() {
return new NotificationPolicy();
},
buildRightClickMenu: function() { buildRightClickMenu: function() {
let item; let item;
let rightClickMenu = new St.BoxLayout({ name: 'summary-right-click-menu', let rightClickMenu = new St.BoxLayout({ name: 'summary-right-click-menu',
@@ -1171,11 +1232,13 @@ const Source = new Lang.Class({
notify: function(notification) { notify: function(notification) {
notification.acknowledged = false; notification.acknowledged = false;
this.pushNotification(notification); this.pushNotification(notification);
if (!this.isMuted)
this.emit('notify', notification); if (!this.isMuted && this.policy.showBanners)
this.emit('notify', notification);
}, },
destroy: function(reason) { destroy: function(reason) {
this.policy.destroy();
this.emit('destroy', reason); this.emit('destroy', reason);
}, },
@@ -1217,7 +1280,16 @@ const Source = new Lang.Class({
hasResidentNotification: function() { hasResidentNotification: function() {
return this.notifications.some(function(n) { return n.resident; }); return this.notifications.some(function(n) { return n.resident; });
} },
getMusicNotification: function() {
for (let i = 0; i < this.notifications.length; i++) {
if (this.notifications[i].isMusic)
return this.notifications[i];
}
return null;
},
}); });
Signals.addSignalMethods(Source.prototype); Signals.addSignalMethods(Source.prototype);
@@ -1271,6 +1343,14 @@ const SummaryItem = new Lang.Class({
global.focus_manager.add_group(this.rightClickMenu); global.focus_manager.add_group(this.rightClickMenu);
}, },
destroy: function() {
// remove the actor from the summary item so it doesn't get destroyed
// with us
this._sourceBox.remove_actor(this._sourceIcon);
this.actor.destroy();
},
_onKeyPress: function(actor, event) { _onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Up) { if (event.get_key_symbol() == Clutter.KEY_Up) {
actor.emit('clicked', 1); actor.emit('clicked', 1);
@@ -1455,7 +1535,7 @@ const MessageTray = new Lang.Class({
this.idleMonitor = new GnomeDesktop.IdleMonitor(); this.idleMonitor = new GnomeDesktop.IdleMonitor();
this._grabHelper = new GrabHelper.GrabHelper(this.actor, this._grabHelper = new GrabHelper.GrabHelper(this.actor,
{ keybindingMode: Main.KeybindingMode.MESSAGE_TRAY }); { keybindingMode: Shell.KeyBindingMode.MESSAGE_TRAY });
this._grabHelper.addActor(this._summaryBoxPointer.actor); this._grabHelper.addActor(this._summaryBoxPointer.actor);
this._grabHelper.addActor(this.actor); this._grabHelper.addActor(this.actor);
if (Main.panel.statusArea.activities) if (Main.panel.statusArea.activities)
@@ -1515,7 +1595,6 @@ const MessageTray = new Lang.Class({
function() { function() {
this._overviewVisible = false; this._overviewVisible = false;
this._escapeTray(); this._escapeTray();
this.actor.remove_style_pseudo_class('overview');
this._updateState(); this._updateState();
})); }));
@@ -1524,19 +1603,19 @@ const MessageTray = new Lang.Class({
Main.wm.addKeybinding('toggle-message-tray', Main.wm.addKeybinding('toggle-message-tray',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.MESSAGE_TRAY | Shell.KeyBindingMode.MESSAGE_TRAY |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this.toggleAndNavigate)); Lang.bind(this, this.toggleAndNavigate));
Main.wm.addKeybinding('focus-active-notification', Main.wm.addKeybinding('focus-active-notification',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.MESSAGE_TRAY | Shell.KeyBindingMode.MESSAGE_TRAY |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._expandActiveNotification)); Lang.bind(this, this._expandActiveNotification));
this._summaryItems = []; this._sources = new Hash.Map();
this._chatSummaryItemsCount = 0; this._chatSummaryItemsCount = 0;
let pointerWatcher = PointerWatcher.getPointerWatcher(); let pointerWatcher = PointerWatcher.getPointerWatcher();
@@ -1546,22 +1625,19 @@ const MessageTray = new Lang.Class({
this._trayDwellUserTime = 0; this._trayDwellUserTime = 0;
this._sessionUpdated(); this._sessionUpdated();
this._noMessages = new St.Label({ text: _("No Messages"),
style_class: 'no-messages-label',
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this.actor.add_actor(this._noMessages);
this._updateNoMessagesLabel(); this._updateNoMessagesLabel();
}, },
_updateNoMessagesLabel: function() { _updateNoMessagesLabel: function() {
if (this._summaryItems.length == 0 && !this._noMessages) { this._noMessages.visible = this._sources.size() == 0;
this._noMessages = new St.Label({ text: _("No Messages"),
style_class: 'no-messages-label',
x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this.actor.add_actor(this._noMessages);
} else if (this._summaryItems.length > 0 && this._noMessages) {
this._noMessages.destroy();
this._noMessages = null;
}
}, },
_sessionUpdated: function() { _sessionUpdated: function() {
@@ -1630,10 +1706,7 @@ const MessageTray = new Lang.Class({
}, },
_onNotificationKeyRelease: function(actor, event) { _onNotificationKeyRelease: function(actor, event) {
let ignoredModifiers = global.display.get_ignored_modifier_mask(); if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
let modifierState = event.get_state() & ~ignoredModifiers;
if (event.get_key_symbol() == Clutter.KEY_Escape && modifierState == 0) {
this._closeNotification(); this._closeNotification();
return true; return true;
} }
@@ -1651,15 +1724,7 @@ const MessageTray = new Lang.Class({
}, },
contains: function(source) { contains: function(source) {
return this._getIndexOfSummaryItemForSource(source) >= 0; return this._sources.has(source);
},
_getIndexOfSummaryItemForSource: function(source) {
for (let i = 0; i < this._summaryItems.length; i++) {
if (this._summaryItems[i].source == source)
return i;
}
return -1;
}, },
add: function(source) { add: function(source) {
@@ -1668,7 +1733,23 @@ const MessageTray = new Lang.Class({
return; return;
} }
let summaryItem = new SummaryItem(source); // Register that we got a notification for this source
source.policy.store();
source.policy.connect('enable-changed', Lang.bind(this, this._onSourceEnableChanged, source));
source.policy.connect('policy-changed', Lang.bind(this, this._updateState));
this._onSourceEnableChanged(source.policy, source);
},
_addSource: function(source) {
let obj = {
source: source,
summaryItem: new SummaryItem(source),
notifyId: 0,
destroyId: 0,
mutedChangedId: 0
};
let summaryItem = obj.summaryItem;
if (source.isChat) { if (source.isChat) {
this._summary.insert_child_at_index(summaryItem.actor, 0); this._summary.insert_child_at_index(summaryItem.actor, 0);
@@ -1677,11 +1758,11 @@ const MessageTray = new Lang.Class({
this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount); this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount);
} }
this._summaryItems.push(summaryItem); this._sources.set(source, obj);
source.connect('notify', Lang.bind(this, this._onNotify)); obj.notifyId = source.connect('notify', Lang.bind(this, this._onNotify));
obj.destroyId = source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
source.connect('muted-changed', Lang.bind(this, obj.mutedChangedId = source.connect('muted-changed', Lang.bind(this,
function () { function () {
if (source.isMuted) if (source.isMuted)
this._notificationQueue = this._notificationQueue.filter(function(notification) { this._notificationQueue = this._notificationQueue.filter(function(notification) {
@@ -1700,35 +1781,28 @@ const MessageTray = new Lang.Class({
this._onSummaryItemClicked(summaryItem, 3); this._onSummaryItemClicked(summaryItem, 3);
})); }));
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
// We need to display the newly-added summary item, but if the // We need to display the newly-added summary item, but if the
// caller is about to post a notification, we want to show that // caller is about to post a notification, we want to show that
// *first* and not show the summary item until after it hides. // *first* and not show the summary item until after it hides.
// So postpone calling _updateState() a tiny bit. // So postpone calling _updateState() a tiny bit.
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; })); Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; }));
this.emit('summary-item-added', summaryItem); this.emit('source-added', source);
this._updateNoMessagesLabel(); this._updateNoMessagesLabel();
}, },
getSummaryItems: function() { _removeSource: function(source) {
return this._summaryItems; let [, obj] = this._sources.delete(source);
}, let summaryItem = obj.summaryItem;
_onSourceDestroy: function(source) {
let index = this._getIndexOfSummaryItemForSource(source);
if (index == -1)
return;
let summaryItemToRemove = this._summaryItems[index];
this._summaryItems.splice(index, 1);
if (source.isChat) if (source.isChat)
this._chatSummaryItemsCount--; this._chatSummaryItemsCount--;
source.disconnect(obj.notifyId);
source.disconnect(obj.destroyId);
source.disconnect(obj.mutedChangedId);
let needUpdate = false; let needUpdate = false;
if (this._notification && this._notification.source == source) { if (this._notification && this._notification.source == source) {
@@ -1736,12 +1810,12 @@ const MessageTray = new Lang.Class({
this._notificationRemoved = true; this._notificationRemoved = true;
needUpdate = true; needUpdate = true;
} }
if (this._clickedSummaryItem == summaryItemToRemove) { if (this._clickedSummaryItem == summaryItem) {
this._setClickedSummaryItem(null); this._setClickedSummaryItem(null);
needUpdate = true; needUpdate = true;
} }
summaryItemToRemove.actor.destroy(); summaryItem.destroy();
this._updateNoMessagesLabel(); this._updateNoMessagesLabel();
@@ -1749,6 +1823,26 @@ const MessageTray = new Lang.Class({
this._updateState(); this._updateState();
}, },
getSources: function() {
return this._sources.keys();
},
_onSourceEnableChanged: function(policy, source) {
let wasEnabled = this.contains(source);
let shouldBeEnabled = policy.enable;
if (wasEnabled != shouldBeEnabled) {
if (shouldBeEnabled)
this._addSource(source);
else
this._removeSource(source);
}
},
_onSourceDestroy: function(source) {
this._removeSource(source);
},
_onNotificationDestroy: function(notification) { _onNotificationDestroy: function(notification) {
if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) { if (this._notification == notification && (this._notificationState == State.SHOWN || this._notificationState == State.SHOWING)) {
this._updateNotificationTimeout(0); this._updateNotificationTimeout(0);
@@ -1834,7 +1928,7 @@ const MessageTray = new Lang.Class({
}, },
_onSummaryItemClicked: function(summaryItem, button) { _onSummaryItemClicked: function(summaryItem, button) {
if (summaryItem.source.handleSummaryClick()) { if (summaryItem.source.handleSummaryClick(button)) {
if (summaryItem.source.keepTrayOnSummaryClick) if (summaryItem.source.keepTrayOnSummaryClick)
this._setClickedSummaryItem(null); this._setClickedSummaryItem(null);
else else
@@ -2193,7 +2287,9 @@ const MessageTray = new Lang.Class({
this._tween(this.actor, '_trayState', State.HIDDEN, this._tween(this.actor, '_trayState', State.HIDDEN,
{ y: 0, { y: 0,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad',
onComplete: this._onTrayHidden,
onCompleteScope: this
}); });
// Note that we might have entered here without a grab, // Note that we might have entered here without a grab,
@@ -2203,6 +2299,11 @@ const MessageTray = new Lang.Class({
this._lightbox.hide(); this._lightbox.hide();
}, },
_onTrayHidden: function() {
if (!this._overviewVisible)
this.actor.remove_style_pseudo_class('overview');
},
_hideDesktopClone: function(now) { _hideDesktopClone: function(now) {
this._tween(this._desktopClone, '_desktopCloneState', State.HIDDEN, this._tween(this._desktopClone, '_desktopCloneState', State.HIDDEN,
{ y: 0, { y: 0,
@@ -2239,7 +2340,7 @@ const MessageTray = new Lang.Class({
this._notificationClickedId = this._notification.connect('done-displaying', this._notificationClickedId = this._notification.connect('done-displaying',
Lang.bind(this, this._escapeTray)); Lang.bind(this, this._escapeTray));
this._notification.connect('unfocused', Lang.bind(this, function() { this._notificationUnfocusedId = this._notification.connect('unfocused', Lang.bind(this, function() {
this._updateState(); this._updateState();
})); }));
this._notificationBin.child = this._notification.actor; this._notificationBin.child = this._notification.actor;
@@ -2268,8 +2369,10 @@ const MessageTray = new Lang.Class({
_updateShowingNotification: function() { _updateShowingNotification: function() {
this._notification.acknowledged = true; this._notification.acknowledged = true;
// We auto-expand notifications with CRITICAL urgency. // We auto-expand notifications with CRITICAL urgency, or for which the relevant setting
if (this._notification.urgency == Urgency.CRITICAL) // is on in the control center.
if (this._notification.urgency == Urgency.CRITICAL ||
this._notification.source.policy.forceExpanded)
this._expandNotification(true); this._expandNotification(true);
// We tween all notifications to full opacity. This ensures that both new notifications and // We tween all notifications to full opacity. This ensures that both new notifications and
@@ -2353,11 +2456,18 @@ const MessageTray = new Lang.Class({
this.idleMonitor.disconnect(this._idleMonitorBecameActiveId); this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
this._idleMonitorBecameActiveId = 0; this._idleMonitorBecameActiveId = 0;
} }
if (this._notificationExpandedId) { if (this._notificationExpandedId) {
this._notification.disconnect(this._notificationExpandedId); this._notification.disconnect(this._notificationExpandedId);
this._notificationExpandedId = 0; this._notificationExpandedId = 0;
} }
if (this._notificationClickedId) {
this._notification.disconnect(this._notificationClickedId);
this._notificationClickedId = 0;
}
if (this._notificationUnfocusedId) {
this._notification.disconnect(this._notificationUnfocusedId);
this._notificationUnfocusedId = 0;
}
if (this._notificationRemoved) { if (this._notificationRemoved) {
Tweener.removeTweens(this._notificationWidget); Tweener.removeTweens(this._notificationWidget);
@@ -2379,19 +2489,19 @@ const MessageTray = new Lang.Class({
}, },
_hideNotificationCompleted: function() { _hideNotificationCompleted: function() {
this._notificationRemoved = false;
this._notificationWidget.hide();
this._closeButton.hide();
this._pointerInTray = false;
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
this._notificationBin.child = null;
this._notification.collapseCompleted(); this._notification.collapseCompleted();
this._notification.disconnect(this._notificationClickedId);
this._notificationClickedId = 0;
let notification = this._notification; let notification = this._notification;
this._notification = null; this._notification = null;
if (notification.isTransient) if (notification.isTransient)
notification.destroy(NotificationDestroyedReason.EXPIRED); notification.destroy(NotificationDestroyedReason.EXPIRED);
this._notificationRemoved = false;
this._closeButton.hide();
this._pointerInTray = false;
this.actor.hover = false; // Clutter doesn't emit notify::hover when actors move
this._notificationBin.child = null;
this._notificationWidget.hide();
}, },
_expandActiveNotification: function() { _expandActiveNotification: function() {
@@ -2579,6 +2689,20 @@ const MessageTray = new Lang.Class({
_onSummaryBoxPointerUngrabbed: function() { _onSummaryBoxPointerUngrabbed: function() {
this._summaryBoxPointerState = State.HIDING; this._summaryBoxPointerState = State.HIDING;
if (this._summaryBoxPointerContentUpdatedId) {
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0;
}
if (this._summaryBoxPointerCloseClickedId != 0) {
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0;
}
if (this._sourceDoneDisplayingId) {
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._sourceDoneDisplayingId = 0;
}
this._unlock(); this._unlock();
if (this._summaryBoxPointerItem.source.notifications.length == 0) { if (this._summaryBoxPointerItem.source.notifications.length == 0) {
@@ -2601,14 +2725,6 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointerState = State.HIDDEN; this._summaryBoxPointerState = State.HIDDEN;
this._summaryBoxPointer.bin.child = null; this._summaryBoxPointer.bin.child = null;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0;
if (this._summaryBoxPointerCloseClickedId != 0) {
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0;
}
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0;
let sourceNotificationStackDoneShowing = null; let sourceNotificationStackDoneShowing = null;
if (doneShowingNotificationStack) { if (doneShowingNotificationStack) {

View File

@@ -37,7 +37,7 @@ const ModalDialog = new Lang.Class({
params = Params.parse(params, { shellReactive: false, params = Params.parse(params, { shellReactive: false,
styleClass: null, styleClass: null,
parentActor: Main.uiGroup, parentActor: Main.uiGroup,
keybindingMode: Main.KeybindingMode.SYSTEM_MODAL, keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
shouldFadeIn: true }); shouldFadeIn: true });
this.state = State.CLOSED; this.state = State.CLOSED;
@@ -157,6 +157,7 @@ const ModalDialog = new Lang.Class({
keys = []; keys = [];
let button = new St.Button({ style_class: 'modal-dialog-button', let button = new St.Button({ style_class: 'modal-dialog-button',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
reactive: true, reactive: true,
can_focus: true, can_focus: true,
label: label }); label: label });

View File

@@ -103,6 +103,126 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'ibus-ui-gtk': 'keyboard' 'ibus-ui-gtk': 'keyboard'
}; };
const NotificationGenericPolicy = new Lang.Class({
Name: 'NotificationGenericPolicy',
Extends: MessageTray.NotificationPolicy,
_init: function() {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = 'generic';
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
},
store: function() { },
destroy: function() {
this._masterSettings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
get enable() {
return true;
},
get enableSound() {
return true;
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners');
},
get forceExpanded() {
return false;
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return false;
}
});
const NotificationApplicationPolicy = new Lang.Class({
Name: 'NotificationApplicationPolicy',
Extends: MessageTray.NotificationPolicy,
_init: function(id) {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = id;
this._canonicalId = this._canonicalizeId(id)
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
this._settings.connect('changed', Lang.bind(this, this._changed));
},
store: function() {
this._settings.set_string('application-id', this.id + '.desktop');
let apps = this._masterSettings.get_strv('application-children');
if (apps.indexOf(this._canonicalId) < 0) {
apps.push(this._canonicalId);
this._masterSettings.set_strv('application-children', apps);
}
},
destroy: function() {
this._masterSettings.run_dispose();
this._settings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
_canonicalizeId: function(id) {
// Keys are restricted to lowercase alphanumeric characters and dash,
// and two dashes cannot be in succession
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
},
get enable() {
return this._settings.get_boolean('enable');
},
get enableSound() {
return this._settings.get_boolean('enable-sound-alerts');
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners') &&
this._settings.get_boolean('show-banners');
},
get forceExpanded() {
return this._settings.get_boolean('force-expanded');
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen') &&
this._settings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return this._settings.get_boolean('details-in-lock-screen');
}
});
const NotificationDaemon = new Lang.Class({ const NotificationDaemon = new Lang.Class({
Name: 'NotificationDaemon', Name: 'NotificationDaemon',
@@ -213,7 +333,7 @@ const NotificationDaemon = new Lang.Class({
} }
} }
let source = new Source(title, pid, sender, trayIcon); let source = new Source(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null);
source.setTransient(isForTransientNotification); source.setTransient(isForTransientNotification);
if (!isForTransientNotification) { if (!isForTransientNotification) {
@@ -381,6 +501,9 @@ const NotificationDaemon = new Lang.Class({
})); }));
} }
// Mark music notifications so they can be shown in the screen shield
notification.isMusic = (ndata.hints['category'] == 'x-gnome.music');
let gicon = this._iconForNotificationData(icon, hints); let gicon = this._iconForNotificationData(icon, hints);
let gimage = this._imageForNotificationData(hints); let gimage = this._imageForNotificationData(hints);
@@ -395,17 +518,17 @@ const NotificationDaemon = new Lang.Class({
// one of 'image-data' or 'image-path' are specified, we show both an icon and // one of 'image-data' or 'image-path' are specified, we show both an icon and
// a large image. // a large image.
if (gicon && gimage) if (gicon && gimage)
image = new St.Icon({ gicon: gimage }); image = new St.Icon({ gicon: gimage,
icon_size: notification.IMAGE_SIZE });
else if (!gicon && gimage) else if (!gicon && gimage)
gicon = gimage; gicon = gimage;
else if (!gicon) else if (!gicon)
gicon = this._fallbackIconForNotificationData(hints); gicon = this._fallbackIconForNotificationData(hints);
notification.setImage(image);
notification.update(summary, body, { gicon: gicon, notification.update(summary, body, { gicon: gicon,
bannerMarkup: true, bannerMarkup: true,
clear: true }); clear: true });
notification.setImage(image);
if (actions.length) { if (actions.length) {
notification.setUseActionIcons(hints['action-icons'] == true); notification.setUseActionIcons(hints['action-icons'] == true);
@@ -515,12 +638,22 @@ const Source = new Lang.Class({
Name: 'NotificationDaemonSource', Name: 'NotificationDaemonSource',
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(title, pid, sender, trayIcon) { _init: function(title, pid, sender, trayIcon, appId) {
// Need to set the app before chaining up, so
// methods called from the parent constructor can find it
this.trayIcon = trayIcon;
this.pid = pid;
this.app = this._getApp(appId);
this.parent(title); this.parent(title);
this.initialTitle = title; this.initialTitle = title;
this.pid = pid; if (this.app)
this.title = this.app.get_name();
else
this.useNotificationIcon = true;
if (sender) if (sender)
this._nameWatcherId = Gio.DBus.session.watch_name(sender, this._nameWatcherId = Gio.DBus.session.watch_name(sender,
Gio.BusNameWatcherFlags.NONE, Gio.BusNameWatcherFlags.NONE,
@@ -529,16 +662,19 @@ const Source = new Lang.Class({
else else
this._nameWatcherId = 0; this._nameWatcherId = 0;
this._setApp();
if (this.app)
this.title = this.app.get_name();
else
this.useNotificationIcon = true;
this.trayIcon = trayIcon;
if (this.trayIcon) { if (this.trayIcon) {
this._setSummaryIcon(this.trayIcon); // Try again finding the app, using the WM_CLASS from the tray icon
this.useNotificationIcon = false; this._setSummaryIcon(this.trayIcon);
this.useNotificationIcon = false;
}
},
_createPolicy: function() {
if (this.app) {
let id = this.app.get_id().replace(/\.desktop$/,'');
return new NotificationApplicationPolicy(id);
} else {
return new NotificationGenericPolicy();
} }
}, },
@@ -565,19 +701,17 @@ const Source = new Lang.Class({
this.notify(notification); this.notify(notification);
}, },
handleSummaryClick: function() { handleSummaryClick: function(button) {
if (!this.trayIcon) if (!this.trayIcon)
return false; return false;
let event = Clutter.get_current_event(); let event = Clutter.get_current_event();
if (event.type() != Clutter.EventType.BUTTON_RELEASE)
return false;
// Left clicks are passed through only where there aren't unacknowledged // Left clicks are passed through only where there aren't unacknowledged
// notifications, so it possible to open them in summary mode; right // notifications, so it possible to open them in summary mode; right
// clicks are always forwarded, as the right click menu is not useful for // clicks are always forwarded, as the right click menu is not useful for
// tray icons // tray icons
if (event.get_button() == 1 && if (button == 1 &&
this.notifications.length > 0) this.notifications.length > 0)
return false; return false;
@@ -590,7 +724,7 @@ const Source = new Lang.Class({
return true; return true;
}, },
_getApp: function() { _getApp: function(appId) {
let app; let app;
app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid); app = Shell.WindowTracker.get_default().get_app_from_pid(this.pid);
@@ -598,7 +732,13 @@ const Source = new Lang.Class({
return app; return app;
if (this.trayIcon) { if (this.trayIcon) {
app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wmclass); app = Shell.AppSystem.get_default().lookup_wmclass(this.trayIcon.wm_class);
if (app != null)
return app;
}
if (appId) {
app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
if (app != null) if (app != null)
return app; return app;
} }
@@ -606,11 +746,11 @@ const Source = new Lang.Class({
return null; return null;
}, },
_setApp: function() { _setApp: function(appId) {
if (this.app) if (this.app)
return; return;
this.app = this._getApp(); this.app = this._getApp(appId);
if (!this.app) if (!this.app)
return; return;

View File

@@ -122,7 +122,8 @@ const Overview = new Lang.Class({
// one. Instances of this class share a single CoglTexture behind the // one. Instances of this class share a single CoglTexture behind the
// scenes which allows us to show the background with different // scenes which allows us to show the background with different
// rendering options without duplicating the texture data. // rendering options without duplicating the texture data.
this._background = Meta.BackgroundActor.new_for_screen(global.screen); this._background = new Meta.BackgroundActor({ screen: global.screen,
settings: Main.background });
this._background.add_glsl_snippet(Meta.SnippetHook.FRAGMENT, this._background.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
GLSL_DIM_EFFECT_DECLARATIONS, GLSL_DIM_EFFECT_DECLARATIONS,
GLSL_DIM_EFFECT_CODE, GLSL_DIM_EFFECT_CODE,
@@ -576,7 +577,7 @@ const Overview = new Lang.Class({
if (this._shown) { if (this._shown) {
if (!this._modal) { if (!this._modal) {
if (Main.pushModal(this._overview, if (Main.pushModal(this._overview,
{ keybindingMode: Main.KeybindingMode.OVERVIEW })) { keybindingMode: Shell.KeyBindingMode.OVERVIEW }))
this._modal = true; this._modal = true;
else else
this.hide(); this.hide();

View File

@@ -315,7 +315,7 @@ const AppMenuButton = new Lang.Class({
}, },
show: function() { show: function() {
if (this._visible || Main.screenShield.locked) if (this._visible)
return; return;
this._visible = true; this._visible = true;
@@ -644,7 +644,7 @@ const ActivitiesButton = new Lang.Class({
this.actor.label_actor = this._label; this.actor.label_actor = this._label;
this.hotCorner = new Layout.HotCorner(); this.hotCorner = new Layout.HotCorner(Main.layoutManager);
container.add_actor(this.hotCorner.actor); container.add_actor(this.hotCorner.actor);
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent)); this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));

View File

@@ -41,10 +41,10 @@ const PointerWatcher = new Lang.Class({
Name: 'PointerWatcher', Name: 'PointerWatcher',
_init: function() { _init: function() {
let idleMonitor = new GnomeDesktop.IdleMonitor(); this._idleMonitor = new GnomeDesktop.IdleMonitor();
idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive)); this._idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle)); this._idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
this._idle = idleMonitor.get_idletime() > IDLE_TIME; this._idle = this._idleMonitor.get_idletime() > IDLE_TIME;
this._watches = []; this._watches = [];
this.pointerX = null; this.pointerX = null;
this.pointerY = null; this.pointerY = null;

View File

@@ -889,7 +889,7 @@ const PopupMenuBase = new Lang.Class({
addSettingsAction: function(title, desktopFile) { addSettingsAction: function(title, desktopFile) {
let menuItem = this.addAction(title, function() { let menuItem = this.addAction(title, function() {
let app = Shell.AppSystem.get_default().lookup_setting(desktopFile); let app = Shell.AppSystem.get_default().lookup_app(desktopFile);
if (!app) { if (!app) {
log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!'); log('Settings panel for desktop file ' + desktopFile + ' could not be loaded!');

View File

@@ -137,8 +137,12 @@ function remoteProvidersLoaded(loadState) {
idxB = sortOrder.indexOf(appIdB); idxB = sortOrder.indexOf(appIdB);
// if no provider is found in the order, use alphabetical order // if no provider is found in the order, use alphabetical order
if ((idxA == -1) && (idxB == -1)) if ((idxA == -1) && (idxB == -1)) {
return GLib.utf8_collate(providerA.title, providerB.title); let nameA = providerA.appInfo.get_name();
let nameB = providerB.appInfo.get_name();
return GLib.utf8_collate(nameA, nameB);
}
if (numSorted > 1) { if (numSorted > 1) {
// if providerA is the last, it goes after everything // if providerA is the last, it goes after everything
@@ -217,7 +221,7 @@ const RemoteSearchProvider = new Lang.Class({
Lang.bind(this, this._getResultsFinished), Lang.bind(this, this._getResultsFinished),
this._cancellable); this._cancellable);
} catch(e) { } catch(e) {
log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString())); log('Error calling GetInitialResultSet for provider %s: %s'.format(this.id, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.pushResults(this, []);
} }
}, },
@@ -230,7 +234,7 @@ const RemoteSearchProvider = new Lang.Class({
Lang.bind(this, this._getResultsFinished), Lang.bind(this, this._getResultsFinished),
this._cancellable); this._cancellable);
} catch(e) { } catch(e) {
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString())); log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.id, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.pushResults(this, []);
} }
}, },
@@ -261,7 +265,7 @@ const RemoteSearchProvider = new Lang.Class({
Lang.bind(this, this._getResultMetasFinished, callback), Lang.bind(this, this._getResultMetasFinished, callback),
this._cancellable); this._cancellable);
} catch(e) { } catch(e) {
log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString())); log('Error calling GetResultMetas for provider %s: %s'.format(this.id, e.toString()));
callback([]); callback([]);
} }
}, },

View File

@@ -8,11 +8,13 @@ const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const TweenerEquations = imports.tweener.equations; const TweenerEquations = imports.tweener.equations;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const Hash = imports.misc.hash;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const LoginManager = imports.misc.loginManager; const LoginManager = imports.misc.loginManager;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
@@ -50,36 +52,16 @@ const SUMMARY_ICON_SIZE = 48;
const STANDARD_FADE_TIME = 10; const STANDARD_FADE_TIME = 10;
const SHORT_FADE_TIME = 0.3; const SHORT_FADE_TIME = 0.3;
function sample(offx, offy) { const GLSL_EFFECT_DECLARATIONS = ' \
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' + uniform float desaturation; \n \
'vec2 (' + offx + ',' + offy + '));\n'
}
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
uniform vec2 pixel_step;\n \
uniform float desaturation;\n \
vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
vec4 texel;\n \
texel = texture2D (sampler, tex_coord.st);\n'
+ sample(-1.0, -1.0)
+ sample( 0.0, -1.0)
+ sample(+1.0, -1.0)
+ sample(-1.0, 0.0)
+ sample(+1.0, 0.0)
+ sample(-1.0, +1.0)
+ sample( 0.0, +1.0)
+ sample(+1.0, +1.0) + ' \
texel /= 9.0;\n \
return texel;\n \
}\n \
vec3 desaturate (const vec3 color)\n \ vec3 desaturate (const vec3 color)\n \
{\n \ {\n \
const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \ const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \
vec3 gray = vec3 (dot (gray_conv, color));\n \ vec3 gray = vec3 (dot (gray_conv, color));\n \
return vec3 (mix (color.rgb, gray, desaturation));\n \ return vec3 (mix (color.rgb, gray, desaturation));\n \
}'; }';
const GLSL_BLUR_EFFECT_CODE = ' \ const GLSL_EFFECT_CODE = ' \
cogl_texel = apply_blur(cogl_sampler, cogl_tex_coord.st);\n \ cogl_color_out.rgb = desaturate(cogl_color_out.rgb);\n';
cogl_texel.rgb = desaturate(cogl_texel.rgb);\n';
const Clock = new Lang.Class({ const Clock = new Lang.Class({
@@ -127,49 +109,48 @@ const NotificationsBox = new Lang.Class({
name: 'screenShieldNotifications', name: 'screenShieldNotifications',
style_class: 'screen-shield-notifications-box' }); style_class: 'screen-shield-notifications-box' });
this._residentNotificationBox = new St.BoxLayout({ vertical: true, this._musicBin = new St.Bin({ style_class: 'screen-shield-notifications-box',
style_class: 'screen-shield-notifications-box' }); visible: false });
let scrollView = new St.ScrollView({ x_fill: false, x_align: St.Align.START });
this._persistentNotificationBox = new St.BoxLayout({ vertical: true,
style_class: 'screen-shield-notifications-box' });
scrollView.add_actor(this._persistentNotificationBox);
this.actor.add(this._residentNotificationBox, { x_fill: true }); let scrollView = new St.ScrollView({ x_fill: false, x_align: St.Align.START });
this._notificationBox = new St.BoxLayout({ vertical: true,
style_class: 'screen-shield-notifications-box' });
scrollView.add_actor(this._notificationBox);
this.actor.add(this._musicBin);
this.actor.add(scrollView, { x_fill: true, x_align: St.Align.START }); this.actor.add(scrollView, { x_fill: true, x_align: St.Align.START });
this._items = []; this._sources = new Hash.Map();
Main.messageTray.getSummaryItems().forEach(Lang.bind(this, function(item) { Main.messageTray.getSources().forEach(Lang.bind(this, function(source) {
this._summaryItemAdded(Main.messageTray, item, true); this._sourceAdded(Main.messageTray, source, true);
})); }));
this._updateVisibility(); this._updateVisibility();
this._summaryAddedId = Main.messageTray.connect('summary-item-added', Lang.bind(this, this._summaryItemAdded)); this._sourceAddedId = Main.messageTray.connect('source-added', Lang.bind(this, this._sourceAdded));
}, },
destroy: function() { destroy: function() {
if (this._summaryAddedId) { if (this._sourceAddedId) {
Main.messageTray.disconnect(this._summaryAddedId); Main.messageTray.disconnect(this._sourceAddedId);
this._summaryAddedId = 0; this._sourceAddedId = 0;
} }
for (let i = 0; i < this._items.length; i++) let items = this._sources.items();
this._removeItem(this._items[i]); for (let i = 0; i < items.length; i++) {
this._items = []; let [source, obj] = items[i];
this._removeSource(source, obj);
}
this.actor.destroy(); this.actor.destroy();
}, },
_updateVisibility: function() { _updateVisibility: function() {
this._residentNotificationBox.visible = this._residentNotificationBox.get_n_children() > 0; this._musicBin.visible = this._musicBin.child != null && this._musicBin.child.visible;
this._persistentNotificationBox.visible = this._persistentNotificationBox.get_children().some(function(a) { this._notificationBox.visible = this._notificationBox.get_children().some(function(a) {
return a.visible; return a.visible;
}); });
this.actor.visible = this._residentNotificationBox.visible || this._persistentNotificationBox.visible; this.actor.visible = this._musicBin.visible || this._notificationBox.visible;
},
_sourceIsResident: function(source) {
return source.hasResidentNotification() && !source.isChat;
}, },
_makeNotificationCountText: function(count, isChat) { _makeNotificationCountText: function(count, isChat) {
@@ -179,18 +160,16 @@ const NotificationsBox = new Lang.Class({
return ngettext("%d new notification", "%d new notifications", count).format(count); return ngettext("%d new notification", "%d new notifications", count).format(count);
}, },
_makeNotificationSource: function(source) { _makeNotificationSource: function(source, box) {
let box = new St.BoxLayout({ style_class: 'screen-shield-notification-source' });
let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE); let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
box.add(sourceActor.actor, { y_fill: true }); box.add(sourceActor.actor, { y_fill: true });
let textBox = new St.BoxLayout({ vertical: true }); let textBox = new St.BoxLayout({ vertical: true });
box.add(textBox, { y_fill: false, y_align: St.Align.START }); box.add(textBox, { y_fill: false, y_align: St.Align.START });
let label = new St.Label({ text: source.title, let title = new St.Label({ text: source.title,
style_class: 'screen-shield-notification-label' }); style_class: 'screen-shield-notification-label' });
textBox.add(label); textBox.add(title);
let count = source.unseenCount; let count = source.unseenCount;
let countLabel = new St.Label({ text: this._makeNotificationCountText(count, source.isChat), let countLabel = new St.Label({ text: this._makeNotificationCountText(count, source.isChat),
@@ -198,118 +177,179 @@ const NotificationsBox = new Lang.Class({
textBox.add(countLabel); textBox.add(countLabel);
box.visible = count != 0; box.visible = count != 0;
return [box, countLabel]; return [title, countLabel];
}, },
_summaryItemAdded: function(tray, item, dontUpdateVisibility) { _makeNotificationDetailedSource: function(source, box) {
// Ignore transient sources, or sources explicitly marked not to show let sourceActor = new MessageTray.SourceActor(source, SUMMARY_ICON_SIZE);
// in the lock screen box.add(sourceActor.actor, { y_fill: true });
if (item.source.isTransient || !item.source.showInLockScreen)
let textBox = new St.BoxLayout({ vertical: true });
box.add(textBox, { y_fill: false, y_align: St.Align.START });
let title = new St.Label({ text: source.title,
style_class: 'screen-shield-notification-label' });
textBox.add(title);
let visible = false;
for (let i = 0; i < source.notifications.length; i++) {
let n = source.notifications[i];
if (n.acknowledged || n.isMusic)
continue;
let body = '';
if (n.bannerBodyText) {
body = n.bannerBodyMarkup ? n.bannerBodyText :
GLib.markup_escape_text(n.bannerBodyMarkup, -1);
}
let label = new St.Label({ style_class: 'screen-shield-notification-count-text' });
label.clutter_text.set_markup('<b>' + n.title + '</b> ' + body);
textBox.add(label);
visible = true;
}
box.visible = visible;
return [title, null];
},
_showSource: function(source, obj, box) {
let musicNotification = source.getMusicNotification();
if (musicNotification != null &&
this._musicBin.child == null) {
if (musicNotification.actor.get_parent() != null)
musicNotification.actor.get_parent().remove_actor(musicNotification.actor);
this._musicBin.child = musicNotification.actor;
this._musicBin.child.visible = obj.visible;
musicNotification.expand(false /* animate */);
obj.musicNotification = musicNotification;
}
if (obj.detailed) {
[obj.titleLabel, obj.countLabel] = this._makeNotificationDetailedSource(source, box);
} else {
[obj.titleLabel, obj.countLabel] = this._makeNotificationSource(source, box);
}
box.visible = obj.visible &&
(source.unseenCount > (musicNotification ? 1 : 0));
},
_sourceAdded: function(tray, source, dontUpdateVisibility) {
// Ignore transient sources
if (source.isTransient)
return; return;
let obj = { let obj = {
item: item, visible: source.policy.showInLockScreen,
source: item.source, detailed: source.policy.detailsInLockScreen,
resident: this._sourceIsResident(item.source),
contentUpdatedId: 0,
sourceDestroyId: 0, sourceDestroyId: 0,
sourceCountChangedId: 0,
sourceTitleChangedId: 0,
sourceUpdatedId: 0,
musicNotification: null,
sourceBox: null, sourceBox: null,
titleLabel: null,
countLabel: null, countLabel: null,
}; };
if (obj.resident) { obj.sourceBox = new St.BoxLayout({ style_class: 'screen-shield-notification-source' });
this._residentNotificationBox.add(item.notificationStackWidget); this._showSource(source, obj, obj.sourceBox);
item.closeButton.hide(); this._notificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
item.prepareNotificationStackForShowing();
} else {
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
}
obj.contentUpdatedId = item.connect('content-updated', Lang.bind(this, this._onItemContentUpdated)); obj.sourceCountChangedId = source.connect('count-updated', Lang.bind(this, function(source) {
obj.sourceCountChangedId = item.source.connect('count-updated', Lang.bind(this, this._onSourceChanged)); this._countChanged(source, obj);
obj.sourceTitleChangedId = item.source.connect('title-changed', Lang.bind(this, this._onSourceChanged)); }));
obj.sourceDestroyId = item.source.connect('destroy', Lang.bind(this, this._onSourceDestroy)); obj.sourceTitleChangedId = source.connect('title-changed', Lang.bind(this, function(source) {
this._items.push(obj); this._titleChanged(source, obj);
}));
obj.policyChangedId = source.policy.connect('policy-changed', Lang.bind(this, function(policy, key) {
if (key == 'show-in-lock-screen')
this._visibleChanged(source, obj);
else
this._detailedChanged(source, obj);
}));
obj.sourceDestroyId = source.connect('destroy', Lang.bind(this, function(source) {
this._onSourceDestroy(source, obj);
}));
this._sources.set(source, obj);
if (!dontUpdateVisibility) if (!dontUpdateVisibility)
this._updateVisibility(); this._updateVisibility();
}, },
_findSource: function(source) { _titleChanged: function(source, obj) {
for (let i = 0; i < this._items.length; i++) { obj.titleLabel.text = source.title;
if (this._items[i].source == source) },
return i;
_countChanged: function(source, obj) {
if (obj.detailed) {
// A new notification was pushed, or a previous notification was destroyed.
// Give up, and build the list again.
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
} else {
let count = source.unseenCount;
obj.countLabel.text = this._makeNotificationCountText(count, source.isChat);
} }
return -1; obj.sourceBox.visible = obj.visible &&
(source.unseenCount > (obj.musicNotification ? 1 : 0));
this._updateVisibility();
}, },
_onItemContentUpdated: function(item) { _visibleChanged: function(source, obj) {
let obj = this._items[this._findSource(item.source)]; if (obj.visible == source.policy.showInLockScreen)
this._updateItem(obj);
},
_onSourceChanged: function(source) {
let obj = this._items[this._findSource(source)];
this._updateItem(obj);
},
_updateItem: function(obj) {
let itemShouldBeResident = this._sourceIsResident(obj.source);
if (itemShouldBeResident && obj.resident) {
// Nothing to do here, the actor is already updated
return; return;
}
if (obj.resident && !itemShouldBeResident) { obj.visible = source.policy.showInLockScreen;
// make into a regular item if (obj.musicNotification)
obj.item.doneShowingNotificationStack(); obj.musicNotification.actor.visible = obj.visible;
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget); obj.sourceBox.visible = obj.visible &&
source.unseenCount > (obj.musicNotification ? 1 : 0);
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(obj.source);
this._persistentNotificationBox.add(obj.sourceBox, { x_fill: false, x_align: St.Align.START });
} else if (itemShouldBeResident && !obj.resident) {
// make into a resident item
obj.sourceBox.destroy();
obj.sourceBox = obj.countLabel = null;
obj.resident = true;
this._residentNotificationBox.add(obj.item.notificationStackWidget);
obj.item.closeButton.hide();
obj.item.prepareNotificationStackForShowing();
} else {
// just update the counter
let count = obj.source.unseenCount;
obj.countLabel.text = this._makeNotificationCountText(count, obj.source.isChat);
obj.sourceBox.visible = count != 0;
}
this._updateVisibility(); this._updateVisibility();
}, },
_onSourceDestroy: function(source) { _detailedChanged: function(source, obj) {
let idx = this._findSource(source); if (obj.detailed == source.policy.detailsInLockScreen)
return;
this._removeItem(this._items[idx]); obj.detailed = source.policy.detailsInLockScreen;
this._items.splice(idx, 1);
obj.sourceBox.destroy_all_children();
obj.titleLabel = obj.countLabel = null;
this._showSource(source, obj, obj.sourceBox);
},
_onSourceDestroy: function(source, obj) {
this._removeSource(source, obj);
this._updateVisibility(); this._updateVisibility();
}, },
_removeItem: function(obj) { _removeSource: function(source, obj) {
if (obj.resident) { obj.sourceBox.destroy();
obj.item.doneShowingNotificationStack(); obj.sourceBox = obj.titleLabel = obj.countLabel = null;
this._residentNotificationBox.remove_actor(obj.item.notificationStackWidget);
} else { if (obj.musicNotification) {
obj.sourceBox.destroy(); this._musicBin.child = null;
obj.musicNotification = null;
} }
obj.item.disconnect(obj.contentUpdatedId); source.disconnect(obj.sourceDestroyId);
obj.source.disconnect(obj.sourceDestroyId); source.disconnect(obj.sourceCountChangedId);
obj.source.disconnect(obj.sourceCountChangedId); source.disconnect(obj.sourceTitleChangedId);
obj.source.disconnect(obj.sourceTitleChangedId); source.policy.disconnect(obj.policyChangedId);
this._sources.delete(source);
}, },
}); });
@@ -395,6 +435,7 @@ const ScreenShield = new Lang.Class({
reactive: true, reactive: true,
can_focus: true, can_focus: true,
name: 'lockScreenGroup', name: 'lockScreenGroup',
visible: false,
}); });
this._lockScreenGroup.connect('key-release-event', this._lockScreenGroup.connect('key-release-event',
Lang.bind(this, this._onLockScreenKeyRelease)); Lang.bind(this, this._onLockScreenKeyRelease));
@@ -406,16 +447,16 @@ const ScreenShield = new Lang.Class({
name: 'lockScreenContents' }); name: 'lockScreenContents' });
this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true })); this._lockScreenContents.add_constraint(new Layout.MonitorConstraint({ primary: true }));
let backgroundActor = Meta.BackgroundActor.new_for_screen(global.screen); this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
backgroundActor.add_glsl_snippet(Meta.SnippetHook.TEXTURE_LOOKUP,
GLSL_BLUR_EFFECT_DECLARATIONS, let backgroundActor = new Meta.BackgroundActor({ screen: global.screen,
GLSL_BLUR_EFFECT_CODE, settings: this._settings });
true); backgroundActor.add_glsl_snippet(Meta.SnippetHook.FRAGMENT,
GLSL_EFFECT_DECLARATIONS,
GLSL_EFFECT_CODE,
false);
backgroundActor.set_uniform_float('desaturation', backgroundActor.set_uniform_float('desaturation',
1, 1, [0.6]); 1, 1, [0.6]);
backgroundActor.connect('notify::size', function(actor) {
actor.set_uniform_float('pixel_step', 2, 1, [1/actor.width, 1/actor.height]);
});
this._background = new St.Bin({ style_class: 'screen-shield-background', this._background = new St.Bin({ style_class: 'screen-shield-background',
child: backgroundActor }); child: backgroundActor });
@@ -468,25 +509,36 @@ const ScreenShield = new Lang.Class({
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();
this._loginSession = this._loginManager.getCurrentSessionProxy(); this._loginSession = this._loginManager.getCurrentSessionProxy();
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._isModal = false; this._isModal = false;
this._hasLockScreen = false; this._hasLockScreen = false;
this._isGreeter = false; this._isGreeter = false;
this._isActive = false; this._isActive = false;
this._isLocked = false;
this._inUnlockAnimation = false; this._inUnlockAnimation = false;
this._activationTime = 0; this._activationTime = 0;
this._becameActiveId = 0;
this._lockTimeoutId = 0;
this._lightbox = new Lightbox.Lightbox(Main.uiGroup, this._lightbox = new Lightbox.Lightbox(Main.uiGroup,
{ inhibitEvents: true, { inhibitEvents: true,
fadeInTime: STANDARD_FADE_TIME, fadeInTime: STANDARD_FADE_TIME,
fadeFactor: 1 }); fadeFactor: 1 });
this._lightbox.connect('shown', Lang.bind(this, this._onLightboxShown));
this.idleMonitor = new GnomeDesktop.IdleMonitor(); this.idleMonitor = new GnomeDesktop.IdleMonitor();
}, },
_liftShield: function(onPrimary, velocity) {
if (this._isLocked) {
this._ensureUnlockDialog(onPrimary, true /* allowCancel */);
this._hideLockScreen(true /* animate */, velocity);
} else {
this.deactivate(true /* animate */);
}
},
_onLockScreenKeyRelease: function(actor, event) { _onLockScreenKeyRelease: function(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
@@ -504,8 +556,7 @@ const ScreenShield = new Lang.Class({
if (symbol == Clutter.KEY_Escape || if (symbol == Clutter.KEY_Escape ||
symbol == Clutter.KEY_Return || symbol == Clutter.KEY_Return ||
symbol == Clutter.KEY_KP_Enter) { symbol == Clutter.KEY_KP_Enter) {
this._ensureUnlockDialog(true, true); this._liftShield(false, 0);
this._hideLockScreen(true, 0);
return true; return true;
} }
@@ -527,8 +578,7 @@ const ScreenShield = new Lang.Class({
// 7 standard scrolls to lift up // 7 standard scrolls to lift up
if (this._lockScreenScrollCounter > 35) { if (this._lockScreenScrollCounter > 35) {
this._ensureUnlockDialog(false, true); this._liftShield(true, 0);
this._hideLockScreen(true, 0);
} }
return true; return true;
@@ -559,7 +609,9 @@ const ScreenShield = new Lang.Class({
_onDragBegin: function() { _onDragBegin: function() {
Tweener.removeTweens(this._lockScreenGroup); Tweener.removeTweens(this._lockScreenGroup);
this._lockScreenState = MessageTray.State.HIDING; this._lockScreenState = MessageTray.State.HIDING;
this._ensureUnlockDialog(false, false);
if (this._isLocked)
this._ensureUnlockDialog(false, false);
return true; return true;
}, },
@@ -580,8 +632,7 @@ const ScreenShield = new Lang.Class({
if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) { if (this._lockScreenGroup.y < -(ARROW_DRAG_THRESHOLD * global.stage.height)) {
// Complete motion automatically // Complete motion automatically
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0); let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
this._hideLockScreen(true, -velocityY); this._liftShield(true, -velocityY);
this._ensureUnlockDialog(false, true);
} else { } else {
// restore the lock screen to its original place // restore the lock screen to its original place
// try to use the same speed as the normal animation // try to use the same speed as the normal animation
@@ -621,39 +672,81 @@ const ScreenShield = new Lang.Class({
} }
if (!this._isModal) { if (!this._isModal) {
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN }); Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
this._isModal = true; this._isModal = true;
}
if (this._lightbox.actor.visible ||
this._isActive) {
// We're either shown and active, or in the process of
// showing.
// The latter is a very unlikely condition (it requires
// idle-delay < 20), but in any case we have nothing
// to do at this point: either isActive is true, or
// it will soon be.
// isActive can also be true if the lightbox is hidden,
// in case the shield is down and the user hasn't unlocked yet
return;
} }
if (!this._isActive) { this._lightbox.show();
this._lightbox.show();
if (this._activationTime == 0) if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time(); this._activationTime = GLib.get_monotonic_time();
this._becameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, function() { if (this._becameActiveId == 0)
this.idleMonitor.disconnect(this._becameActiveId); this._becameActiveId = this.idleMonitor.connect('became-active',
Lang.bind(this, this._onUserBecameActive));
let lightboxWasShown = this._lightbox.shown; let shouldLock = this._settings.get_boolean(LOCK_ENABLED_KEY) && !this._isLocked;
this._lightbox.hide();
// GLib.get_monotonic_time() returns microseconds, convert to seconds if (shouldLock) {
let elapsedTime = (GLib.get_monotonic_time() - this._activationTime) / 1000000; let lockTimeout = Math.max(STANDARD_FADE_TIME, this._settings.get_uint(LOCK_DELAY_KEY));
let shouldLock = lightboxWasShown && this._lockTimeoutId = Mainloop.timeout_add(lockTimeout * 1000,
this._settings.get_boolean(LOCK_ENABLED_KEY) && Lang.bind(this, function() {
(elapsedTime >= this._settings.get_uint(LOCK_DELAY_KEY)); this._lockTimeoutId = 0;
if (shouldLock || this._isLocked) { this.lock(true);
this.lock(false); return false;
} else if (this._isActive) { }));
this.unlock();
}
}));
this._isActive = true;
this.emit('lock-status-changed');
} }
}, },
_onUserBecameActive: function() {
// This function gets called here when the user becomes active
// after gnome-session changed the status to IDLE
// There are four possibilities here:
// - we're called when already locked; isActive and isLocked are true,
// we just go back to the lock screen curtain
// - we're called before the lightbox is fully shown; at this point
// isActive is false, so we just hide the ligthbox, reset the activationTime
// and go back to the unlocked desktop
// - we're called after showing the lightbox, but before the lock
// delay; this is mostly like the case above, but isActive is true now
// so we need to notify gnome-settings-daemon to go back to the normal
// policies for blanking
// (they're handled by the same code, and we emit one extra ActiveChanged
// signal in the case above)
// - we're called after showing the lightbox and after lock-delay; the
// session is effectivelly locked now, it's time to build and show
// the lock screen
this.idleMonitor.disconnect(this._becameActiveId);
this._becameActiveId = 0;
let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide();
// Shortcircuit in case the mouse was moved before the fade completed
if (!lightboxWasShown) {
this.deactivate(false);
return;
}
},
_onLightboxShown: function() {
this.activate(false);
},
showDialog: function() { showDialog: function() {
// Ensure that the stage window is mapped, before taking a grab // Ensure that the stage window is mapped, before taking a grab
// otherwise X errors out // otherwise X errors out
@@ -668,6 +761,7 @@ const ScreenShield = new Lang.Class({
this.actor.show(); this.actor.show();
this._isGreeter = Main.sessionMode.isGreeter; this._isGreeter = Main.sessionMode.isGreeter;
this._isLocked = true;
this._ensureUnlockDialog(true, true); this._ensureUnlockDialog(true, true);
this._hideLockScreen(false, 0); this._hideLockScreen(false, 0);
}, },
@@ -688,6 +782,9 @@ const ScreenShield = new Lang.Class({
}, },
_hideLockScreen: function(animate, velocity) { _hideLockScreen: function(animate, velocity) {
if (this._lockScreenState == MessageTray.State.HIDDEN)
return;
this._lockScreenState = MessageTray.State.HIDING; this._lockScreenState = MessageTray.State.HIDING;
if (animate) { if (animate) {
@@ -729,7 +826,7 @@ const ScreenShield = new Lang.Class({
let constructor = Main.sessionMode.unlockDialog; let constructor = Main.sessionMode.unlockDialog;
if (!constructor) { if (!constructor) {
// This session mode has no locking capabilities // This session mode has no locking capabilities
this.unlock(); this.deactivate(true);
return; return;
} }
@@ -739,8 +836,10 @@ const ScreenShield = new Lang.Class({
let time = global.get_current_time(); let time = global.get_current_time();
this._dialog.connect('loaded', Lang.bind(this, function() { this._dialog.connect('loaded', Lang.bind(this, function() {
if (!this._dialog.open(time, onPrimary)) { if (!this._dialog.open(time, onPrimary)) {
// This is kind of an impossible error: we're already modal
// by the time we reach this...
log('Could not open login dialog: failed to acquire grab'); log('Could not open login dialog: failed to acquire grab');
this.unlock(); this.deactivate(true);
} }
})); }));
@@ -756,12 +855,15 @@ const ScreenShield = new Lang.Class({
}, },
_onUnlockSucceded: function() { _onUnlockSucceded: function() {
this._tweenUnlocked(); this.deactivate(true);
}, },
_resetLockScreen: function(animateLockScreen, animateLockDialog) { _resetLockScreen: function(animateLockScreen, animateLockDialog) {
if (this._lockScreenState == MessageTray.State.SHOWING || // Don't reset the lock screen unless it is completely hidden
this._lockScreenState == MessageTray.State.SHOWN) // This prevents the shield going down if the lock-delay timeout
// fires while the user is dragging (which has the potential
// to confuse our state)
if (this._lockScreenState != MessageTray.State.HIDDEN)
return; return;
this._ensureLockScreen(); this._ensureLockScreen();
@@ -830,6 +932,12 @@ const ScreenShield = new Lang.Class({
this._lockScreenGroup.fixed_position_set = false; this._lockScreenGroup.fixed_position_set = false;
this._lockScreenScrollCounter = 0; this._lockScreenScrollCounter = 0;
let prevIsActive = this._isActive;
this._isActive = true;
if (prevIsActive != this._isActive)
this.emit('active-changed');
this.emit('lock-screen-shown'); this.emit('lock-screen-shown');
}, },
@@ -851,12 +959,10 @@ const ScreenShield = new Lang.Class({
this._lockScreenContents.add_actor(this._lockScreenContentsBox); this._lockScreenContents.add_actor(this._lockScreenContentsBox);
if (this._settings.get_boolean('show-notifications')) { this._notificationsBox = new NotificationsBox();
this._notificationsBox = new NotificationsBox(); this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true,
this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true, y_fill: true,
y_fill: true, expand: true });
expand: true });
}
this._hasLockScreen = true; this._hasLockScreen = true;
}, },
@@ -881,6 +987,10 @@ const ScreenShield = new Lang.Class({
}, },
get locked() { get locked() {
return this._isLocked;
},
get active() {
return this._isActive; return this._isActive;
}, },
@@ -888,27 +998,20 @@ const ScreenShield = new Lang.Class({
return this._activationTime; return this._activationTime;
}, },
_tweenUnlocked: function() { deactivate: function(animate) {
this._inUnlockAnimation = true; this._hideLockScreen(animate, 0);
this.unlock();
Tweener.addTween(this._lockDialogGroup, { Tweener.addTween(this._lockDialogGroup, {
scale_x: 0, scale_x: 0,
scale_y: 0, scale_y: 0,
time: Overview.ANIMATION_TIME, time: animate ? Overview.ANIMATION_TIME : 0,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: function() { onComplete: Lang.bind(this, this._completeDeactivate),
if (this._dialog) {
this._dialog.destroy();
this._dialog = null;
}
this.actor.hide();
this._inUnlockAnimation = false;
},
onCompleteScope: this onCompleteScope: this
}); });
}, },
unlock: function() { _completeDeactivate: function() {
if (this._hasLockScreen) if (this._hasLockScreen)
this._clearLockScreen(); this._clearLockScreen();
@@ -924,26 +1027,31 @@ const ScreenShield = new Lang.Class({
this._isModal = false; this._isModal = false;
} }
if (!this._inUnlockAnimation) this.actor.hide();
this.actor.hide();
if (Main.sessionMode.currentMode == 'lock-screen') if (Main.sessionMode.currentMode == 'lock-screen')
Main.sessionMode.popMode('lock-screen'); Main.sessionMode.popMode('lock-screen');
if (Main.sessionMode.currentMode == 'unlock-dialog') if (Main.sessionMode.currentMode == 'unlock-dialog')
Main.sessionMode.popMode('unlock-dialog'); Main.sessionMode.popMode('unlock-dialog');
if (this._becameActiveId != 0) {
this.idleMonitor.disconnect(this._becameActiveId);
this._becameActiveId = 0;
}
if (this._lockTimeoutId != 0) {
Mainloop.source_remove(this._lockTimeoutId);
this._lockTimeoutId = 0;
}
this._activationTime = 0; this._activationTime = 0;
this._isActive = false; this._isActive = false;
this._isLocked = false; this._isLocked = false;
this.emit('lock-status-changed'); this.emit('active-changed');
this.emit('locked-changed');
}, },
lock: function(animate) { activate: function(animate) {
if (!this._isModal) {
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
this._isModal = true;
}
if (this._activationTime == 0) if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time(); this._activationTime = GLib.get_monotonic_time();
@@ -958,9 +1066,28 @@ const ScreenShield = new Lang.Class({
this._resetLockScreen(animate, animate); this._resetLockScreen(animate, animate);
this._isActive = true; // We used to set isActive and emit active-changed here,
// but now we do that from lockScreenShown, which means
// there is a 0.3 seconds window during which the lock
// screen is effectively visible and the screen is locked, but
// the DBus interface reports the screensaver is off.
// This is because when we emit ActiveChanged(true),
// gnome-settings-daemon blanks the screen, and we don't want
// blank during the animation.
// This is not a problem for the idle fade case, because we
// activate without animation in that case.
},
lock: function(animate) {
if (!this._isModal) {
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOCK_SCREEN });
this._isModal = true;
}
this._isLocked = true; this._isLocked = true;
this.emit('lock-status-changed'); this.activate(animate);
this.emit('locked-changed');
}, },
}); });
Signals.addSignalMethods(ScreenShield.prototype); Signals.addSignalMethods(ScreenShield.prototype);
@@ -994,13 +1121,13 @@ const ScreenShieldFallback = new Lang.Class({
else else
this._locked = false; this._locked = false;
this.emit('lock-status-changed', this._locked); this.emit('active-changed', this._locked);
}, },
_onSignal: function(proxy, senderName, signalName, params) { _onSignal: function(proxy, senderName, signalName, params) {
if (signalName == 'ActiveChanged') { if (signalName == 'ActiveChanged') {
[this._locked] = params.deep_unpack(); [this._locked] = params.deep_unpack();
this.emit('lock-status-changed', this._locked); this.emit('active-changed', this._locked);
} }
}, },

View File

@@ -242,7 +242,7 @@ const SelectArea = new Lang.Class({
}); });
Signals.addSignalMethods(SelectArea.prototype); Signals.addSignalMethods(SelectArea.prototype);
const FLASHSPOT_ANIMATION_TIME = 0.25; // seconds const FLASHSPOT_ANIMATION_OUT_TIME = 0.5; // seconds
const Flashspot = new Lang.Class({ const Flashspot = new Lang.Class({
Name: 'Flashspot', Name: 'Flashspot',
@@ -258,21 +258,12 @@ const Flashspot = new Lang.Class({
}, },
fire: function() { fire: function() {
this.actor.opacity = 0;
Tweener.addTween(this.actor,
{ opacity: 255,
time: FLASHSPOT_ANIMATION_TIME,
transition: 'linear',
onComplete: Lang.bind(this, this._onFireShowComplete)
});
this.actor.show(); this.actor.show();
}, this.actor.opacity = 255;
_onFireShowComplete: function() {
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
time: FLASHSPOT_ANIMATION_TIME, time: FLASHSPOT_ANIMATION_OUT_TIME,
transition: 'linear', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
this.destroy(); this.destroy();
}) })

View File

@@ -17,6 +17,26 @@ const Search = imports.ui.search;
const MAX_LIST_SEARCH_RESULTS_ROWS = 3; const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1; const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const MaxWidthBin = new Lang.Class({
Name: 'MaxWidthBin',
Extends: St.Bin,
vfunc_allocate: function(box, flags) {
let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width();
let availWidth = box.x2 - box.x1;
let adjustedBox = box;
if (availWidth > maxWidth) {
let excessWidth = availWidth - maxWidth;
adjustedBox.x1 += Math.floor(excessWidth / 2);
adjustedBox.x2 -= Math.floor(excessWidth / 2);
}
this.parent(adjustedBox, flags);
}
});
const SearchResult = new Lang.Class({ const SearchResult = new Lang.Class({
Name: 'SearchResult', Name: 'SearchResult',
@@ -178,7 +198,7 @@ const ListSearchResults = new Lang.Class({
this._content = new St.BoxLayout({ style_class: 'list-search-results', this._content = new St.BoxLayout({ style_class: 'list-search-results',
vertical: true }); vertical: true });
this.actor.add_actor(this._content); this.actor.add(this._content, { expand: true });
this._notDisplayedResult = []; this._notDisplayedResult = [];
this._terms = []; this._terms = [];
@@ -301,12 +321,19 @@ const SearchResults = new Lang.Class({
this._content = new St.BoxLayout({ name: 'searchResultsContent', this._content = new St.BoxLayout({ name: 'searchResultsContent',
vertical: true }); vertical: true });
this._contentBin = new MaxWidthBin({ name: 'searchResultsBin',
x_fill: true,
y_fill: true,
child: this._content });
let scrollChild = new St.BoxLayout();
scrollChild.add(this._contentBin, { expand: true });
this._scrollView = new St.ScrollView({ x_fill: true, this._scrollView = new St.ScrollView({ x_fill: true,
y_fill: false, y_fill: false,
style_class: 'vfade' }); style_class: 'vfade' });
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this._scrollView.add_actor(this._content); this._scrollView.add_actor(scrollChild);
let action = new Clutter.PanAction({ interpolate: true }); let action = new Clutter.PanAction({ interpolate: true });
action.connect('pan', Lang.bind(this, this._onPan)); action.connect('pan', Lang.bind(this, this._onPan));
this._scrollView.add_action(action); this._scrollView.add_action(action);

View File

@@ -247,8 +247,8 @@ const ScreenSaverDBus = new Lang.Class({
this.parent(); this.parent();
this._screenShield = screenShield; this._screenShield = screenShield;
screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) { screenShield.connect('active-changed', Lang.bind(this, function(shield) {
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked])); this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
})); }));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
@@ -269,13 +269,13 @@ const ScreenSaverDBus = new Lang.Class({
SetActive: function(active) { SetActive: function(active) {
if (active) if (active)
this._screenShield.lock(true); this._screenShield.activate(true);
else else
this._screenShield.unlock(); this._screenShield.unlock(false);
}, },
GetActive: function() { GetActive: function() {
return this._screenShield.locked; return this._screenShield.active;
}, },
GetActiveTime: function() { GetActiveTime: function() {

View File

@@ -9,6 +9,7 @@ const St = imports.gi.St;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@@ -286,6 +287,7 @@ const Indicator = new Lang.Class({
_ensureSource: function() { _ensureSource: function() {
if (!this._source) { if (!this._source) {
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active'); this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active');
this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-bluetooth-panel');
Main.messageTray.add(this._source); Main.messageTray.add(this._source);
} }
}, },

View File

@@ -115,9 +115,14 @@ const IBusManager = new Lang.Class({
this._panelService.connect('update-property', Lang.bind(this, this._updateProperty)); this._panelService.connect('update-property', Lang.bind(this, this._updateProperty));
// If an engine is already active we need to get its properties // If an engine is already active we need to get its properties
this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) { this._ibus.get_global_engine_async(-1, null, Lang.bind(this, function(i, result) {
let engine = this._ibus.get_global_engine_async_finish(result); let engine;
if (!engine) try {
engine = this._ibus.get_global_engine_async_finish(result);
if (!engine)
return;
} catch(e) {
return; return;
}
this._engineChanged(this._ibus, engine.get_name()); this._engineChanged(this._ibus, engine.get_name());
})); }));
this._updateReadiness(); this._updateReadiness();
@@ -332,14 +337,14 @@ const InputSourceIndicator = new Lang.Class({
Main.wm.addKeybinding('switch-input-source', Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES, Meta.KeyBindingFlags.REVERSES,
Main.KeybindingMode.ALL, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward = this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward', Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES | Meta.KeyBindingFlags.REVERSES |
Meta.KeyBindingFlags.REVERSED, Meta.KeyBindingFlags.REVERSED,
Main.KeybindingMode.ALL, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA }); this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged)); this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));

View File

@@ -20,12 +20,14 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const ModemManager = imports.misc.modemManager; const ModemManager = imports.misc.modemManager;
const Util = imports.misc.util; const Util = imports.misc.util;
const NMConnectionCategory = { const NMConnectionCategory = {
INVALID: 'invalid', INVALID: 'invalid',
WIRED: 'wired', WIRED: 'wired',
VIRTUAL: 'virtual',
WIRELESS: 'wireless', WIRELESS: 'wireless',
WWAN: 'wwan', WWAN: 'wwan',
VPN: 'vpn' VPN: 'vpn'
@@ -307,13 +309,10 @@ const NMDevice = new Lang.Class({
Extends: NMConnectionBased, Extends: NMConnectionBased,
_init: function(client, device, connections) { _init: function(client, device, connections) {
this.device = device;
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
// protected
this._client = client; this._client = client;
this._setDevice(device);
this.parent(connections); this.parent(connections);
this._activeConnection = null; this._activeConnection = null;
this._activeConnectionItem = null; this._activeConnectionItem = null;
this._autoConnectionItem = null; this._autoConnectionItem = null;
@@ -338,23 +337,12 @@ const NMDevice = new Lang.Class({
}, },
destroy: function() { destroy: function() {
if (this.device) this._setDevice(null);
this.device._delegate = null;
if (this._stateChangedId) { if (this._deferredWorkId) {
// Need to go through GObject.Object.prototype because // Just clear out, the actual removal is handled when the
// nm_device_disconnect conflicts with g_signal_disconnect // actor is destroyed
GObject.Object.prototype.disconnect.call(this.device, this._stateChangedId); this._deferredWorkId = 0;
this._stateChangedId = 0;
}
if (this._carrierChangedId) {
// see above for why this is needed
GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId);
this._carrierChangedId = 0;
}
if (this._firmwareChangedId) {
GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId);
this._firmwareChangedId = 0;
} }
this._clearSection(); this._clearSection();
@@ -363,6 +351,33 @@ const NMDevice = new Lang.Class({
this.section.destroy(); this.section.destroy();
}, },
_setDevice: function(device) {
if (device) {
this.device = device;
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
} else if (this.device) {
this.device._delegate = null;
if (this._stateChangedId) {
// Need to go through GObject.Object.prototype because
// nm_device_disconnect conflicts with g_signal_disconnect
GObject.Object.prototype.disconnect.call(this.device, this._stateChangedId);
this._stateChangedId = 0;
}
if (this._carrierChangedId) {
GObject.Object.prototype.disconnect.call(this.device, this._carrierChangedId);
this._carrierChangedId = 0;
}
if (this._firmwareChangedId) {
GObject.Object.prototype.disconnect.call(this.device, this._firmwareChangedId);
this._firmwareChangedId = 0;
}
this.device = null;
}
},
deactivate: function() { deactivate: function() {
this.device.disconnect(null); this.device.disconnect(null);
return true; return true;
@@ -377,7 +392,7 @@ const NMDevice = new Lang.Class({
// Otherwise, if no connection is currently configured, // Otherwise, if no connection is currently configured,
// try automatic configuration (or summon the config dialog) // try automatic configuration (or summon the config dialog)
if (this._connections.length == 1) { if (this._connections.length == 1) {
this._client.activate_connection(this._connections[0].connection, this.device, null, null); this._client.activate_connection(this._connections[0].connection, this.device || null, null, null);
return true; return true;
} else if (this._connections.length == 0) { } else if (this._connections.length == 0) {
return this._activateAutomaticConnection(); return this._activateAutomaticConnection();
@@ -397,7 +412,7 @@ const NMDevice = new Lang.Class({
}, },
get connected() { get connected() {
return this.device.state == NetworkManager.DeviceState.ACTIVATED; return this.device && this.device.state == NetworkManager.DeviceState.ACTIVATED;
}, },
clearActiveConnection: function(activeConnection) { clearActiveConnection: function(activeConnection) {
@@ -417,7 +432,6 @@ const NMDevice = new Lang.Class({
this._activeConnection = activeConnection; this._activeConnection = activeConnection;
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
}, },
@@ -431,6 +445,9 @@ const NMDevice = new Lang.Class({
}, },
getStatusLabel: function() { getStatusLabel: function() {
if (!this.device)
return null;
switch(this.device.state) { switch(this.device.state) {
case NetworkManager.DeviceState.DISCONNECTED: case NetworkManager.DeviceState.DISCONNECTED:
case NetworkManager.DeviceState.ACTIVATED: case NetworkManager.DeviceState.ACTIVATED:
@@ -481,7 +498,7 @@ const NMDevice = new Lang.Class({
}, },
syncDescription: function() { syncDescription: function() {
if (this.device._description) if (this.device && this.device._description)
this.statusItem.label.text = this.device._description; this.statusItem.label.text = this.device._description;
}, },
@@ -491,8 +508,10 @@ const NMDevice = new Lang.Class({
}, },
_queueCreateSection: function() { _queueCreateSection: function() {
this._clearSection(); if (this._deferredWorkId) {
Main.queueDeferredWork(this._deferredWorkId); this._clearSection();
Main.queueDeferredWork(this._deferredWorkId);
}
}, },
_clearSection: function() { _clearSection: function() {
@@ -592,7 +611,6 @@ const NMDevice = new Lang.Class({
this._updateStatusItem(); this._updateStatusItem();
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
this.emit('state-changed'); this.emit('state-changed');
}, },
@@ -836,7 +854,6 @@ const NMDeviceBluetooth = new Lang.Class({
_updateAutoConnectionName: function() { _updateAutoConnectionName: function() {
this._autoConnectionName = this._makeConnectionName(this.device); this._autoConnectionName = this._makeConnectionName(this.device);
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
this._updateStatusItem(); this._updateStatusItem();
} }
@@ -1098,10 +1115,8 @@ const NMDeviceWireless = new Lang.Class({
this._networks.splice(res.network, 1); this._networks.splice(res.network, 1);
let newPos = Util.insertSorted(this._networks, network, Lang.bind(this, this._networkSortFunction)); let newPos = Util.insertSorted(this._networks, network, Lang.bind(this, this._networkSortFunction));
if (newPos != res.network) { if (newPos != res.network)
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
}
}, },
_accessPointAdded: function(device, accessPoint) { _accessPointAdded: function(device, accessPoint) {
@@ -1154,10 +1169,8 @@ const NMDeviceWireless = new Lang.Class({
let newPos = Util.insertSorted(this._networks, apObj, this._networkSortFunction); let newPos = Util.insertSorted(this._networks, apObj, this._networkSortFunction);
// Queue an update of the UI if we changed the order // Queue an update of the UI if we changed the order
if (newPos != pos) { if (newPos != pos)
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
}
}, },
_accessPointRemoved: function(device, accessPoint) { _accessPointRemoved: function(device, accessPoint) {
@@ -1217,12 +1230,10 @@ const NMDeviceWireless = new Lang.Class({
if (res.network < this._networks.length-1) if (res.network < this._networks.length-1)
okNext = this._networkSortFunction(this._networks[res.network + 1], apObj) <= 0; okNext = this._networkSortFunction(this._networks[res.network + 1], apObj) <= 0;
if (!okPrev || !okNext) { if (!okPrev || !okNext)
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
} else if (apObj.item) { else if (apObj.item)
apObj.item.updateBestAP(apObj.accessPoints[0]); apObj.item.updateBestAP(apObj.accessPoints[0]);
}
} }
}, },
@@ -1298,7 +1309,6 @@ const NMDeviceWireless = new Lang.Class({
if (forceupdate) { if (forceupdate) {
this._networks.sort(this._networkSortFunction); this._networks.sort(this._networkSortFunction);
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
} }
}, },
@@ -1331,7 +1341,6 @@ const NMDeviceWireless = new Lang.Class({
if (forceupdate) { if (forceupdate) {
this._networks.sort(this._networkSortFunction); this._networks.sort(this._networkSortFunction);
this._clearSection();
this._queueCreateSection(); this._queueCreateSection();
} }
}, },
@@ -1442,6 +1451,56 @@ const NMDeviceWireless = new Lang.Class({
}, },
}); });
const NMDeviceVirtual = new Lang.Class({
Name: 'NMDeviceVirtual',
Extends: NMDeviceSimple,
_init: function(client, iface, connections) {
this.iface = iface;
this.parent(client, null, connections);
this.category = NMConnectionCategory.VIRTUAL;
},
_shouldShowConnectionList: function() {
return this.hasConnections();
},
connectionValid: function(connection) {
return connection.get_virtual_iface_name() == this.iface;
},
addConnection: function(connection) {
if (!this.device && !this.hasConnections())
this.statusItem.label.text = NMGtk.utils_get_connection_device_name(connection);
this.parent(connection);
},
adoptDevice: function(device) {
if (device.get_iface() == this.iface) {
this._setDevice(device);
if (device._description)
this.syncDescription();
this._updateStatusItem();
this.emit('state-changed');
return true;
} else
return false;
},
removeDevice: function(device) {
if (device == this.device) {
this._setDevice(null);
this._updateStatusItem();
this.emit('state-changed');
}
},
hasConnections: function() {
return this._connections.length != 0;
}
});
const NMVPNSection = new Lang.Class({ const NMVPNSection = new Lang.Class({
Name: 'NMVPNSection', Name: 'NMVPNSection',
Extends: NMConnectionBased, Extends: NMConnectionBased,
@@ -1622,6 +1681,7 @@ const NMApplet = new Lang.Class({
this._nmDevices = []; this._nmDevices = [];
this._devices = { }; this._devices = { };
this._virtualDevices = [ ];
this._devices.wired = { this._devices.wired = {
section: new PopupMenu.PopupMenuSection(), section: new PopupMenu.PopupMenuSection(),
@@ -1632,6 +1692,15 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(this._devices.wired.section); this.menu.addMenuItem(this._devices.wired.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._devices.virtual = {
section: new PopupMenu.PopupMenuSection(),
devices: [ ],
};
this._devices.virtual.section.actor.hide();
this.menu.addMenuItem(this._devices.virtual.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._devices.wireless = { this._devices.wireless = {
section: new PopupMenu.PopupMenuSection(), section: new PopupMenu.PopupMenuSection(),
devices: [ ], devices: [ ],
@@ -1665,6 +1734,14 @@ const NMApplet = new Lang.Class({
this._dtypes[NetworkManager.DeviceType.INFINIBAND] = NMDeviceSimple; this._dtypes[NetworkManager.DeviceType.INFINIBAND] = NMDeviceSimple;
// TODO: WiMax support // TODO: WiMax support
// Virtual device types
this._vtypes = { };
if (NMGtk) {
this._vtypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMDeviceVirtual;
this._vtypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMDeviceVirtual;
}
// Connection types // Connection types
this._ctypes = { }; this._ctypes = { };
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS; this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
@@ -1675,6 +1752,11 @@ const NMApplet = new Lang.Class({
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN; this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN; this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_INFINIBAND_SETTING_NAME] = NMConnectionCategory.WIRED; this._ctypes[NetworkManager.SETTING_INFINIBAND_SETTING_NAME] = NMConnectionCategory.WIRED;
if (NMGtk) {
this._ctypes[NetworkManager.SETTING_VLAN_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BOND_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
this._ctypes[NetworkManager.SETTING_BRIDGE_SETTING_NAME] = NMConnectionCategory.VIRTUAL;
}
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN; this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
this._settings = NMClient.RemoteSettings.new(null); this._settings = NMClient.RemoteSettings.new(null);
@@ -1702,6 +1784,7 @@ const NMApplet = new Lang.Class({
if (!this._source) { if (!this._source) {
this._source = new MessageTray.Source(_("Network Manager"), this._source = new MessageTray.Source(_("Network Manager"),
'network-transmit-receive'); 'network-transmit-receive');
this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-network-panel');
this._source.connect('destroy', Lang.bind(this, function() { this._source.connect('destroy', Lang.bind(this, function() {
this._source = null; this._source = null;
@@ -1726,7 +1809,14 @@ const NMApplet = new Lang.Class({
let devices = this._devices[category].devices; let devices = this._devices[category].devices;
let item = this._devices[category].item; let item = this._devices[category].item;
let section = this._devices[category].section; let section = this._devices[category].section;
if (devices.length == 0)
let visible;
if (category == NMConnectionCategory.VIRTUAL)
visible = !section.isEmpty();
else
visible = devices.length > 0;
if (!visible)
section.actor.hide(); section.actor.hide();
else { else {
section.actor.show(); section.actor.show();
@@ -1787,30 +1877,14 @@ const NMApplet = new Lang.Class({
MessageTray.Urgency.HIGH); MessageTray.Urgency.HIGH);
}, },
_makeWrapperDevice: function(wrapperClass, device) {
let wrapper = new wrapperClass(this._client, device, this._connections);
wrapper._activationFailedId = wrapper.connect('activation-failed',
Lang.bind(this, this._onActivationFailed));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.disconnect(wrapper._destroyId);
});
return wrapper;
},
_syncDeviceNames: function() { _syncDeviceNames: function() {
if (NMGtk) { if (NMGtk) {
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices); let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
for (let i = 0; i < this._nmDevices.length; i++) { for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i]; let device = this._nmDevices[i];
device._description = names[i]; device._description = names[i];
device._delegate.syncDescription(); if (device._delegate)
device._delegate.syncDescription();
} }
} else { } else {
for (let i = 0; i < this._nmDevices.length; i++) { for (let i = 0; i < this._nmDevices.length; i++) {
@@ -1825,41 +1899,75 @@ const NMApplet = new Lang.Class({
// already seen, not adding again // already seen, not adding again
return; return;
} }
for (let i = 0; i < this._virtualDevices.length; i++) {
if (this._virtualDevices[i].adoptDevice(device)) {
this._nmDevices.push(device);
if (!skipSyncDeviceNames)
this._syncDeviceNames();
return;
}
}
let wrapperClass = this._dtypes[device.get_device_type()]; let wrapperClass = this._dtypes[device.get_device_type()];
if (wrapperClass) { if (wrapperClass) {
let wrapper = this._makeWrapperDevice(wrapperClass, device); let wrapper = new wrapperClass(this._client, device, this._connections);
let section = this._devices[wrapper.category].section; this._addDeviceWrapper(wrapper);
let devices = this._devices[wrapper.category].devices;
section.addMenuItem(wrapper.statusItem);
section.addMenuItem(wrapper.section);
devices.push(wrapper);
this._nmDevices.push(device); this._nmDevices.push(device);
if (!skipSyncDeviceNames) if (!skipSyncDeviceNames)
this._syncDeviceNames(); this._syncDeviceNames();
this._syncSectionTitle(wrapper.category);
} }
}, },
_addDeviceWrapper: function(wrapper) {
wrapper._activationFailedId = wrapper.connect('activation-failed',
Lang.bind(this, this._onActivationFailed));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category);
}));
wrapper._destroyId = wrapper.connect('destroy', function(wrapper) {
wrapper.disconnect(wrapper._activationFailedId);
wrapper.disconnect(wrapper._deviceStateChangedId);
wrapper.disconnect(wrapper._destroyId);
});
let section = this._devices[wrapper.category].section;
section.addMenuItem(wrapper.statusItem);
section.addMenuItem(wrapper.section);
let devices = this._devices[wrapper.category].devices;
devices.push(wrapper);
this._syncSectionTitle(wrapper.category);
},
_deviceRemoved: function(client, device) { _deviceRemoved: function(client, device) {
if (!device._delegate) { let pos = this._nmDevices.indexOf(device);
if (pos != -1) {
this._nmDevices.splice(pos, 1);
this._syncDeviceNames();
}
let wrapper = device._delegate;
if (!wrapper) {
log('Removing a network device that was not added'); log('Removing a network device that was not added');
return; return;
} }
let wrapper = device._delegate; if (wrapper instanceof NMDeviceVirtual)
wrapper.removeDevice(device);
else
this._removeDeviceWrapper(wrapper);
},
_removeDeviceWrapper: function(wrapper) {
wrapper.destroy(); wrapper.destroy();
let devices = this._devices[wrapper.category].devices; let devices = this._devices[wrapper.category].devices;
let pos = devices.indexOf(wrapper); let pos = devices.indexOf(wrapper);
devices.splice(pos, 1); devices.splice(pos, 1);
pos = this._nmDevices.indexOf(device);
this._nmDevices.splice(pos, 1);
this._syncDeviceNames();
this._syncSectionTitle(wrapper.category) this._syncSectionTitle(wrapper.category)
}, },
@@ -2054,6 +2162,13 @@ const NMApplet = new Lang.Class({
devices[i].removeConnection(connection); devices[i].removeConnection(connection);
} }
if (section == NMConnectionCategory.VIRTUAL) {
let iface = connection.get_virtual_iface_name();
let wrapper = this._findVirtualDevice(iface);
if (wrapper && !wrapper.hasConnections())
this._removeDeviceWrapper(wrapper);
}
connection.disconnect(connection._removedId); connection.disconnect(connection._removedId);
connection.disconnect(connection._updatedId); connection.disconnect(connection._updatedId);
connection._removedId = connection._updatedId = 0; connection._removedId = connection._updatedId = 0;
@@ -2067,6 +2182,27 @@ const NMApplet = new Lang.Class({
let section = connection._section; let section = connection._section;
if (section == NMConnectionCategory.VIRTUAL) {
let wrapperClass = this._vtypes[connection._type];
if (!wrapperClass)
return;
let iface = connection.get_virtual_iface_name();
let wrapper = this._findVirtualDevice(iface);
if (!wrapper) {
wrapper = new wrapperClass(this._client, iface, this._connections);
this._addDeviceWrapper(wrapper);
this._virtualDevices.push(wrapper);
// We might already have a device for this connection
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
if (wrapper.adoptDevice(device))
break;
}
}
}
if (section == NMConnectionCategory.INVALID) if (section == NMConnectionCategory.INVALID)
return; return;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
@@ -2079,6 +2215,15 @@ const NMApplet = new Lang.Class({
} }
}, },
_findVirtualDevice: function(iface) {
for (let i = 0; i < this._virtualDevices.length; i++) {
if (this._virtualDevices[i].iface == iface)
return this._virtualDevices[i];
}
return null;
},
_hideDevices: function() { _hideDevices: function() {
this._devicesHidden = true; this._devicesHidden = true;
@@ -2094,6 +2239,7 @@ const NMApplet = new Lang.Class({
this._statusSection.actor.hide(); this._statusSection.actor.hide();
this._syncSectionTitle(NMConnectionCategory.WIRED); this._syncSectionTitle(NMConnectionCategory.WIRED);
this._syncSectionTitle(NMConnectionCategory.VIRTUAL);
this._syncSectionTitle(NMConnectionCategory.WIRELESS); this._syncSectionTitle(NMConnectionCategory.WIRELESS);
this._syncSectionTitle(NMConnectionCategory.WWAN); this._syncSectionTitle(NMConnectionCategory.WWAN);
}, },
@@ -2131,6 +2277,7 @@ const NMApplet = new Lang.Class({
this.setIcon('network-wireless-acquiring-symbolic'); this.setIcon('network-wireless-acquiring-symbolic');
break; break;
case NMConnectionCategory.WIRED: case NMConnectionCategory.WIRED:
case NMConnectionCategory.VIRTUAL:
this.setIcon('network-wired-acquiring-symbolic'); this.setIcon('network-wired-acquiring-symbolic');
break; break;
default: default:
@@ -2170,6 +2317,7 @@ const NMApplet = new Lang.Class({
break; break;
} }
case NMConnectionCategory.WIRED: case NMConnectionCategory.WIRED:
case NMConnectionCategory.VIRTUAL:
this.setIcon('network-wired-symbolic'); this.setIcon('network-wired-symbolic');
break; break;
case NMConnectionCategory.WWAN: case NMConnectionCategory.WWAN:

View File

@@ -54,7 +54,16 @@ const Indicator = new Lang.Class({
_init: function() { _init: function() {
this.parent('battery-missing-symbolic', _("Battery")); this.parent('battery-missing-symbolic', _("Battery"));
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH); this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
Lang.bind(this, function(proxy, error) {
if (error) {
log(error.message);
return;
}
this._proxy.connect('g-properties-changed',
Lang.bind(this, this._devicesChanged));
this._devicesChanged();
}));
this._deviceItems = [ ]; this._deviceItems = [ ];
this._hasPrimary = false; this._hasPrimary = false;
@@ -70,10 +79,6 @@ const Indicator = new Lang.Class({
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop'); this.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop');
this._proxy.connect('g-properties-changed',
Lang.bind(this, this._devicesChanged));
this._devicesChanged();
}, },
_readPrimaryDevice: function() { _readPrimaryDevice: function() {

View File

@@ -119,7 +119,10 @@ const StreamSlider = new Lang.Class({
_notifyVolumeChange: function() { _notifyVolumeChange: function() {
global.cancel_theme_sound(VOLUME_NOTIFY_ID); global.cancel_theme_sound(VOLUME_NOTIFY_ID);
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change'); global.play_theme_sound(VOLUME_NOTIFY_ID,
'audio-volume-change',
_("Volume changed"),
Clutter.get_current_event ());
}, },
_updateVolume: function() { _updateVolume: function() {
@@ -166,9 +169,8 @@ const OutputStreamSlider = new Lang.Class({
// a bit hackish, but ALSA/PulseAudio have a number // a bit hackish, but ALSA/PulseAudio have a number
// of different identifiers for headphones, and I could // of different identifiers for headphones, and I could
// not find the complete list // not find the complete list
let port = sink.get_port(); if (sink.get_ports().length > 0)
if (port) return sink.get_port().port.indexOf('headphone') >= 0;
return port.port.indexOf('headphone') >= 0;
return false; return false;
}, },

View File

@@ -46,7 +46,8 @@ const SwitcherPopup = new Lang.Class({
this._selectedIndex = 0; this._selectedIndex = 0;
this.actor = new Shell.GenericContainer({ style_class: 'switcher-popup', this.actor = new Shell.GenericContainer({ style_class: 'switcher-popup',
reactive: true }); reactive: true,
visible: false });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate)); this.actor.connect('allocate', Lang.bind(this, this._allocate));

View File

@@ -115,7 +115,7 @@ const UnlockDialog = new Lang.Class({
_init: function(parentActor) { _init: function(parentActor) {
this.parent({ shellReactive: true, this.parent({ shellReactive: true,
styleClass: 'login-dialog', styleClass: 'login-dialog',
keybindingMode: Main.KeybindingMode.UNLOCK_SCREEN, keybindingMode: Shell.KeyBindingMode.UNLOCK_SCREEN,
parentActor: parentActor parentActor: parentActor
}); });

View File

@@ -22,12 +22,13 @@ const Util = imports.misc.util;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching'; const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out'; const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const SHOW_FULL_NAME_KEY = 'show-full-name'; const SHOW_FULL_NAME_IN_TOP_BAR_KEY = 'show-full-name-in-top-bar';
const DIALOG_ICON_SIZE = 64; const DIALOG_ICON_SIZE = 64;
@@ -477,6 +478,7 @@ const UserMenuButton = new Lang.Class({
this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA }); this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
this._userManager = AccountsService.UserManager.get_default(); this._userManager = AccountsService.UserManager.get_default();
@@ -553,10 +555,12 @@ const UserMenuButton = new Lang.Class({
Lang.bind(this, this._updateLogout)); Lang.bind(this, this._updateLogout));
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY, this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
Lang.bind(this, this._updateLockScreen)); Lang.bind(this, this._updateLockScreen));
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_KEY, global.settings.connect('changed::' + ALWAYS_SHOW_LOG_OUT_KEY,
Lang.bind(this, this._updateLogout));
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
Lang.bind(this, this._updateUserName)); Lang.bind(this, this._updateUserName));
global.settings.connect('changed::' + SHOW_FULL_NAME_KEY, this._privacySettings.connect('changed::' + SHOW_FULL_NAME_IN_TOP_BAR_KEY,
Lang.bind(this, this._updateUserName)); Lang.bind(this, this._updateUserName));
this._updateSwitchUser(); this._updateSwitchUser();
this._updateLogout(); this._updateLogout();
this._updateLockScreen(); this._updateLockScreen();
@@ -581,6 +585,7 @@ const UserMenuButton = new Lang.Class({
Lang.bind(this, this._updateHaveShutdown)); Lang.bind(this, this._updateHaveShutdown));
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
Main.screenShield.connect('locked-changed', Lang.bind(this, this._updatePresenceIcon));
this._sessionUpdated(); this._sessionUpdated();
}, },
@@ -602,10 +607,10 @@ const UserMenuButton = new Lang.Class({
}, },
_updateUserName: function() { _updateUserName: function() {
let settings = global.settings; let settings = this._privacySettings;
if (Main.sessionMode.isLocked) if (Main.sessionMode.isLocked)
settings = this._screenSaverSettings; settings = this._screenSaverSettings;
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_KEY)) if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_IN_TOP_BAR_KEY))
this._name.set_text(this._user.get_real_name()); this._name.set_text(this._user.get_real_name());
else else
this._name.set_text(""); this._name.set_text("");
@@ -700,6 +705,11 @@ const UserMenuButton = new Lang.Class({
this._iconBox.child = this._idleIcon; this._iconBox.child = this._idleIcon;
else else
this._iconBox.child = this._offlineIcon; this._iconBox.child = this._offlineIcon;
if (Main.sessionMode.isLocked)
this._iconBox.visible = Main.screenShield.locked;
else
this._iconBox.visible = true;
}, },
_setupAccounts: function() { _setupAccounts: function() {
@@ -820,7 +830,7 @@ const UserMenuButton = new Lang.Class({
_onMyAccountActivate: function() { _onMyAccountActivate: function() {
Main.overview.hide(); Main.overview.hide();
let app = Shell.AppSystem.get_default().lookup_setting('gnome-user-accounts-panel.desktop'); let app = Shell.AppSystem.get_default().lookup_app('gnome-user-accounts-panel.desktop');
app.activate(); app.activate();
}, },

View File

@@ -12,6 +12,7 @@ const St = imports.gi.St;
const AppDisplay = imports.ui.appDisplay; const AppDisplay = imports.ui.appDisplay;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params;
const RemoteSearch = imports.ui.remoteSearch; const RemoteSearch = imports.ui.remoteSearch;
const Search = imports.ui.search; const Search = imports.ui.search;
const SearchDisplay = imports.ui.searchDisplay; const SearchDisplay = imports.ui.searchDisplay;
@@ -46,8 +47,7 @@ const ViewSelector = new Lang.Class({
this._activePage = null; this._activePage = null;
this.active = false; this._searchActive = false;
this._searchPending = false;
this._searchTimeoutId = 0; this._searchTimeoutId = 0;
this._searchSystem = new Search.SearchSystem(); this._searchSystem = new Search.SearchSystem();
@@ -77,16 +77,17 @@ const ViewSelector = new Lang.Class({
this._capturedEventId = 0; this._capturedEventId = 0;
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(); this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null, this._workspacesPage = this._addPage(this._workspacesDisplay.actor,
_("Windows"), 'emblem-documents-symbolic'); _("Windows"), 'emblem-documents-symbolic');
this._appDisplay = new AppDisplay.AllAppDisplay(); this._appDisplay = new AppDisplay.AllAppDisplay();
this._appsPage = this._addPage(this._appDisplay.actor, null, this._appsPage = this._addPage(this._appDisplay.actor,
_("Applications"), 'view-grid-symbolic'); _("Applications"), 'view-grid-symbolic');
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem); this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
this._searchPage = this._addPage(this._searchResults.actor, this._entry, this._searchPage = this._addPage(this._searchResults.actor,
_("Search"), 'edit-find-symbolic'); _("Search"), 'edit-find-symbolic',
{ a11yFocus: this._entry });
this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA }); this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders)); this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
@@ -135,8 +136,8 @@ const ViewSelector = new Lang.Class({
Main.wm.addKeybinding('toggle-application-view', Main.wm.addKeybinding('toggle-application-view',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleAppsPage)); Lang.bind(this, this._toggleAppsPage));
}, },
@@ -169,14 +170,16 @@ const ViewSelector = new Lang.Class({
this._workspacesDisplay.hide(); this._workspacesDisplay.hide();
}, },
_addPage: function(actor, a11yFocus, name, a11yIcon) { _addPage: function(actor, name, a11yIcon, params) {
params = Params.parse(params, { a11yFocus: null });
let page = new St.Bin({ child: actor, let page = new St.Bin({ child: actor,
x_align: St.Align.START, x_align: St.Align.START,
y_align: St.Align.START, y_align: St.Align.START,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
if (a11yFocus) if (params.a11yFocus)
Main.ctrlAltTabManager.addGroup(a11yFocus, name, a11yIcon); Main.ctrlAltTabManager.addGroup(params.a11yFocus, name, a11yIcon);
else else
Main.ctrlAltTabManager.addGroup(actor, name, a11yIcon, Main.ctrlAltTabManager.addGroup(actor, name, a11yIcon,
{ proxy: this.actor, { proxy: this.actor,
@@ -220,7 +223,7 @@ const ViewSelector = new Lang.Class({
}, },
_onShowAppsButtonToggled: function() { _onShowAppsButtonToggled: function() {
if (this.active) if (this._searchActive)
this.reset(); this.reset();
else else
this._showPage(this._showAppsButton.checked ? this._appsPage this._showPage(this._showAppsButton.checked ? this._appsPage
@@ -241,7 +244,7 @@ const ViewSelector = new Lang.Class({
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.Escape) { if (symbol == Clutter.Escape) {
if (this.active) if (this._searchActive)
this.reset(); this.reset();
else if (this._showAppsButton.checked) else if (this._showAppsButton.checked)
this._resetShowAppsButton(); this._resetShowAppsButton();
@@ -249,9 +252,9 @@ const ViewSelector = new Lang.Class({
Main.overview.hide(); Main.overview.hide();
return true; return true;
} else if (Clutter.keysym_to_unicode(symbol) || } else if (Clutter.keysym_to_unicode(symbol) ||
(symbol == Clutter.BackSpace && this.active)) { (symbol == Clutter.BackSpace && this._searchActive)) {
this.startSearch(event); this.startSearch(event);
} else if (!this.active) { } else if (!this._searchActive) {
if (symbol == Clutter.Tab || symbol == Clutter.Down) { if (symbol == Clutter.Tab || symbol == Clutter.Down) {
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
return true; return true;
@@ -325,39 +328,37 @@ const ViewSelector = new Lang.Class({
}, },
_onTextChanged: function (se, prop) { _onTextChanged: function (se, prop) {
let searchPreviouslyActive = this.active; let searchPreviouslyActive = this._searchActive;
this.active = this._entry.get_text() != ''; this._searchActive = this._entry.get_text() != '';
this._searchPending = this.active && !searchPreviouslyActive;
if (this._searchPending) { let startSearch = this._searchActive && !searchPreviouslyActive;
if (startSearch)
this._searchResults.startingSearch(); this._searchResults.startingSearch();
}
if (this.active) { if (this._searchActive) {
this._entry.set_secondary_icon(this._activeIcon); this._entry.set_secondary_icon(this._activeIcon);
if (this._iconClickedId == 0) { if (this._iconClickedId == 0)
this._iconClickedId = this._entry.connect('secondary-icon-clicked', this._iconClickedId = this._entry.connect('secondary-icon-clicked',
Lang.bind(this, function() { Lang.bind(this, this.reset));
this.reset();
})); if (this._searchTimeoutId == 0)
} this._searchTimeoutId = Mainloop.timeout_add(150,
} else { Lang.bind(this, this._doSearch));
if (this._iconClickedId > 0) } else {
this._entry.disconnect(this._iconClickedId); if (this._iconClickedId > 0) {
this._iconClickedId = 0; this._entry.disconnect(this._iconClickedId);
this._iconClickedId = 0;
}
this._entry.set_secondary_icon(this._inactiveIcon);
this._searchCancelled();
}
if (!this.active) {
if (this._searchTimeoutId > 0) { if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId); Mainloop.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0; this._searchTimeoutId = 0;
} }
return;
this._entry.set_secondary_icon(this._inactiveIcon);
this._searchCancelled();
} }
if (this._searchTimeoutId > 0)
return;
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, this._doSearch));
}, },
_onKeyPress: function(entry, event) { _onKeyPress: function(entry, event) {
@@ -367,16 +368,7 @@ const ViewSelector = new Lang.Class({
this.reset(); this.reset();
return true; return true;
} }
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { } else if (this._searchActive) {
// We can't connect to 'activate' here because search providers
// might want to do something with the modifiers in activateDefault.
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateDefault();
return true;
} else if (this.active) {
let arrowNext, nextDirection; let arrowNext, nextDirection;
if (entry.get_text_direction() == Clutter.TextDirection.RTL) { if (entry.get_text_direction() == Clutter.TextDirection.RTL) {
arrowNext = Clutter.Left; arrowNext = Clutter.Left;
@@ -400,6 +392,15 @@ const ViewSelector = new Lang.Class({
} else if (symbol == arrowNext && this._text.position == -1) { } else if (symbol == arrowNext && this._text.position == -1) {
this._searchResults.navigateFocus(nextDirection); this._searchResults.navigateFocus(nextDirection);
return true; return true;
} else if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
// We can't connect to 'activate' here because search providers
// might want to do something with the modifiers in activateDefault.
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateDefault();
return true;
} }
} }
return false; return false;

View File

@@ -105,74 +105,74 @@ const WindowManager = new Lang.Class({
this._workspaceSwitcherPopup = null; this._workspaceSwitcherPopup = null;
this.setCustomKeybindingHandler('switch-to-workspace-left', this.setCustomKeybindingHandler('switch-to-workspace-left',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-right', this.setCustomKeybindingHandler('switch-to-workspace-right',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-up', this.setCustomKeybindingHandler('switch-to-workspace-up',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-down', this.setCustomKeybindingHandler('switch-to-workspace-down',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-left', this.setCustomKeybindingHandler('move-to-workspace-left',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-right', this.setCustomKeybindingHandler('move-to-workspace-right',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-up', this.setCustomKeybindingHandler('move-to-workspace-up',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-down', this.setCustomKeybindingHandler('move-to-workspace-down',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-applications', this.setCustomKeybindingHandler('switch-applications',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group', this.setCustomKeybindingHandler('switch-group',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-applications-backward', this.setCustomKeybindingHandler('switch-applications-backward',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-group-backward', this.setCustomKeybindingHandler('switch-group-backward',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
this.setCustomKeybindingHandler('switch-windows', this.setCustomKeybindingHandler('switch-windows',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startWindowSwitcher)); Lang.bind(this, this._startWindowSwitcher));
this.setCustomKeybindingHandler('switch-windows-backward', this.setCustomKeybindingHandler('switch-windows-backward',
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startWindowSwitcher)); Lang.bind(this, this._startWindowSwitcher));
this.setCustomKeybindingHandler('switch-panels', this.setCustomKeybindingHandler('switch-panels',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW | Shell.KeyBindingMode.OVERVIEW |
Main.KeybindingMode.LOCK_SCREEN | Shell.KeyBindingMode.LOCK_SCREEN |
Main.KeybindingMode.UNLOCK_SCREEN | Shell.KeyBindingMode.UNLOCK_SCREEN |
Main.KeybindingMode.LOGIN_SCREEN, Shell.KeyBindingMode.LOGIN_SCREEN,
Lang.bind(this, this._startA11ySwitcher)); Lang.bind(this, this._startA11ySwitcher));
this.setCustomKeybindingHandler('switch-panels-backward', this.setCustomKeybindingHandler('switch-panels-backward',
Main.KeybindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Main.KeybindingMode.OVERVIEW | Shell.KeyBindingMode.OVERVIEW |
Main.KeybindingMode.LOCK_SCREEN | Shell.KeyBindingMode.LOCK_SCREEN |
Main.KeybindingMode.UNLOCK_SCREEN | Shell.KeyBindingMode.UNLOCK_SCREEN |
Main.KeybindingMode.LOGIN_SCREEN, Shell.KeyBindingMode.LOGIN_SCREEN,
Lang.bind(this, this._startA11ySwitcher)); Lang.bind(this, this._startA11ySwitcher));
this.addKeybinding('open-application-menu', this.addKeybinding('open-application-menu',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Main.KeybindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._openAppMenu)); Lang.bind(this, this._openAppMenu));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
@@ -199,7 +199,7 @@ const WindowManager = new Lang.Class({
removeKeybinding: function(name) { removeKeybinding: function(name) {
if (global.display.remove_keybinding(name)) if (global.display.remove_keybinding(name))
this.allowKeybinding(name, Main.KeybindingMode.NONE); this.allowKeybinding(name, Shell.KeyBindingMode.NONE);
}, },
allowKeybinding: function(name, modes) { allowKeybinding: function(name, modes) {
@@ -242,22 +242,30 @@ const WindowManager = new Lang.Class({
} }
actor.set_scale(1.0, 1.0); actor.set_scale(1.0, 1.0);
actor.move_anchor_point_from_gravity(Clutter.Gravity.CENTER);
/* scale window down to 0x0.
* maybe TODO: get icon geometry passed through and move the window towards it?
*/
this._minimizing.push(actor); this._minimizing.push(actor);
let monitor = Main.layoutManager.findMonitorForWindow(actor.meta_window); let xDest, yDest, xScale, yScale;
let xDest = monitor.x; let [success, geom] = actor.meta_window.get_icon_geometry();
let yDest = monitor.y; if (success) {
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) xDest = geom.x;
xDest += monitor.width; yDest = geom.y;
xScale = geom.width / actor.width;
yScale = geom.height / actor.height;
} else {
/* scale window down to 0x0. */
let monitor = Main.layoutManager.findMonitorForWindow(actor.meta_window);
xDest = monitor.x;
yDest = monitor.y;
xScale = 0.0;
yScale = 0.0;
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)
xDest += monitor.width;
}
Tweener.addTween(actor, Tweener.addTween(actor,
{ scale_x: 0.0, { scale_x: xScale,
scale_y: 0.0, scale_y: yScale,
x: xDest, x: xDest,
y: yDest, y: yDest,
time: WINDOW_ANIMATION_TIME, time: WINDOW_ANIMATION_TIME,
@@ -494,14 +502,14 @@ const WindowManager = new Lang.Class({
}, },
_filterKeybinding: function(shellwm, binding) { _filterKeybinding: function(shellwm, binding) {
if (Main.keybindingMode == Main.KeybindingMode.NONE) if (Main.keybindingMode == Shell.KeyBindingMode.NONE)
return true; return true;
// There's little sense in implementing a keybinding in mutter and // There's little sense in implementing a keybinding in mutter and
// not having it work in NORMAL mode; handle this case generically // not having it work in NORMAL mode; handle this case generically
// so we don't have to explicitly allow all builtin keybindings in // so we don't have to explicitly allow all builtin keybindings in
// NORMAL mode. // NORMAL mode.
if (Main.keybindingMode == Main.KeybindingMode.NORMAL && if (Main.keybindingMode == Shell.KeyBindingMode.NORMAL &&
binding.is_builtin()) binding.is_builtin())
return false; return false;

View File

@@ -746,11 +746,10 @@ const LayoutStrategy = new Lang.Class({
Name: 'LayoutStrategy', Name: 'LayoutStrategy',
Abstract: true, Abstract: true,
_init: function(monitor, rowSpacing, columnSpacing, bottomPadding) { _init: function(monitor, rowSpacing, columnSpacing) {
this._monitor = monitor; this._monitor = monitor;
this._rowSpacing = rowSpacing; this._rowSpacing = rowSpacing;
this._columnSpacing = columnSpacing; this._columnSpacing = columnSpacing;
this._bottomPadding = bottomPadding;
}, },
_newRow: function() { _newRow: function() {
@@ -775,24 +774,23 @@ const LayoutStrategy = new Lang.Class({
windows: [] }; windows: [] };
}, },
// Compute the size and fancy scale for @window using the // Computes and returns a fancy scale for @window using the
// base scale, @scale. // base scale, @scale.
// _computeWindowScale: function(window, scale) {
// Returns a list structure: [ scaledWidth, scaledHeight, fancyScale ] // Since we align windows next to each other, the height of the
// where scaledWidth and scaledHeight are the window's // thumbnails is much more important to preserve than the width of
// width and height, scaled by fancyScale for convenience. // them, so two windows with equal height, but maybe differering
_computeWindowSizeAndScale: function(window, scale) { // widths line up.
let width = window.actor.width; let ratio = window.actor.height / this._monitor.height;
let height = window.actor.height;
let ratio;
if (width > height) // The purpose of this manipulation here is to prevent windows
ratio = width / this._monitor.width; // from getting too small. For something like a calculator window,
else // we need to bump up the size just a bit to make sure it looks
ratio = height / this._monitor.height; // good. We'll use a multiplier of 1.5 for this.
let fancyScale = (2 / (1 + ratio)) * scale; // Map from [0, 1] to [1.5, 1]
return [width * fancyScale, height * fancyScale, fancyScale]; let fancyScale = _interpolate(1.5, 1, ratio) * scale;
return fancyScale;
}, },
// Compute the size of each row, by assigning to the properties // Compute the size of each row, by assigning to the properties
@@ -830,7 +828,7 @@ const LayoutStrategy = new Lang.Class({
let area = layout.area; let area = layout.area;
let hspacing = (layout.maxColumns - 1) * this._columnSpacing; let hspacing = (layout.maxColumns - 1) * this._columnSpacing;
let vspacing = (layout.numRows - 1) * this._rowSpacing + this._bottomPadding; let vspacing = (layout.numRows - 1) * this._rowSpacing;
let spacedWidth = area.width - hspacing; let spacedWidth = area.width - hspacing;
let spacedHeight = area.height - vspacing; let spacedHeight = area.height - vspacing;
@@ -864,7 +862,7 @@ const LayoutStrategy = new Lang.Class({
y += row.height + this._rowSpacing; y += row.height + this._rowSpacing;
} }
let height = y - this._rowSpacing + this._bottomPadding; let height = y - this._rowSpacing;
let baseY = (area.height - height) / 2; let baseY = (area.height - height) / 2;
for (let i = 0; i < rows.length; i++) { for (let i = 0; i < rows.length; i++) {
@@ -874,7 +872,10 @@ const LayoutStrategy = new Lang.Class({
for (let j = 0; j < row.windows.length; j++) { for (let j = 0; j < row.windows.length; j++) {
let window = row.windows[j]; let window = row.windows[j];
let [width, height, s] = this._computeWindowSizeAndScale(window, scale); let s = this._computeWindowScale(window, scale);
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
let width = window.actor.width * s;
let height = window.actor.height * s;
let y = row.y + row.height - height; let y = row.y + row.height - height;
let x = baseX; let x = baseX;
@@ -935,7 +936,9 @@ const UnalignedLayoutStrategy = new Lang.Class({
for (; windowIdx < windows.length; windowIdx++) { for (; windowIdx < windows.length; windowIdx++) {
let window = windows[windowIdx]; let window = windows[windowIdx];
let [width, height] = this._computeWindowSizeAndScale(window, 1); let s = this._computeWindowScale(window, 1);
let width = window.actor.width * s;
let height = window.actor.height * s;
row.fullHeight = Math.max(row.fullHeight, height); row.fullHeight = Math.max(row.fullHeight, height);
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth // either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
@@ -1001,9 +1004,9 @@ const GridLayoutStrategy = new Lang.Class({
let window = windows[windowIdx]; let window = windows[windowIdx];
row.windows.push(window); row.windows.push(window);
let [width, height] = this._computeWindowSizeAndScale(window, 1); let s = this._computeWindowScale(window, 1);
maxWindowWidth = Math.max(maxWindowWidth, width); maxWindowWidth = Math.max(maxWindowWidth, window.actor.width * s);
maxWindowHeight = Math.max(maxWindowHeight, height); maxWindowHeight = Math.max(maxWindowHeight, window.actor.height * s);
} }
} }
@@ -1038,6 +1041,8 @@ const Workspace = new Lang.Class({
this._windowOverlaysGroup.set_size(0, 0); this._windowOverlaysGroup.set_size(0, 0);
this.actor = new St.Widget({ style_class: 'window-picker' }); this.actor = new St.Widget({ style_class: 'window-picker' });
if (monitorIndex != Main.layoutManager.primaryIndex)
this.actor.add_style_class_name('external-monitor');
this.actor.set_size(0, 0); this.actor.set_size(0, 0);
this._dropRect = new Clutter.Rectangle({ opacity: 0 }); this._dropRect = new Clutter.Rectangle({ opacity: 0 });
@@ -1202,7 +1207,7 @@ const Workspace = new Lang.Class({
// Make the window slightly transparent to indicate it's hidden // Make the window slightly transparent to indicate it's hidden
Tweener.addTween(clone.actor, Tweener.addTween(clone.actor,
{ opacity: 255, { opacity: 128,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeInQuad' transition: 'easeInQuad'
}); });
@@ -1624,7 +1629,7 @@ const Workspace = new Lang.Class({
} }
}, },
_computeLayout: function(windows, area, rowSpacing, columnSpacing, bottomPadding) { _computeLayout: function(windows, area, rowSpacing, columnSpacing) {
// We look for the largest scale that allows us to fit the // We look for the largest scale that allows us to fit the
// largest row/tallest column on the workspace. // largest row/tallest column on the workspace.
@@ -1640,7 +1645,7 @@ const Workspace = new Lang.Class({
break; break;
let strategyClass = numRows > 2 ? GridLayoutStrategy : UnalignedLayoutStrategy; let strategyClass = numRows > 2 ? GridLayoutStrategy : UnalignedLayoutStrategy;
let strategy = new strategyClass(this._monitor, rowSpacing, columnSpacing, bottomPadding); let strategy = new strategyClass(this._monitor, rowSpacing, columnSpacing);
let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns }; let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns };
strategy.computeLayout(windows, layout); strategy.computeLayout(windows, layout);
@@ -1672,6 +1677,12 @@ const Workspace = new Lang.Class({
// Window grid spacing // Window grid spacing
let columnSpacing = node.get_length('-horizontal-spacing'); let columnSpacing = node.get_length('-horizontal-spacing');
let rowSpacing = node.get_length('-vertical-spacing'); let rowSpacing = node.get_length('-vertical-spacing');
let padding = {
left: node.get_padding(St.Side.LEFT),
top: node.get_padding(St.Side.TOP),
bottom: node.get_padding(St.Side.BOTTOM),
right: node.get_padding(St.Side.RIGHT),
};
if (!totalWindows) if (!totalWindows)
return []; return [];
@@ -1686,19 +1697,25 @@ const Workspace = new Lang.Class({
[leftBorder, rightBorder] = overlay.chromeWidths(); [leftBorder, rightBorder] = overlay.chromeWidths();
} else { } else {
[closeButtonHeight, captionHeight] = [0, 0]; [closeButtonHeight, captionHeight] = [0, 0];
[leftBorder, rightBorder] = [0, 0];
} }
rowSpacing += captionHeight; rowSpacing += captionHeight;
columnSpacing += rightBorder; columnSpacing += (rightBorder + leftBorder) / 2;
padding.top += closeButtonHeight;
padding.bottom += captionHeight;
padding.left += leftBorder;
padding.right += rightBorder;
let area = { x: this._x, y: this._y, width: this._width, height: this._height }; let area = {
area.y += closeButtonHeight; x: this._x + padding.left,
area.height -= closeButtonHeight; y: this._y + padding.top,
area.x += leftBorder; width: this._width - padding.left - padding.right,
area.width -= leftBorder; height: this._height - padding.top - padding.bottom,
};
if (!this._currentLayout) if (!this._currentLayout)
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight); this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing);
let layout = this._currentLayout; let layout = this._currentLayout;
let strategy = layout.strategy; let strategy = layout.strategy;

View File

@@ -170,7 +170,8 @@ const WorkspaceThumbnail = new Lang.Class({
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._background = Meta.BackgroundActor.new_for_screen(global.screen); this._background = new Meta.BackgroundActor({ screen: global.screen,
settings: Main.background });
this._contents.add_actor(this._background); this._contents.add_actor(this._background);
let monitor = Main.layoutManager.primaryMonitor; let monitor = Main.layoutManager.primaryMonitor;

View File

@@ -21,6 +21,7 @@ eu
fa fa
fi fi
fr fr
fur
ga ga
gl gl
gu gu

View File

@@ -11,6 +11,7 @@ js/misc/util.js
js/ui/appDisplay.js js/ui/appDisplay.js
js/ui/appFavorites.js js/ui/appFavorites.js
js/ui/calendar.js js/ui/calendar.js
js/ui/components/automountManager.js
js/ui/components/autorunManager.js js/ui/components/autorunManager.js
js/ui/components/keyring.js js/ui/components/keyring.js
js/ui/components/networkAgent.js js/ui/components/networkAgent.js

475
po/as.po

File diff suppressed because it is too large Load Diff

737
po/be.po

File diff suppressed because it is too large Load Diff

378
po/de.po
View File

@@ -19,9 +19,9 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-12-21 18:33+0000\n" "POT-Creation-Date: 2013-01-24 17:07+0000\n"
"PO-Revision-Date: 2013-01-01 22:44+0100\n" "PO-Revision-Date: 2013-01-19 21:35+0100\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n" "Last-Translator: Tobias111 <tobiasendrigkeit@googlemail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n" "Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: de_DE\n" "Language: de_DE\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -170,21 +170,13 @@ msgstr ""
"»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen." "»Abmelden« in Einzelbenutzer, Einzelsitzungssituationen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show full name in the user menu"
msgstr "Den vollen Namen im Benutzermenü anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr "Legt fest, ob der vollständige Name im Benutzermenü angezeigt wird."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Legt fest, ob Passwörter für eingehängte, verschlüsselte oder ferne " "Legt fest, ob Passwörter für eingehängte, verschlüsselte oder ferne "
"Dateisysteme gespeichert werden" "Dateisysteme gespeichert werden"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "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 " "filesystem is mounted. If the password can be saved for future use a "
@@ -197,76 +189,76 @@ msgstr ""
"angeboten. Dieser Schlüssel stellt den Standardstatus für dieses Ankreuzfeld " "angeboten. Dieser Schlüssel stellt den Standardstatus für dieses Ankreuzfeld "
"ein." "ein."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Wochentag im Kalender anzeigen" msgstr "Wochentag im Kalender anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr ""
"Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt." "Wenn dieser Wert gesetzt ist, wird der ISO-Wochentag im Kalender angezeigt."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs" msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs." msgstr "Tastenkombination zum Öffnen des Anwendungsmenüs."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht" msgstr "Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "" msgstr ""
"Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht der " "Tastenkombination zum Öffnen der »Zeige Anwendungen«-Ansicht der "
"Aktivitätenübersicht." "Aktivitätenübersicht."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "" msgstr ""
"Tastenkombination zum Umschalten der Sichtbarkeit des Benachrichtigungsfeldes" "Tastenkombination zum Umschalten der Sichtbarkeit des Benachrichtigungsfeldes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "" msgstr ""
"Tastenkombination zum Umschalten der Sichtbarkeit des " "Tastenkombination zum Umschalten der Sichtbarkeit des "
"Benachrichtigungsfeldes." "Benachrichtigungsfeldes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen" msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen." msgstr "Tastenkombination zur Ausrichtung auf die aktiven Benachrichtigungen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners" msgstr "Tastenkombination zum Umschalten des Bildschirmaufzeichners"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr ""
"Tastenkombination zum Starten/Entfernen des eingebauten " "Tastenkombination zum Starten/Entfernen des eingebauten "
"Bildschirmaufzeichners." "Bildschirmaufzeichners."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Zu verwendende Tastatur" msgstr "Zu verwendende Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Der Typ der zu verwendenden Tastatur" msgstr "Der Typ der zu verwendenden Tastatur"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts" msgstr "Bildwiederholungsrate zur Aufnahme von Screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@@ -275,11 +267,11 @@ msgstr ""
"der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde." "der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde."
# hmm Enkodieren oder Kodieren? # hmm Enkodieren oder Kodieren?
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts" msgstr "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -307,11 +299,11 @@ msgstr ""
"aufzeichnet. %T wird als Platzhalter für die vermutete optimale Thread-" "aufzeichnet. %T wird als Platzhalter für die vermutete optimale Thread-"
"Anzahl auf dem System verwendet." "Anzahl auf dem System verwendet."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Die Dateiendung zum Speichern des Screencast" msgstr "Die Dateiendung zum Speichern des Screencast"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@@ -322,11 +314,11 @@ msgstr ""
"Dateiname sollte geändert werden, wenn Sie in einem anderen Containerformat " "Dateiname sollte geändert werden, wenn Sie in einem anderen Containerformat "
"aufnehmen." "aufnehmen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Der Modus der Anwendungssymbole." msgstr "Der Modus der Anwendungssymbole."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -336,22 +328,22 @@ msgstr ""
"»thumbnail-only« (Vorschaubilder der Fenster werden angezeigt), »app-icon-" "»thumbnail-only« (Vorschaubilder der Fenster werden angezeigt), »app-icon-"
"only« (Nur das Anwendungssymbol wird angezeigt) oder »both« (beides)." "only« (Nur das Anwendungssymbol wird angezeigt) oder »both« (beides)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Modalen Dialog an übergeordnetes Fenster binden" msgstr "Modalen Dialog an übergeordnetes Fenster binden"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Dieser Schlüssel überschreibt den Schlüssel in org.gnome.mutter, wenn die " "Dieser Schlüssel überschreibt den Schlüssel in org.gnome.mutter, wenn die "
"GNOME-Shell läuft." "GNOME-Shell läuft."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "Anordnung der Knöpfe auf der Titelleiste" msgstr "Anordnung der Knöpfe auf der Titelleiste"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
@@ -359,15 +351,17 @@ msgstr ""
"Dieser Schlüssel überschreibt den Schlüssel in org.gnome.desktop.wm." "Dieser Schlüssel überschreibt den Schlüssel in org.gnome.desktop.wm."
"preferences, wenn die GNOME-Shell läuft." "preferences, wenn die GNOME-Shell läuft."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
#, fuzzy
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Größenanpassung aktivieren, wenn Fenster in die Ecken verschoben werden"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Arbeitsflächen dynamisch verwalten" msgstr "Arbeitsflächen dynamisch verwalten"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Arbeitsflächen nur auf dem primären Bildschirm." msgstr "Arbeitsflächen nur auf dem primären Bildschirm."
@@ -384,11 +378,11 @@ msgstr "Erweiterung"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen." msgstr "Wählen Sie oben eine Erweiterung aus, die Sie konfigurieren wollen."
#: ../js/gdm/loginDialog.js:565 #: ../js/gdm/loginDialog.js:569
msgid "Session..." msgid "Session..."
msgstr "Sitzung …" msgstr "Sitzung …"
#: ../js/gdm/loginDialog.js:722 #: ../js/gdm/loginDialog.js:726
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Anmelden" msgstr "Anmelden"
@@ -396,35 +390,35 @@ msgstr "Anmelden"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:790
msgid "Not listed?" msgid "Not listed?"
msgstr "Nicht aufgeführt?" msgstr "Nicht aufgeführt?"
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:967 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178 #: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel" msgid "Cancel"
msgstr "Abbrechen" msgstr "Abbrechen"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:983
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Anmelden" msgstr "Anmelden"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:983
msgid "Next" msgid "Next"
msgstr "Nächstes" msgstr "Nächstes"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Benutzername:" msgstr "Benutzername:"
#: ../js/gdm/loginDialog.js:1382 #: ../js/gdm/loginDialog.js:1387
msgid "Login Window" msgid "Login Window"
msgstr "Anmeldefenster" msgstr "Anmeldefenster"
@@ -433,8 +427,8 @@ msgstr "Anmeldefenster"
msgid "Power" msgid "Power"
msgstr "Ausschalten" msgstr "Ausschalten"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
#: ../js/ui/userMenu.js:790 #: ../js/ui/userMenu.js:792
msgid "Suspend" msgid "Suspend"
msgstr "Bereitschaft" msgstr "Bereitschaft"
@@ -442,8 +436,8 @@ msgstr "Bereitschaft"
msgid "Restart" msgid "Restart"
msgstr "Neu starten" msgstr "Neu starten"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
msgid "Power Off" msgid "Power Off"
msgstr "Ausschalten" msgstr "Ausschalten"
@@ -654,6 +648,14 @@ msgstr "Diese Woche"
msgid "Next week" msgid "Next week"
msgstr "Nächste Woche" msgstr "Nächste Woche"
#: ../js/ui/components/automountManager.js:92
msgid "External drive connected"
msgstr ""
#: ../js/ui/components/automountManager.js:103
msgid "External drive disconnected"
msgstr ""
#: ../js/ui/components/autorunManager.js:295 #: ../js/ui/components/autorunManager.js:295
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Wechseldatenträger" msgstr "Wechseldatenträger"
@@ -667,11 +669,11 @@ msgstr "Öffnen mit %s"
msgid "Eject" msgid "Eject"
msgstr "Auswerfen" msgstr "Auswerfen"
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260 #: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
msgid "Password:" msgid "Password:"
msgstr "Passwort:" msgstr "Passwort:"
#: ../js/ui/components/keyring.js:105 #: ../js/ui/components/keyring.js:101
msgid "Type again:" msgid "Type again:"
msgstr "Erneut eingeben:" msgstr "Erneut eingeben:"
@@ -759,7 +761,7 @@ msgstr "Legitimierung erforderlich"
msgid "Administrator" msgid "Administrator"
msgstr "Systemverwalter" msgstr "Systemverwalter"
#: ../js/ui/components/polkitAgent.js:166 #: ../js/ui/components/polkitAgent.js:165
msgid "Authenticate" msgid "Authenticate"
msgstr "Legitimieren" msgstr "Legitimieren"
@@ -767,7 +769,7 @@ msgstr "Legitimieren"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Entschuldigung, das hat nicht geklappt. Bitte versuchen Sie es erneut." msgstr "Entschuldigung, das hat nicht geklappt. Bitte versuchen Sie es erneut."
@@ -1016,7 +1018,7 @@ msgstr "Verbindung zu %s fehlgeschlagen"
msgid "View account" msgid "View account"
msgstr "Konto anzeigen" msgstr "Konto anzeigen"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1383
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Unbekannter Grund" msgstr "Unbekannter Grund"
@@ -1028,18 +1030,22 @@ msgstr "Fenster"
msgid "Show Applications" msgid "Show Applications"
msgstr "Anwendungen anzeigen" msgstr "Anwendungen anzeigen"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "Einstellungen für Datum und Uhrzeit"
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Kalender öffnen" msgstr "Kalender öffnen"
#: ../js/ui/dateMenu.js:96
msgid "Open Clocks"
msgstr "Uhren öffnen"
#: ../js/ui/dateMenu.js:105
msgid "Date and Time Settings"
msgstr "Einstellungen für Datum und Uhrzeit"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:201 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %B %Y" msgstr "%A, %e. %B %Y"
@@ -1146,78 +1152,80 @@ msgstr "Installieren"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "»%s« von extensions.gnome.org herunterladen und installieren?" msgstr "»%s« von extensions.gnome.org herunterladen und installieren?"
#: ../js/ui/keyboard.js:308 #: ../js/ui/keyboard.js:291
msgid "tray" msgid "tray"
msgstr "Benachrichtigungsfeld" msgstr "Benachrichtigungsfeld"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309 #: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:206
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatur" msgstr "Tastatur"
#: ../js/ui/lookingGlass.js:691 #: ../js/ui/lookingGlass.js:692
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Keine Erweiterungen installiert" msgstr "Keine Erweiterungen installiert"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:745 #: ../js/ui/lookingGlass.js:746
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s hat keine Fehler ausgegeben." msgstr "%s hat keine Fehler ausgegeben."
#: ../js/ui/lookingGlass.js:751 #: ../js/ui/lookingGlass.js:752
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Fehler verbergen" msgstr "Fehler verbergen"
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815 #: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
msgid "Show Errors" msgid "Show Errors"
msgstr "Fehler anzeigen" msgstr "Fehler anzeigen"
#: ../js/ui/lookingGlass.js:764 #: ../js/ui/lookingGlass.js:765
msgid "Enabled" msgid "Enabled"
msgstr "Aktiviert" msgstr "Aktiviert"
#: ../js/ui/lookingGlass.js:767 #. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Deaktiviert" msgstr "Deaktiviert"
#: ../js/ui/lookingGlass.js:769 #: ../js/ui/lookingGlass.js:770
msgid "Error" msgid "Error"
msgstr "Fehler" msgstr "Fehler"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:772
msgid "Out of date" msgid "Out of date"
msgstr "Veraltet" msgstr "Veraltet"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:774
msgid "Downloading" msgid "Downloading"
msgstr "Herunterladen" msgstr "Herunterladen"
#: ../js/ui/lookingGlass.js:797 #: ../js/ui/lookingGlass.js:798
msgid "View Source" msgid "View Source"
msgstr "Quelle zeigen" msgstr "Quelle zeigen"
#: ../js/ui/lookingGlass.js:806 #: ../js/ui/lookingGlass.js:807
msgid "Web Page" msgid "Web Page"
msgstr "Webseite" msgstr "Webseite"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1118
msgid "Open" msgid "Open"
msgstr "Öffnen" msgstr "Öffnen"
#: ../js/ui/messageTray.js:1095 #: ../js/ui/messageTray.js:1125
msgid "Remove" msgid "Remove"
msgstr "Entfernen" msgstr "Entfernen"
#: ../js/ui/messageTray.js:1552 #: ../js/ui/messageTray.js:1581
msgid "No Messages" msgid "No Messages"
msgstr "Keine Nachrichten" msgstr "Keine Nachrichten"
#: ../js/ui/messageTray.js:1570 #: ../js/ui/messageTray.js:1599
msgid "Message Tray" msgid "Message Tray"
msgstr "Benachrichtigungsfeld" msgstr "Benachrichtigungsfeld"
#: ../js/ui/messageTray.js:2639 #: ../js/ui/messageTray.js:2672
msgid "System Information" msgid "System Information"
msgstr "Systeminformationen" msgstr "Systeminformationen"
@@ -1249,17 +1257,17 @@ msgstr "Suchbegriff eingeben …"
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
#: ../js/ui/panel.js:608 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Beenden" msgstr "Beenden"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:637 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Aktivitäten" msgstr "Aktivitäten"
#: ../js/ui/panel.js:980 #: ../js/ui/panel.js:976
msgid "Top Bar" msgid "Top Bar"
msgstr "Obere Leiste" msgstr "Obere Leiste"
@@ -1268,7 +1276,7 @@ msgstr "Obere Leiste"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:725 #: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@@ -1285,33 +1293,33 @@ msgstr "Schließen"
# %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung # %B - ausgeschriebener Name des Monats, abhängig von der gesetzten Umgebung
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:112 #: ../js/ui/screenShield.js:113
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:176 #: ../js/ui/screenShield.js:177
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d neue Nachricht" msgstr[0] "%d neue Nachricht"
msgstr[1] "%d neue Nachrichten" msgstr[1] "%d neue Nachrichten"
#: ../js/ui/screenShield.js:178 #: ../js/ui/screenShield.js:179
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d neue Benachrichtigung" msgstr[0] "%d neue Benachrichtigung"
msgstr[1] "%d neue Benachrichtigungen" msgstr[1] "%d neue Benachrichtigungen"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
msgid "Lock" msgid "Lock"
msgstr "Sperren" msgstr "Sperren"
#: ../js/ui/searchDisplay.js:403 #: ../js/ui/searchDisplay.js:430
msgid "Searching..." msgid "Searching..."
msgstr "Suche läuft …" msgstr "Suche läuft …"
#: ../js/ui/searchDisplay.js:451 #: ../js/ui/searchDisplay.js:478
msgid "No results." msgid "No results."
msgstr "Keine Ergebnisse." msgstr "Keine Ergebnisse."
@@ -1394,6 +1402,7 @@ msgstr "Große Schrift"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319 #: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
#: ../js/ui/status/network.js:813
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1414,7 +1423,7 @@ msgid "Bluetooth Settings"
msgstr "Bluetooth-Einstellungen" msgstr "Bluetooth-Einstellungen"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169 #: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
msgid "hardware disabled" msgid "hardware disabled"
msgstr "Hardware deaktiviert" msgstr "Hardware deaktiviert"
@@ -1422,12 +1431,12 @@ msgstr "Hardware deaktiviert"
msgid "Connection" msgid "Connection"
msgstr "Verbindung" msgstr "Verbindung"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436 #: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
msgid "disconnecting..." msgid "disconnecting..."
msgstr "Verbindungsabbau …" msgstr "Verbindungsabbau …"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:1464 #: ../js/ui/status/network.js:1533
msgid "connecting..." msgid "connecting..."
msgstr "Verbindungsaufbau …" msgstr "Verbindungsaufbau …"
@@ -1443,7 +1452,7 @@ msgstr "Tastatureinstellungen"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Maus-Einstellungen" msgstr "Maus-Einstellungen"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Klangeinstellungen" msgstr "Klangeinstellungen"
@@ -1520,109 +1529,117 @@ msgstr "Einstellungen für Region und Sprache"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Lautstärke, Netzwerk, Batterie" msgstr "Lautstärke, Netzwerk, Batterie"
#: ../js/ui/status/network.js:95 #: ../js/ui/status/network.js:103
msgid "<unknown>" msgid "<unknown>"
msgstr "<Unbekannt>" msgstr "<Unbekannt>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:191 #: ../js/ui/status/network.js:199
msgid "disabled" msgid "disabled"
msgstr "Deaktiviert" msgstr "Deaktiviert"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:434 #: ../js/ui/status/network.js:457
msgid "unmanaged" msgid "unmanaged"
msgstr "nicht verwaltet" msgstr "nicht verwaltet"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467 #: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
msgid "authentication required" msgid "authentication required"
msgstr "Legitimierung erforderlich" msgstr "Legitimierung erforderlich"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:455 #: ../js/ui/status/network.js:478
msgid "firmware missing" msgid "firmware missing"
msgstr "Firmware fehlt" msgstr "Firmware fehlt"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:485
msgid "cable unplugged" msgid "cable unplugged"
msgstr "Kabel nicht angeschlossen" msgstr "Kabel nicht angeschlossen"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:490
msgid "unavailable" msgid "unavailable"
msgstr "nicht verfügbar" msgstr "nicht verfügbar"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469 #: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
msgid "connection failed" msgid "connection failed"
msgstr "Verbindung gescheitert" msgstr "Verbindung gescheitert"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403 #: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
#: ../js/ui/status/network.js:1545 #: ../js/ui/status/network.js:1614
msgid "More..." msgid "More..."
msgstr "Mehr …" msgstr "Mehr …"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333 #: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Verbunden (privat)" msgstr "Verbunden (privat)"
#: ../js/ui/status/network.js:641 #: ../js/ui/status/network.js:666
msgid "Wired"
msgstr "Kabelgebunden"
#: ../js/ui/status/network.js:667
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Ethernet (automatisch)" msgstr "Ethernet (automatisch)"
#: ../js/ui/status/network.js:688 #: ../js/ui/status/network.js:694
msgid "Mobile broadband"
msgstr "Mobiles Breitband"
#: ../js/ui/status/network.js:715
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Mobiles Breitband (automatisch)" msgstr "Mobiles Breitband (automatisch)"
#: ../js/ui/status/network.js:691 #: ../js/ui/status/network.js:718
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Einwählverbindung (automatisch)" msgstr "Einwählverbindung (automatisch)"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350 #: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s (automatisch)" msgstr "%s (automatisch)"
#: ../js/ui/status/network.js:822 #: ../js/ui/status/network.js:850
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth (automatisch)" msgstr "Bluetooth (automatisch)"
#: ../js/ui/status/network.js:1352 #: ../js/ui/status/network.js:1371
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Drahtlos (automatisch)" msgstr "Drahtlos (automatisch)"
#: ../js/ui/status/network.js:1595 #: ../js/ui/status/network.js:1664
msgid "Enable networking" msgid "Enable networking"
msgstr "Netzwerk aktivieren" msgstr "Netzwerk aktivieren"
#: ../js/ui/status/network.js:1627 #: ../js/ui/status/network.js:1706
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "WLAN" msgstr "WLAN"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1725
msgid "Network Settings" msgid "Network Settings"
msgstr "Netzwerkeinstellungen" msgstr "Netzwerkeinstellungen"
#: ../js/ui/status/network.js:1692 #: ../js/ui/status/network.js:1784
msgid "Network Manager" msgid "Network Manager"
msgstr "Netzwerk-Verwaltung" msgstr "Netzwerk-Verwaltung"
#: ../js/ui/status/network.js:1774 #: ../js/ui/status/network.js:1873
msgid "Connection failed" msgid "Connection failed"
msgstr "Verbindung gescheitert" msgstr "Verbindung gescheitert"
#: ../js/ui/status/network.js:1775 #: ../js/ui/status/network.js:1874
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivierung der Netzwerkverbindung ist gescheitert" msgstr "Aktivierung der Netzwerkverbindung ist gescheitert"
#: ../js/ui/status/network.js:2092 #: ../js/ui/status/network.js:2252
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Netzwerk ist deaktiviert" msgstr "Netzwerk ist deaktiviert"
@@ -1678,117 +1695,123 @@ msgctxt "percent of battery remaining"
msgid "%d%%" msgid "%d%%"
msgstr "%d%%" msgstr "%d%%"
#: ../js/ui/status/power.js:195 #: ../js/ui/status/power.js:196
msgid "AC adapter" msgid "AC adapter"
msgstr "Netzteil" msgstr "Netzteil"
#: ../js/ui/status/power.js:197 #: ../js/ui/status/power.js:198
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Laptop-Akku" msgstr "Laptop-Akku"
#: ../js/ui/status/power.js:199 #: ../js/ui/status/power.js:200
msgid "UPS" msgid "UPS"
msgstr "Notstromversorgung" msgstr "Notstromversorgung"
#: ../js/ui/status/power.js:201 #: ../js/ui/status/power.js:202
msgid "Monitor" msgid "Monitor"
msgstr "Bildschirm" msgstr "Bildschirm"
#: ../js/ui/status/power.js:203 #: ../js/ui/status/power.js:204
msgid "Mouse" msgid "Mouse"
msgstr "Maus" msgstr "Maus"
#: ../js/ui/status/power.js:207 #: ../js/ui/status/power.js:208
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:209 #: ../js/ui/status/power.js:210
msgid "Cell phone" msgid "Cell phone"
msgstr "Mobiltelefon" msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:211 #: ../js/ui/status/power.js:212
msgid "Media player" msgid "Media player"
msgstr "Medienwiedergabegerät" msgstr "Medienwiedergabegerät"
#: ../js/ui/status/power.js:213 #: ../js/ui/status/power.js:214
msgid "Tablet" msgid "Tablet"
msgstr "Tablet" msgstr "Tablet"
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:216
msgid "Computer" msgid "Computer"
msgstr "Rechner" msgstr "Rechner"
#: ../js/ui/status/power.js:217 #: ../js/ui/status/power.js:218
msgctxt "device" msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Unbekannt" msgstr "Unbekannt"
#: ../js/ui/status/volume.js:124
#, fuzzy
#| msgid "Volume"
msgid "Volume changed"
msgstr "Lautstärke"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295 #: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
msgid "Volume" msgid "Volume"
msgstr "Lautstärke" msgstr "Lautstärke"
#: ../js/ui/status/volume.js:256 #: ../js/ui/status/volume.js:259
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:201 #: ../js/ui/unlockDialog.js:203
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Als anderer Benutzer anmelden" msgstr "Als anderer Benutzer anmelden"
#: ../js/ui/unlockDialog.js:224 #: ../js/ui/unlockDialog.js:229
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Fenster entsperren" msgstr "Fenster entsperren"
#: ../js/ui/userMenu.js:177 #: ../js/ui/userMenu.js:178
msgid "Available" msgid "Available"
msgstr "Verfügbar" msgstr "Verfügbar"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Busy" msgid "Busy"
msgstr "Beschäftigt" msgstr "Beschäftigt"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Invisible" msgid "Invisible"
msgstr "Unsichtbar" msgstr "Unsichtbar"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Away" msgid "Away"
msgstr "Abwesend" msgstr "Abwesend"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Idle" msgid "Idle"
msgstr "Untätig" msgstr "Untätig"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Offline" msgid "Offline"
msgstr "Abgemeldet" msgstr "Abgemeldet"
#: ../js/ui/userMenu.js:755 #: ../js/ui/userMenu.js:757
msgid "Notifications" msgid "Notifications"
msgstr "Benachrichtigungen" msgstr "Benachrichtigungen"
#: ../js/ui/userMenu.js:763 #: ../js/ui/userMenu.js:765
msgid "Settings" msgid "Settings"
msgstr "Einstellungen" msgstr "Einstellungen"
#: ../js/ui/userMenu.js:771 #: ../js/ui/userMenu.js:773
msgid "Switch User" msgid "Switch User"
msgstr "Benutzer wechseln" msgstr "Benutzer wechseln"
#: ../js/ui/userMenu.js:776 #: ../js/ui/userMenu.js:778
msgid "Log Out" msgid "Log Out"
msgstr "Abmelden" msgstr "Abmelden"
#: ../js/ui/userMenu.js:796 #: ../js/ui/userMenu.js:798
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Aktualisierungen installieren und neustarten" msgstr "Aktualisierungen installieren und neustarten"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:816
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt" msgstr "Ihr Anwesenheitsstatus wird auf »Beschäftigt« gesetzt"
#: ../js/ui/userMenu.js:815 #: ../js/ui/userMenu.js:817
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1828,20 +1851,42 @@ msgstr "»%s« ist bereit"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Evolution-Kalender" msgstr "Evolution-Kalender"
#: ../src/main.c:332 #. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u Ausgang"
msgstr[1] "%u Ausgänge"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u Eingang"
msgstr[1] "%u Eingänge"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Systemklänge"
#: ../src/main.c:347
msgid "Print version" msgid "Print version"
msgstr "Version ausgeben" msgstr "Version ausgeben"
#: ../src/main.c:338 #: ../src/main.c:353
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Der durch GDM im Anmeldefenster verwendete Modus" msgstr "Der durch GDM im Anmeldefenster verwendete Modus"
#: ../src/main.c:344 #: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Einen spezifischen Modus nutzen, wie z.B. »gdm» für den Anmeldebildschirm" "Einen spezifischen Modus nutzen, wie z.B. »gdm» für den Anmeldebildschirm"
#: ../src/main.c:350 #: ../src/main.c:365
msgid "List possible modes" msgid "List possible modes"
msgstr "Die möglichen Modi auflisten" msgstr "Die möglichen Modi auflisten"
@@ -1870,6 +1915,12 @@ msgstr "Vorgabe"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen" msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
#~ msgid "Show full name in the user menu"
#~ msgstr "Den vollen Namen im Benutzermenü anzeigen"
#~ msgid "Whether the users full name is shown in the user menu or not."
#~ msgstr "Legt fest, ob der vollständige Name im Benutzermenü angezeigt wird."
#~ msgid "APPLICATIONS" #~ msgid "APPLICATIONS"
#~ msgstr "ANWENDUNGEN" #~ msgstr "ANWENDUNGEN"
@@ -1905,15 +1956,9 @@ msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
#~ "Das angesprochene Gerät kann nicht durchsucht werden. Der Fehler lautet " #~ "Das angesprochene Gerät kann nicht durchsucht werden. Der Fehler lautet "
#~ "»%s«" #~ "»%s«"
#~ msgid "Wired"
#~ msgstr "Kabelgebunden"
#~ msgid "Wireless" #~ msgid "Wireless"
#~ msgstr "Drahtlos" #~ msgstr "Drahtlos"
#~ msgid "Mobile broadband"
#~ msgstr "Mobiles Breitband"
#~ msgid "VPN Connections" #~ msgid "VPN Connections"
#~ msgstr "VPN-Verbindungen" #~ msgstr "VPN-Verbindungen"
@@ -1926,19 +1971,6 @@ msgstr "Der Dialog zur Legitimierung wurde vom Benutzer geschlossen"
#~ msgid "Your favorite Easter Egg" #~ msgid "Your favorite Easter Egg"
#~ msgstr "Ihr Lieblings-Osterei" #~ msgstr "Ihr Lieblings-Osterei"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u Ausgang"
#~ msgstr[1] "%u Ausgänge"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u Eingang"
#~ msgstr[1] "%u Eingänge"
#~ msgid "System Sounds"
#~ msgstr "Systemklänge"
#~ msgid "Switch Session" #~ msgid "Switch Session"
#~ msgstr "Sitzung wechseln" #~ msgstr "Sitzung wechseln"

383
po/es.po
View File

@@ -3,15 +3,15 @@
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011. # Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011. # Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012. # Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012, 2013.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-12-19 14:51+0000\n" "POT-Creation-Date: 2013-01-22 15:41+0000\n"
"PO-Revision-Date: 2012-12-26 11:38+0100\n" "PO-Revision-Date: 2013-01-24 16:32+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \n"
@@ -164,22 +164,13 @@ msgstr ""
"sesión» en situaciones de un único usuario o de una única sesión." "sesión» en situaciones de un único usuario o de una única sesión."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show full name in the user menu"
msgstr "Mostrar el nombre completo en el menú del usuario"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr ""
"Indica si se muestra el nombre del usuario en el menú del usuario o no."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Indica si se debe recordar la contraseña para montar sistemas de archivos " "Indica si se debe recordar la contraseña para montar sistemas de archivos "
"remotos o cifrados" "remotos o cifrados"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "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 " "filesystem is mounted. If the password can be saved for future use a "
@@ -191,72 +182,70 @@ msgstr ""
"en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave " "en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave "
"establece el valor predeterminado de la casilla." "establece el valor predeterminado de la casilla."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Mostrar la fecha de la semana en el calendario" msgstr "Mostrar la fecha de la semana en el calendario"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Si es cierta, muestra la fecha de semana ISO en el calendario." msgstr "Si es cierta, muestra la fecha de semana ISO en el calendario."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Asociación de teclas para abrir el menú de la aplicación" msgstr "Asociación de teclas para abrir el menú de la aplicación"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Asociación de teclas para abrir el menú de la aplicación." msgstr "Asociación de teclas para abrir el menú de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»" msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "" msgstr ""
"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista " "Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista "
"de actividades." "de actividades."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes" msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes." msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Asociación de teclas para dar el foco a la notificación activa" msgstr "Asociación de teclas para dar el foco a la notificación activa"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
#| msgid "Keybinding to open the application menu."
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Asociación de teclas para dar el foco a la notificación activa." msgstr "Asociación de teclas para dar el foco a la notificación activa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Asociación de teclas cambiar el grabador de pantalla" msgstr "Asociación de teclas cambiar el grabador de pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla." msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Qué teclado usar" msgstr "Qué teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "El tipo de teclado que usar." msgstr "El tipo de teclado que usar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Tasa de fotogramas usada para grabar «screencast»." msgstr "Tasa de fotogramas usada para grabar «screencast»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@@ -264,11 +253,11 @@ msgstr ""
"La tasa de fotogramas de la grabación resultante grabada por el grabador de " "La tasa de fotogramas de la grabación resultante grabada por el grabador de "
"«screencast» de GNOME Shell, en fotogramas por segundo." "«screencast» de GNOME Shell, en fotogramas por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La tubería de gstreamer usada para codificar el «screencast»" msgstr "La tubería de gstreamer usada para codificar el «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -294,11 +283,11 @@ msgstr ""
"threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T " "threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
"como marcador de posición para el número de hilos óptimos en el sistema." "como marcador de posición para el número de hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Extensión de archivo que usar para almacenar los «screencast»" msgstr "Extensión de archivo que usar para almacenar los «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@@ -308,11 +297,11 @@ msgstr ""
"basado en la fecha actual y usará esta extensión. Se debería cambiar al " "basado en la fecha actual y usará esta extensión. Se debería cambiar al "
"grabar en otro formato contenedor diferente." "grabar en otro formato contenedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "The application icon mode." msgid "The application icon mode."
msgstr "El modo de icono de la aplicación." msgstr "El modo de icono de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -322,21 +311,21 @@ msgstr ""
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-" "son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
"only» (sólo muestra el icono de la aplicación) «both»." "only» (sólo muestra el icono de la aplicación) «both»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Acoplar un diálogo modal a la ventana padre" msgstr "Acoplar un diálogo modal a la ventana padre"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Esta clave sobreescribe la clave en org.gnome.mutter al ejecutar GNOME Shell." "Esta clave sobreescribe la clave en org.gnome.mutter al ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "Orden de los botones en la barra de título" msgstr "Orden de los botones en la barra de título"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
@@ -344,17 +333,17 @@ msgstr ""
"Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al " "Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al "
"ejecutar GNOME Shell." "ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la " "Activar el mosaico en los bordes al arrastrar ventanas a los bordes de la "
"ventana" "ventana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Las áreas de trabajo se gestionan dinámicamente" msgstr "Las áreas de trabajo se gestionan dinámicamente"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Áreas de trabajo solo en la pantalla principal" msgstr "Áreas de trabajo solo en la pantalla principal"
@@ -372,11 +361,11 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Seleccione una extensión que configurar usando la caja combinada de arriba." "Seleccione una extensión que configurar usando la caja combinada de arriba."
#: ../js/gdm/loginDialog.js:565 #: ../js/gdm/loginDialog.js:566
msgid "Session..." msgid "Session..."
msgstr "Sesión…" msgstr "Sesión…"
#: ../js/gdm/loginDialog.js:722 #: ../js/gdm/loginDialog.js:723
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
@@ -384,35 +373,35 @@ msgstr "Iniciar sesión"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:787
msgid "Not listed?" msgid "Not listed?"
msgstr "¿No está en la lista?" msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:962 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178 #: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1086 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Nombre de usuario:" msgstr "Nombre de usuario:"
#: ../js/gdm/loginDialog.js:1382 #: ../js/gdm/loginDialog.js:1383
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
@@ -421,8 +410,8 @@ msgstr "Ventana de inicio de sesión"
msgid "Power" msgid "Power"
msgstr "Energía" msgstr "Energía"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
#: ../js/ui/userMenu.js:790 #: ../js/ui/userMenu.js:792
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@@ -430,8 +419,8 @@ msgstr "Suspender"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
@@ -638,6 +627,14 @@ msgstr "Esta semana"
msgid "Next week" msgid "Next week"
msgstr "La semana que viene" msgstr "La semana que viene"
#: ../js/ui/components/automountManager.js:92
msgid "External drive connected"
msgstr "Dispositivo externo conectado"
#: ../js/ui/components/automountManager.js:103
msgid "External drive disconnected"
msgstr "Dispositivo externo desconectado"
#: ../js/ui/components/autorunManager.js:295 #: ../js/ui/components/autorunManager.js:295
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Dispositivos extraíbles" msgstr "Dispositivos extraíbles"
@@ -651,11 +648,11 @@ msgstr "Abrir con %s"
msgid "Eject" msgid "Eject"
msgstr "Expulsar" msgstr "Expulsar"
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260 #: ../js/ui/components/keyring.js:82 ../js/ui/components/polkitAgent.js:268
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
#: ../js/ui/components/keyring.js:105 #: ../js/ui/components/keyring.js:101
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de nuevo:" msgstr "Escriba de nuevo:"
@@ -743,7 +740,7 @@ msgstr "Se necesita autenticación"
msgid "Administrator" msgid "Administrator"
msgstr "Administrador" msgstr "Administrador"
#: ../js/ui/components/polkitAgent.js:166 #: ../js/ui/components/polkitAgent.js:165
msgid "Authenticate" msgid "Authenticate"
msgstr "Autenticar" msgstr "Autenticar"
@@ -751,7 +748,7 @@ msgstr "Autenticar"
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. #. * for instance.
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:256 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Inténtelo de nuevo," msgstr "Inténtelo de nuevo,"
@@ -999,11 +996,11 @@ msgstr "No se pudo conectar a %s"
msgid "View account" msgid "View account"
msgstr "Ver cuenta" msgstr "Ver cuenta"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1383
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón desconocida" msgstr "Razón desconocida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:82
msgid "Windows" msgid "Windows"
msgstr "Ventanas" msgstr "Ventanas"
@@ -1011,18 +1008,22 @@ msgstr "Ventanas"
msgid "Show Applications" msgid "Show Applications"
msgstr "Mostrar aplicaciones" msgstr "Mostrar aplicaciones"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir calendario" msgstr "Abrir calendario"
#: ../js/ui/dateMenu.js:96
msgid "Open Clocks"
msgstr "Abrir Relojes"
#: ../js/ui/dateMenu.js:105
msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:201 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y" msgstr "%A, %e de %B de %Y"
@@ -1126,78 +1127,80 @@ msgstr "Instalar"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?" msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: ../js/ui/keyboard.js:308 #: ../js/ui/keyboard.js:291
msgid "tray" msgid "tray"
msgstr "bandeja" msgstr "bandeja"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309 #: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:206
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
#: ../js/ui/lookingGlass.js:691 #: ../js/ui/lookingGlass.js:692
msgid "No extensions installed" msgid "No extensions installed"
msgstr "No hay extensiones instaladas" msgstr "No hay extensiones instaladas"
#. Translators: argument is an extension UUID. #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:745 #: ../js/ui/lookingGlass.js:746
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s no ha generado ningún error." msgstr "%s no ha generado ningún error."
#: ../js/ui/lookingGlass.js:751 #: ../js/ui/lookingGlass.js:752
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Ocultar errores" msgstr "Ocultar errores"
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815 #: ../js/ui/lookingGlass.js:756 ../js/ui/lookingGlass.js:816
msgid "Show Errors" msgid "Show Errors"
msgstr "Mostrar errores" msgstr "Mostrar errores"
#: ../js/ui/lookingGlass.js:764 #: ../js/ui/lookingGlass.js:765
msgid "Enabled" msgid "Enabled"
msgstr "Activado" msgstr "Activado"
#: ../js/ui/lookingGlass.js:767 #. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Desactivado" msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:769 #: ../js/ui/lookingGlass.js:770
msgid "Error" msgid "Error"
msgstr "Error" msgstr "Error"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:772
msgid "Out of date" msgid "Out of date"
msgstr "Caducado" msgstr "Caducado"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:774
msgid "Downloading" msgid "Downloading"
msgstr "Descargando" msgstr "Descargando"
#: ../js/ui/lookingGlass.js:797 #: ../js/ui/lookingGlass.js:798
msgid "View Source" msgid "View Source"
msgstr "Ver fuente" msgstr "Ver fuente"
#: ../js/ui/lookingGlass.js:806 #: ../js/ui/lookingGlass.js:807
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1118
msgid "Open" msgid "Open"
msgstr "Abrir" msgstr "Abrir"
#: ../js/ui/messageTray.js:1095 #: ../js/ui/messageTray.js:1125
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
#: ../js/ui/messageTray.js:1552 #: ../js/ui/messageTray.js:1581
msgid "No Messages" msgid "No Messages"
msgstr "No hay mensajes" msgstr "No hay mensajes"
#: ../js/ui/messageTray.js:1570 #: ../js/ui/messageTray.js:1599
msgid "Message Tray" msgid "Message Tray"
msgstr "Bandeja de mensajes" msgstr "Bandeja de mensajes"
#: ../js/ui/messageTray.js:2639 #: ../js/ui/messageTray.js:2672
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@@ -1228,17 +1231,17 @@ msgstr "Teclear para buscar…"
msgid "Dash" msgid "Dash"
msgstr "Tablero" msgstr "Tablero"
#: ../js/ui/panel.js:608 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:637 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: ../js/ui/panel.js:980 #: ../js/ui/panel.js:976
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@@ -1247,7 +1250,7 @@ msgstr "Barra superior"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:711 #: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@@ -1261,25 +1264,25 @@ msgstr "Cerrar"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:112 #: ../js/ui/screenShield.js:113
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:176 #: ../js/ui/screenShield.js:177
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d mensaje nuevo" msgstr[0] "%d mensaje nuevo"
msgstr[1] "%d mensajes nuevos" msgstr[1] "%d mensajes nuevos"
#: ../js/ui/screenShield.js:178 #: ../js/ui/screenShield.js:179
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d notificación nueva" msgstr[0] "%d notificación nueva"
msgstr[1] "%d notificaciones nuevas" msgstr[1] "%d notificaciones nuevas"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
@@ -1370,6 +1373,7 @@ msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319 #: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
#: ../js/ui/status/network.js:813
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1390,7 +1394,7 @@ msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth" msgstr "Configuración de Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169 #: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
msgid "hardware disabled" msgid "hardware disabled"
msgstr "hardware desactivado" msgstr "hardware desactivado"
@@ -1398,12 +1402,12 @@ msgstr "hardware desactivado"
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436 #: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
msgid "disconnecting..." msgid "disconnecting..."
msgstr "deconectando…" msgstr "deconectando…"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:1464 #: ../js/ui/status/network.js:1533
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
@@ -1419,7 +1423,7 @@ msgstr "Configuración del teclado"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Ajustes del ratón…" msgstr "Ajustes del ratón…"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Configuración del sonido" msgstr "Configuración del sonido"
@@ -1491,113 +1495,121 @@ msgstr "Mostrar la distribución del teclado"
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "Configuración de región e idioma" msgstr "Configuración de región e idioma"
#: ../js/ui/status/lockScreenMenu.js:18 #: ../js/ui/status/lockScreenMenu.js:43
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Volumen, red, batería" msgstr "Volumen, red, batería"
#: ../js/ui/status/network.js:95 #: ../js/ui/status/network.js:103
msgid "<unknown>" msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:191 #: ../js/ui/status/network.js:199
msgid "disabled" msgid "disabled"
msgstr "desactivada" msgstr "desactivada"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:434 #: ../js/ui/status/network.js:457
msgid "unmanaged" msgid "unmanaged"
msgstr "no gestionada" msgstr "no gestionada"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467 #: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:455 #: ../js/ui/status/network.js:478
msgid "firmware missing" msgid "firmware missing"
msgstr "falta el «firmware»" msgstr "falta el «firmware»"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:485
msgid "cable unplugged" msgid "cable unplugged"
msgstr "cable desconectado" msgstr "cable desconectado"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:490
msgid "unavailable" msgid "unavailable"
msgstr "no disponible" msgstr "no disponible"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469 #: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403 #: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
#: ../js/ui/status/network.js:1545 #: ../js/ui/status/network.js:1614
msgid "More..." msgid "More..."
msgstr "Más…" msgstr "Más…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333 #: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Conectada (privada)" msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:641 #: ../js/ui/status/network.js:666
msgid "Wired"
msgstr "Cableada"
#: ../js/ui/status/network.js:667
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Ethernet automática" msgstr "Ethernet automática"
#: ../js/ui/status/network.js:688 #: ../js/ui/status/network.js:694
msgid "Mobile broadband"
msgstr "Banda ancha móvil"
#: ../js/ui/status/network.js:715
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Banda ancha automática" msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:691 #: ../js/ui/status/network.js:718
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Marcado automático" msgstr "Marcado automático"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350 #: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s automática" msgstr "%s automática"
#: ../js/ui/status/network.js:822 #: ../js/ui/status/network.js:850
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth automático" msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1352 #: ../js/ui/status/network.js:1371
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Inalámbrica automática" msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1595 #: ../js/ui/status/network.js:1664
msgid "Enable networking" msgid "Enable networking"
msgstr "Activar red" msgstr "Activar red"
#: ../js/ui/status/network.js:1627 #: ../js/ui/status/network.js:1706
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1725
msgid "Network Settings" msgid "Network Settings"
msgstr "Configuración de la red" msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1692 #: ../js/ui/status/network.js:1784
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: ../js/ui/status/network.js:1774 #: ../js/ui/status/network.js:1873
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1775 #: ../js/ui/status/network.js:1874
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red" msgstr "Falló la activación de la conexión de red"
#: ../js/ui/status/network.js:2092 #: ../js/ui/status/network.js:2252
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "La red está desactivada" msgstr "La red está desactivada"
@@ -1653,117 +1665,122 @@ msgctxt "percent of battery remaining"
msgid "%d%%" msgid "%d%%"
msgstr "%d%%" msgstr "%d%%"
#: ../js/ui/status/power.js:195 #: ../js/ui/status/power.js:196
msgid "AC adapter" msgid "AC adapter"
msgstr "Adaptador de corriente" msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:197 #: ../js/ui/status/power.js:198
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Batería del portátil" msgstr "Batería del portátil"
#: ../js/ui/status/power.js:199 #: ../js/ui/status/power.js:200
msgid "UPS" msgid "UPS"
msgstr "SAI" msgstr "SAI"
#: ../js/ui/status/power.js:201 #: ../js/ui/status/power.js:202
msgid "Monitor" msgid "Monitor"
msgstr "Monitor" msgstr "Monitor"
#: ../js/ui/status/power.js:203 #: ../js/ui/status/power.js:204
msgid "Mouse" msgid "Mouse"
msgstr "Ratón" msgstr "Ratón"
#: ../js/ui/status/power.js:207 #: ../js/ui/status/power.js:208
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:209 #: ../js/ui/status/power.js:210
msgid "Cell phone" msgid "Cell phone"
msgstr "Teléfono móvil" msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:211 #: ../js/ui/status/power.js:212
msgid "Media player" msgid "Media player"
msgstr "Reproductor multimedia" msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:213 #: ../js/ui/status/power.js:214
msgid "Tablet" msgid "Tablet"
msgstr "Tableta" msgstr "Tableta"
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:216
msgid "Computer" msgid "Computer"
msgstr "Equipo" msgstr "Equipo"
#: ../js/ui/status/power.js:217 #: ../js/ui/status/power.js:218
msgctxt "device" msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: ../js/ui/status/volume.js:124
#| msgid "Volume"
msgid "Volume changed"
msgstr "Volumen modificado"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251 #: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
#: ../js/ui/status/volume.js:62 #: ../js/ui/status/volume.js:259
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:201 #: ../js/ui/unlockDialog.js:203
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario" msgstr "Iniciar sesión como otro usuario"
#: ../js/ui/unlockDialog.js:224 #: ../js/ui/unlockDialog.js:229
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloquear ventana" msgstr "Desbloquear ventana"
#: ../js/ui/userMenu.js:177 #: ../js/ui/userMenu.js:178
msgid "Available" msgid "Available"
msgstr "Disponible" msgstr "Disponible"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Busy" msgid "Busy"
msgstr "Ocupado" msgstr "Ocupado"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Invisible" msgid "Invisible"
msgstr "Invisible" msgstr "Invisible"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Away" msgid "Away"
msgstr "Ausente" msgstr "Ausente"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Idle" msgid "Idle"
msgstr "Inactivo" msgstr "Inactivo"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Offline" msgid "Offline"
msgstr "Desconectado" msgstr "Desconectado"
#: ../js/ui/userMenu.js:755 #: ../js/ui/userMenu.js:757
msgid "Notifications" msgid "Notifications"
msgstr "Notificaciones" msgstr "Notificaciones"
#: ../js/ui/userMenu.js:763 #: ../js/ui/userMenu.js:765
msgid "Settings" msgid "Settings"
msgstr "Configuración" msgstr "Configuración"
#: ../js/ui/userMenu.js:771 #: ../js/ui/userMenu.js:773
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:776 #: ../js/ui/userMenu.js:778
msgid "Log Out" msgid "Log Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:796 #: ../js/ui/userMenu.js:798
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instalar actualizaciones y reiniciar" msgstr "Instalar actualizaciones y reiniciar"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:816
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»" msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:815 #: ../js/ui/userMenu.js:817
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1772,11 +1789,11 @@ msgstr ""
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no " "chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
"leer sus mensajes." "leer sus mensajes."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:86
msgid "Applications" msgid "Applications"
msgstr "Aplicaciones" msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:90
msgid "Search" msgid "Search"
msgstr "Buscar" msgstr "Buscar"
@@ -1803,21 +1820,43 @@ msgstr "«%s» está preparado"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Calendario de Evolution" msgstr "Calendario de Evolution"
#: ../src/main.c:332 #. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u salida"
msgstr[1] "%u salidas"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u entrada"
msgstr[1] "%u entradas"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Sonidos del sistema"
#: ../src/main.c:347
msgid "Print version" msgid "Print version"
msgstr "Imprimir versión" msgstr "Imprimir versión"
#: ../src/main.c:338 #: ../src/main.c:353
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para la pantalla de inicio" msgstr "Modo usado por GDM para la pantalla de inicio"
#: ../src/main.c:344 #: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de " "Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
"sesión" "sesión"
#: ../src/main.c:350 #: ../src/main.c:365
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar los modos posibles" msgstr "Listar los modos posibles"
@@ -1846,6 +1885,13 @@ msgstr "Predeterminada"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "El usuario rechazó el diálogo de autenticación" msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "Show full name in the user menu"
#~ msgstr "Mostrar el nombre completo en el menú del usuario"
#~ msgid "Whether the users full name is shown in the user menu or not."
#~ msgstr ""
#~ "Indica si se muestra el nombre del usuario en el menú del usuario o no."
#~ msgid "APPLICATIONS" #~ msgid "APPLICATIONS"
#~ msgstr "APLICACIONES" #~ msgstr "APLICACIONES"
@@ -1882,15 +1928,9 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "The requested device cannot be browsed, error is '%s'" #~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»" #~ msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»"
#~ msgid "Wired"
#~ msgstr "Cableada"
#~ msgid "Wireless" #~ msgid "Wireless"
#~ msgstr "Inalámbrica" #~ msgstr "Inalámbrica"
#~ msgid "Mobile broadband"
#~ msgstr "Banda ancha móvil"
#~ msgid "VPN Connections" #~ msgid "VPN Connections"
#~ msgstr "Conexiones VPN" #~ msgstr "Conexiones VPN"
@@ -1900,19 +1940,6 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "System Settings" #~ msgid "System Settings"
#~ msgstr "Configuración del sistema" #~ msgstr "Configuración del sistema"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u salida"
#~ msgstr[1] "%u salidas"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u entrada"
#~ msgstr[1] "%u entradas"
#~ msgid "System Sounds"
#~ msgstr "Sonidos del sistema"
#~ msgid "Switch Session" #~ msgid "Switch Session"
#~ msgstr "Cambiar de sesión" #~ msgstr "Cambiar de sesión"

2097
po/eu.po

File diff suppressed because it is too large Load Diff

1874
po/fur.po Normal file

File diff suppressed because it is too large Load Diff

563
po/he.po

File diff suppressed because it is too large Load Diff

886
po/it.po

File diff suppressed because it is too large Load Diff

309
po/nb.po
View File

@@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.7.x\n" "Project-Id-Version: gnome-shell 3.7.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-01-14 11:20+0100\n" "POT-Creation-Date: 2013-01-29 18:29+0100\n"
"PO-Revision-Date: 2013-01-14 11:21+0100\n" "PO-Revision-Date: 2013-01-29 18:29+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n" "Language: \n"
@@ -150,19 +150,11 @@ msgid ""
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show full name in the user menu"
msgstr "Vis fullt navn i brukermenyen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "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 " "filesystem is mounted. If the password can be saved for future use a "
@@ -170,69 +162,69 @@ msgid ""
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Vis dato for uken i kalender" msgstr "Vis dato for uken i kalender"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Viser ISO-ukedato i kalenderen hvis «true»." msgstr "Viser ISO-ukedato i kalenderen hvis «true»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Tastaturbinding som åpner programmenyen" msgstr "Tastaturbinding som åpner programmenyen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Tastaturbinding som åpner programmenyen." msgstr "Tastaturbinding som åpner programmenyen."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Tastaturbinding som åpner visningen «Vis programmer»" msgstr "Tastaturbinding som åpner visningen «Vis programmer»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "" msgstr ""
"Tastaturbinding som åpner visningen «Vis programmer» i aktivitetsoversikten." "Tastaturbinding som åpner visningen «Vis programmer» i aktivitetsoversikten."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrau" msgstr "Tastaturbinding som slår av/på synlighet for meldingstrau"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Tastaturbinding som slår av/på synlighet for meldingstrauet." msgstr "Tastaturbinding som slår av/på synlighet for meldingstrauet."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Tastaturbinding som fokuserer aktiv varsling" msgstr "Tastaturbinding som fokuserer aktiv varsling"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Tastaturbinding som fokuserer aktiv varsling." msgstr "Tastaturbinding som fokuserer aktiv varsling."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tastaturbinding som slår av/på skjermopptak" msgstr "Tastaturbinding som slår av/på skjermopptak"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Tastaturbinding som starter/stopper innebygget opptak av skjerm." msgstr "Tastaturbinding som starter/stopper innebygget opptak av skjerm."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Tastatur som skal brukes" msgstr "Tastatur som skal brukes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Type tastatur som skal brukes." msgstr "Type tastatur som skal brukes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer." msgstr "Bildefrekvens i bruk ved lagring av skjermvideoer."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@@ -240,11 +232,11 @@ msgstr ""
"Bildefrekvensen i den ferdige skjermvideoen tatt opp med GNOME Shells " "Bildefrekvensen i den ferdige skjermvideoen tatt opp med GNOME Shells "
"skjermvideoopptaker i bilder per sekund." "skjermvideoopptaker i bilder per sekund."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer-kommandokø brukt til å kode skjermvideoen" msgstr "Gstreamer-kommandokø brukt til å kode skjermvideoen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#, fuzzy, no-c-format #, fuzzy, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -261,11 +253,11 @@ msgstr ""
"Setter GStreamer-rør som brukes til å kode opptak. Den følger syntaksen som " "Setter GStreamer-rør som brukes til å kode opptak. Den følger syntaksen som "
"brukes for gst-launch. Røret må ha en..." "brukes for gst-launch. Røret må ha en..."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Filendelse i bruk ved lagring av skjermvideo" msgstr "Filendelse i bruk ved lagring av skjermvideo"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@@ -275,45 +267,45 @@ msgstr ""
"og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt " "og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt "
"oppbevaringsformat." "oppbevaringsformat."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Ikonmodus for programmet." msgstr "Ikonmodus for programmet."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'." "only' (shows only the application icon) or 'both'."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "" msgstr "Fest modal dialog til opphavsvinduet"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "" msgstr "Plassering av knappene på tittellinjen"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Arbeidsområder håndteres dynamisk" msgstr "Arbeidsområder håndteres dynamisk"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Arbeidsområder vises kun på hovedskjerm" msgstr "Arbeidsområder vises kun på hovedskjerm"
@@ -330,11 +322,11 @@ msgstr "Utvidelse"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Velg en utvidelse som skal konfigureres med komboboksen over." msgstr "Velg en utvidelse som skal konfigureres med komboboksen over."
#: ../js/gdm/loginDialog.js:566 #: ../js/gdm/loginDialog.js:569
msgid "Session..." msgid "Session..."
msgstr "Økt …" msgstr "Økt …"
#: ../js/gdm/loginDialog.js:723 #: ../js/gdm/loginDialog.js:726
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
@@ -342,35 +334,35 @@ msgstr "Logg inn"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:787 #: ../js/gdm/loginDialog.js:790
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:967 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178 #: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:979 #: ../js/gdm/loginDialog.js:983
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:979 #: ../js/gdm/loginDialog.js:983
msgid "Next" msgid "Next"
msgstr "Neste" msgstr "Neste"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Brukernavn: " msgstr "Brukernavn: "
#: ../js/gdm/loginDialog.js:1383 #: ../js/gdm/loginDialog.js:1387
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
@@ -379,8 +371,8 @@ msgstr "Innloggingsvindu"
msgid "Power" msgid "Power"
msgstr "Strøm" msgstr "Strøm"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
#: ../js/ui/userMenu.js:790 #: ../js/ui/userMenu.js:792
msgid "Suspend" msgid "Suspend"
msgstr "Hvilemodus" msgstr "Hvilemodus"
@@ -388,8 +380,8 @@ msgstr "Hvilemodus"
msgid "Restart" msgid "Restart"
msgstr "Start på nytt" msgstr "Start på nytt"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
msgid "Power Off" msgid "Power Off"
msgstr "Slå av" msgstr "Slå av"
@@ -424,19 +416,19 @@ msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:" msgstr "Kjøring av «%s» feilet:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258 #: ../js/ui/appDisplay.js:259
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: ../js/ui/appDisplay.js:666 #: ../js/ui/appDisplay.js:667
msgid "New Window" msgid "New Window"
msgstr "Nytt vindu" msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:670 ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Fjern fra favoritter" msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:670 #: ../js/ui/appDisplay.js:671
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Legg til i favoritter" msgstr "Legg til i favoritter"
@@ -596,6 +588,14 @@ msgstr "Denne uken"
msgid "Next week" msgid "Next week"
msgstr "Neste uke" msgstr "Neste uke"
#: ../js/ui/components/automountManager.js:92
msgid "External drive connected"
msgstr "Ekstern stasjon koblet til"
#: ../js/ui/components/automountManager.js:103
msgid "External drive disconnected"
msgstr "Ekstern stasjon koblet fra"
#: ../js/ui/components/autorunManager.js:295 #: ../js/ui/components/autorunManager.js:295
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Avtagbare enheter" msgstr "Avtagbare enheter"
@@ -761,15 +761,15 @@ msgstr "<b>%A</b>, <b>%H.%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30" #. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:942 #: ../js/ui/components/telepathyClient.js:942
#, fuzzy, no-c-format #, no-c-format
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>" msgstr "<b>%d</b>, <b>%B</b>, <b>%H.%M</b>"
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30" #. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
#: ../js/ui/components/telepathyClient.js:946 #: ../js/ui/components/telepathyClient.js:946
#, fuzzy, no-c-format #, no-c-format
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> " msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
msgstr "<b>%H.%M</b>, <b>%A</b>, <b>%B</b> <b>%d</b>" msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H.%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
@@ -966,18 +966,22 @@ msgstr "Vinduer"
msgid "Show Applications" msgid "Show Applications"
msgstr "Vis programmer" msgstr "Vis programmer"
#: ../js/ui/dateMenu.js:87 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:112
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Åpne kalender" msgstr "Åpne kalender"
#: ../js/ui/dateMenu.js:96
msgid "Open Clocks"
msgstr "Åpne Klokker"
#: ../js/ui/dateMenu.js:105
msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:191 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@@ -1082,12 +1086,12 @@ msgstr "Installer"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Last ned og installer «%s» fra extensions.gnome.org?" msgstr "Last ned og installer «%s» fra extensions.gnome.org?"
#: ../js/ui/keyboard.js:291 #: ../js/ui/keyboard.js:289
msgid "tray" msgid "tray"
msgstr "varslingsområde" msgstr "varslingsområde"
#: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309 #: ../js/ui/keyboard.js:634 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:206 #: ../js/ui/status/power.js:211
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatur" msgstr "Tastatur"
@@ -1139,23 +1143,23 @@ msgstr "Vis kildekode"
msgid "Web Page" msgid "Web Page"
msgstr "Nettside" msgstr "Nettside"
#: ../js/ui/messageTray.js:1090 #: ../js/ui/messageTray.js:1118
msgid "Open" msgid "Open"
msgstr "Åpne" msgstr "Åpne"
#: ../js/ui/messageTray.js:1097 #: ../js/ui/messageTray.js:1125
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
#: ../js/ui/messageTray.js:1554 #: ../js/ui/messageTray.js:1581
msgid "No Messages" msgid "No Messages"
msgstr "Ingen meldinger" msgstr "Ingen meldinger"
#: ../js/ui/messageTray.js:1572 #: ../js/ui/messageTray.js:1599
msgid "Message Tray" msgid "Message Tray"
msgstr "Meldingstrau" msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2641 #: ../js/ui/messageTray.js:2685
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
@@ -1237,15 +1241,15 @@ msgid_plural "%d new notifications"
msgstr[0] "%d ny varsling" msgstr[0] "%d ny varsling"
msgstr[1] "%d nye varslinger" msgstr[1] "%d nye varslinger"
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
msgid "Lock" msgid "Lock"
msgstr "Lås" msgstr "Lås"
#: ../js/ui/searchDisplay.js:403 #: ../js/ui/searchDisplay.js:430
msgid "Searching..." msgid "Searching..."
msgstr "Søker …" msgstr "Søker …"
#: ../js/ui/searchDisplay.js:451 #: ../js/ui/searchDisplay.js:478
msgid "No results." msgid "No results."
msgstr "Ingen resultater." msgstr "Ingen resultater."
@@ -1328,6 +1332,7 @@ msgstr "Stor tekst"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319 #: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
#: ../js/ui/status/network.js:813
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1348,7 +1353,7 @@ msgid "Bluetooth Settings"
msgstr "Innstillinger for Bluetooth" msgstr "Innstillinger for Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169 #: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
msgid "hardware disabled" msgid "hardware disabled"
msgstr "maskinvare slått av" msgstr "maskinvare slått av"
@@ -1356,12 +1361,12 @@ msgstr "maskinvare slått av"
msgid "Connection" msgid "Connection"
msgstr "Tilkobling" msgstr "Tilkobling"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436 #: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
msgid "disconnecting..." msgid "disconnecting..."
msgstr "kobler fra …" msgstr "kobler fra …"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:1464 #: ../js/ui/status/network.js:1533
msgid "connecting..." msgid "connecting..."
msgstr "kobler til …" msgstr "kobler til …"
@@ -1377,7 +1382,7 @@ msgstr "Innstillinger for tastatur"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Innstillinger for mus" msgstr "Innstillinger for mus"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Innstillinger for lyd" msgstr "Innstillinger for lyd"
@@ -1453,109 +1458,117 @@ msgstr "Innstillinger for region og språk"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Volum, nettverk, batteri" msgstr "Volum, nettverk, batteri"
#: ../js/ui/status/network.js:95 #: ../js/ui/status/network.js:103
msgid "<unknown>" msgid "<unknown>"
msgstr "<ukjent>" msgstr "<ukjent>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:191 #: ../js/ui/status/network.js:199
msgid "disabled" msgid "disabled"
msgstr "slått av" msgstr "slått av"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:434 #: ../js/ui/status/network.js:457
msgid "unmanaged" msgid "unmanaged"
msgstr "ikke håndtert" msgstr "ikke håndtert"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467 #: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
msgid "authentication required" msgid "authentication required"
msgstr "autentisering kreves" msgstr "autentisering kreves"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:455 #: ../js/ui/status/network.js:478
msgid "firmware missing" msgid "firmware missing"
msgstr "fastvare mangler" msgstr "fastvare mangler"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:485
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel koblet fra" msgstr "kabel koblet fra"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:490
msgid "unavailable" msgid "unavailable"
msgstr "ikke tilgjengelig" msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469 #: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
msgid "connection failed" msgid "connection failed"
msgstr "tilkobling feilet" msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403 #: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
#: ../js/ui/status/network.js:1545 #: ../js/ui/status/network.js:1614
msgid "More..." msgid "More..."
msgstr "Mer …" msgstr "Mer …"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333 #: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Tilkoblet (privat)" msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:641 #: ../js/ui/status/network.js:666
msgid "Wired"
msgstr "Kablet"
#: ../js/ui/status/network.js:667
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Automatisk Ethernet" msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:688 #: ../js/ui/status/network.js:694
msgid "Mobile broadband"
msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:715
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Automatisk bredbånd" msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:691 #: ../js/ui/status/network.js:718
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Automatisk oppringt" msgstr "Automatisk oppringt"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350 #: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Automatisk %s" msgstr "Automatisk %s"
#: ../js/ui/status/network.js:822 #: ../js/ui/status/network.js:850
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth" msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1352 #: ../js/ui/status/network.js:1371
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Automatisk trådløst" msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1595 #: ../js/ui/status/network.js:1664
msgid "Enable networking" msgid "Enable networking"
msgstr "Slå på nettverk" msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1627 #: ../js/ui/status/network.js:1706
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1725
msgid "Network Settings" msgid "Network Settings"
msgstr "Innstillinger for nettverk" msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1692 #: ../js/ui/status/network.js:1784
msgid "Network Manager" msgid "Network Manager"
msgstr "Nettverkshåndtering" msgstr "Nettverkshåndtering"
#: ../js/ui/status/network.js:1774 #: ../js/ui/status/network.js:1873
msgid "Connection failed" msgid "Connection failed"
msgstr "Tilkobling feilet" msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1775 #: ../js/ui/status/network.js:1874
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivering av nettverkstilkobling feilet" msgstr "Aktivering av nettverkstilkobling feilet"
#: ../js/ui/status/network.js:2092 #: ../js/ui/status/network.js:2252
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"
@@ -1563,17 +1576,17 @@ msgstr "Nettverk er slått av"
msgid "Battery" msgid "Battery"
msgstr "Batteri" msgstr "Batteri"
#: ../js/ui/status/power.js:72 #: ../js/ui/status/power.js:81
msgid "Power Settings" msgid "Power Settings"
msgstr "Innstillinger for strøm" msgstr "Innstillinger for strøm"
#. 0 is reported when UPower does not have enough data #. 0 is reported when UPower does not have enough data
#. to estimate battery life #. to estimate battery life
#: ../js/ui/status/power.js:94 #: ../js/ui/status/power.js:99
msgid "Estimating..." msgid "Estimating..."
msgstr "Estimerer …" msgstr "Estimerer …"
#: ../js/ui/status/power.js:101 #: ../js/ui/status/power.js:106
#, c-format #, c-format
msgid "%d hour remaining" msgid "%d hour remaining"
msgid_plural "%d hours remaining" msgid_plural "%d hours remaining"
@@ -1581,87 +1594,91 @@ msgstr[0] "%d time gjenstår"
msgstr[1] "%d timer gjenstår" msgstr[1] "%d timer gjenstår"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" #. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:104 #: ../js/ui/status/power.js:109
#, c-format #, c-format
msgid "%d %s %d %s remaining" msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s gjenstår" msgstr "%d %s %d %s gjenstår"
#: ../js/ui/status/power.js:106 #: ../js/ui/status/power.js:111
msgid "hour" msgid "hour"
msgid_plural "hours" msgid_plural "hours"
msgstr[0] "time" msgstr[0] "time"
msgstr[1] "timer" msgstr[1] "timer"
#: ../js/ui/status/power.js:106 #: ../js/ui/status/power.js:111
msgid "minute" msgid "minute"
msgid_plural "minutes" msgid_plural "minutes"
msgstr[0] "minutt" msgstr[0] "minutt"
msgstr[1] "minutter" msgstr[1] "minutter"
#: ../js/ui/status/power.js:109 #: ../js/ui/status/power.js:114
#, c-format #, c-format
msgid "%d minute remaining" msgid "%d minute remaining"
msgid_plural "%d minutes remaining" msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår" msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår" msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186 #: ../js/ui/status/power.js:117 ../js/ui/status/power.js:191
#, c-format #, c-format
msgctxt "percent of battery remaining" msgctxt "percent of battery remaining"
msgid "%d%%" msgid "%d%%"
msgstr "%d%%" msgstr "%d%%"
#: ../js/ui/status/power.js:196 #: ../js/ui/status/power.js:201
msgid "AC adapter" msgid "AC adapter"
msgstr "Strømadapter" msgstr "Strømadapter"
#: ../js/ui/status/power.js:198 #: ../js/ui/status/power.js:203
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Batteri på bærbar" msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:200 #: ../js/ui/status/power.js:205
msgid "UPS" msgid "UPS"
msgstr "UPS" msgstr "UPS"
#: ../js/ui/status/power.js:202 #: ../js/ui/status/power.js:207
msgid "Monitor" msgid "Monitor"
msgstr "Skjerm" msgstr "Skjerm"
#: ../js/ui/status/power.js:204 #: ../js/ui/status/power.js:209
msgid "Mouse" msgid "Mouse"
msgstr "Mus" msgstr "Mus"
#: ../js/ui/status/power.js:208 #: ../js/ui/status/power.js:213
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:210 #: ../js/ui/status/power.js:215
msgid "Cell phone" msgid "Cell phone"
msgstr "Mobiltelefon" msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:212 #: ../js/ui/status/power.js:217
msgid "Media player" msgid "Media player"
msgstr "Medieavspiller" msgstr "Medieavspiller"
#: ../js/ui/status/power.js:214 #: ../js/ui/status/power.js:219
msgid "Tablet" msgid "Tablet"
msgstr "Nettbrett" msgstr "Nettbrett"
#: ../js/ui/status/power.js:216 #: ../js/ui/status/power.js:221
msgid "Computer" msgid "Computer"
msgstr "Datamaskin" msgstr "Datamaskin"
#: ../js/ui/status/power.js:218 #: ../js/ui/status/power.js:223
msgctxt "device" msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#: ../js/ui/status/volume.js:124
msgid "Volume changed"
msgstr "Volum endret"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295 #: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
#: ../js/ui/status/volume.js:256 #: ../js/ui/status/volume.js:259
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -1673,55 +1690,55 @@ msgstr "Logg inn som en annen bruker"
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Lås opp vindu" msgstr "Lås opp vindu"
#: ../js/ui/userMenu.js:177 #: ../js/ui/userMenu.js:178
msgid "Available" msgid "Available"
msgstr "Tilgjengelig" msgstr "Tilgjengelig"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Busy" msgid "Busy"
msgstr "Opptatt" msgstr "Opptatt"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Invisible" msgid "Invisible"
msgstr "Usynlig" msgstr "Usynlig"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Away" msgid "Away"
msgstr "Borte" msgstr "Borte"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Idle" msgid "Idle"
msgstr "Ledig" msgstr "Ledig"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Offline" msgid "Offline"
msgstr "Frakoblet" msgstr "Frakoblet"
#: ../js/ui/userMenu.js:755 #: ../js/ui/userMenu.js:757
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/userMenu.js:763 #: ../js/ui/userMenu.js:765
msgid "Settings" msgid "Settings"
msgstr "Innstillinger" msgstr "Innstillinger"
#: ../js/ui/userMenu.js:771 #: ../js/ui/userMenu.js:773
msgid "Switch User" msgid "Switch User"
msgstr "Bytt bruker" msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:776 #: ../js/ui/userMenu.js:778
msgid "Log Out" msgid "Log Out"
msgstr "Logg ut" msgstr "Logg ut"
#: ../js/ui/userMenu.js:796 #: ../js/ui/userMenu.js:798
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Installer oppdateringer og start på nytt" msgstr "Installer oppdateringer og start på nytt"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:816
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Din pratestatus vil bli satt til opptatt" msgstr "Din pratestatus vil bli satt til opptatt"
#: ../js/ui/userMenu.js:815 #: ../js/ui/userMenu.js:817
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1783,19 +1800,19 @@ msgstr[1] "%u innganger"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemlyder" msgstr "Systemlyder"
#: ../src/main.c:332 #: ../src/main.c:347
msgid "Print version" msgid "Print version"
msgstr "Skriv ut versjon" msgstr "Skriv ut versjon"
#: ../src/main.c:338 #: ../src/main.c:353
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modus som brukes av GDM for innloggingsskjermen" msgstr "Modus som brukes av GDM for innloggingsskjermen"
#: ../src/main.c:344 #: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm" msgstr "Bruk spesifikt modus, f.eks «gdm» for innloggingsskjerm"
#: ../src/main.c:350 #: ../src/main.c:365
msgid "List possible modes" msgid "List possible modes"
msgstr "Vis mulige modi" msgstr "Vis mulige modi"

705
po/nl.po

File diff suppressed because it is too large Load Diff

477
po/pa.po

File diff suppressed because it is too large Load Diff

499
po/pl.po

File diff suppressed because it is too large Load Diff

940
po/pt.po

File diff suppressed because it is too large Load Diff

314
po/sl.po
View File

@@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-01-08 22:40+0000\n" "POT-Creation-Date: 2013-01-26 03:10+0000\n"
"PO-Revision-Date: 2013-01-12 22:48+0100\n" "PO-Revision-Date: 2013-01-26 20:01+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: Slovenian\n" "Language: Slovenian\n"
@@ -161,21 +161,13 @@ msgstr ""
"enouporabniški in enosejni namestitvi." "enouporabniški in enosejni namestitvi."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show full name in the user menu"
msgstr "Pokaži polno ime v meniju uporabnika"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not."
msgstr "Ali naj bo prikazano uporabnikovo polno ime v meniju uporabnika."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "" msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Ali naj se geslo za priklapljanje šifriranih in oddaljenih datotečnih " "Ali naj se geslo za priklapljanje šifriranih in oddaljenih datotečnih "
"sistemov shrani" "sistemov shrani"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "" msgid ""
"The shell will request a password when an encrypted device or a remote " "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 " "filesystem is mounted. If the password can be saved for future use a "
@@ -186,71 +178,71 @@ msgstr ""
"izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost " "izbiri možnosti zahtevano geslo. Na pogovornem oknu bo prikazana možnost "
"'Shrani geslo'. S tem bo nastavljeno privzeto stanje za uporabo." "'Shrani geslo'. S tem bo nastavljeno privzeto stanje za uporabo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Pokaži tedenski datum v koledarju" msgstr "Pokaži tedenski datum v koledarju"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "Izbrana možnost določa prikaz ISO tedenski datum v koledarju." msgstr "Izbrana možnost določa prikaz ISO tedenski datum v koledarju."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Tipkovna bližnjica, ki odpre meni programov" msgstr "Tipkovna bližnjica, ki odpre meni programov"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Tipkovna bližnjica, ki odpre meni programov." msgstr "Tipkovna bližnjica, ki odpre meni programov."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to open the \"Show Applications\" view" msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\"" msgstr "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "" msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview." "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "" msgstr ""
"Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\" v pregledu " "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\" v pregledu "
"dejavnosti." "dejavnosti."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja" msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja." msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Keybinding to focus the active notification" msgid "Keybinding to focus the active notification"
msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila" msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "Keybinding to focus the active notification." msgid "Keybinding to focus the active notification."
msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila." msgstr "Tipkovna bližnjica za prikaz dejavnega obvestila."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tipkovna bližnjica za preklop snemalnika zaslona" msgstr "Tipkovna bližnjica za preklop snemalnika zaslona"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr ""
"Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona" "Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Katera tipkovnica naj bo uporabljena?" msgstr "Katera tipkovnica naj bo uporabljena?"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Vrsta tipkovnice za uporabo." msgstr "Vrsta tipkovnice za uporabo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka." msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34 #: ../data/org.gnome.shell.gschema.xml.in.in.h:32
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@@ -258,11 +250,11 @@ msgstr ""
"Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na " "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na "
"sekundo." "sekundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:33
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka." msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@@ -288,11 +280,11 @@ msgstr ""
"WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje " "WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje "
"najustreznejšega števila niti na sistemu." "najustreznejšega števila niti na sistemu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:36
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov" msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@@ -301,11 +293,11 @@ msgstr ""
"Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum " "Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum "
"in določena pripona. Pripona mora ustrezati zapisu zabojnika." "in določena pripona. Pripona mora ustrezati zapisu zabojnika."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Ikonski način programa." msgstr "Ikonski način programa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "" msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities " "Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
@@ -315,21 +307,21 @@ msgstr ""
"sličice' (pokaže le sličice oken), 'le ikona' (pokaže ikono programa) in pa " "sličice' (pokaže le sličice oken), 'le ikona' (pokaže ikono programa) in pa "
"možnost 'oboje'." "možnost 'oboje'."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Pripni modalno pogovorno okno na glavno okno" msgstr "Pripni modalno pogovorno okno na glavno okno"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Ključ prepiše vrednost v org.gnome.mutter med zaganjanjem lupine GNOME." "Ključ prepiše vrednost v org.gnome.mutter med zaganjanjem lupine GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "Razporeditev gumbov v nazivni vrstici" msgstr "Razporeditev gumbov v nazivni vrstici"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:45 #: ../data/org.gnome.shell.gschema.xml.in.in.h:43
msgid "" msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
@@ -337,15 +329,15 @@ msgstr ""
"Ključ prepiše vrednost v org.gnome.desktop.wm.preferences med zaganjanjem " "Ključ prepiše vrednost v org.gnome.desktop.wm.preferences med zaganjanjem "
"lupine GNOME." "lupine GNOME."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Omogoči utripanje črte med spuščanjem okna na robove zaslona" msgstr "Omogoči utripanje črte med spuščanjem okna na robove zaslona"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:45
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Delovne površine se obravnavajo dinamično" msgstr "Delovne površine se obravnavajo dinamično"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:48 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Delovne površine so le na osnovnem zaslonu" msgstr "Delovne površine so le na osnovnem zaslonu"
@@ -363,11 +355,11 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj." "Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj."
#: ../js/gdm/loginDialog.js:566 #: ../js/gdm/loginDialog.js:569
msgid "Session..." msgid "Session..."
msgstr "Seja ..." msgstr "Seja ..."
#: ../js/gdm/loginDialog.js:723 #: ../js/gdm/loginDialog.js:726
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prijava" msgstr "Prijava"
@@ -375,35 +367,35 @@ msgstr "Prijava"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:787 #: ../js/gdm/loginDialog.js:790
msgid "Not listed?" msgid "Not listed?"
msgstr "Ali je ni na seznamu?" msgstr "Ali je ni na seznamu?"
#: ../js/gdm/loginDialog.js:963 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:967 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178 #: ../js/ui/status/bluetooth.js:413 ../js/ui/unlockDialog.js:178
msgid "Cancel" msgid "Cancel"
msgstr "Prekliči" msgstr "Prekliči"
#: ../js/gdm/loginDialog.js:979 #: ../js/gdm/loginDialog.js:983
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prijava" msgstr "Prijava"
#: ../js/gdm/loginDialog.js:979 #: ../js/gdm/loginDialog.js:983
msgid "Next" msgid "Next"
msgstr "Naslednji" msgstr "Naslednji"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:1087 ../js/ui/components/networkAgent.js:260 #: ../js/gdm/loginDialog.js:1091 ../js/ui/components/networkAgent.js:260
#: ../js/ui/components/networkAgent.js:278 #: ../js/ui/components/networkAgent.js:278
msgid "Username: " msgid "Username: "
msgstr "Uporabniško ime: " msgstr "Uporabniško ime: "
#: ../js/gdm/loginDialog.js:1383 #: ../js/gdm/loginDialog.js:1387
msgid "Login Window" msgid "Login Window"
msgstr "Prijavno okno" msgstr "Prijavno okno"
@@ -412,8 +404,8 @@ msgstr "Prijavno okno"
msgid "Power" msgid "Power"
msgstr "Napajanje" msgstr "Napajanje"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:677 ../js/ui/userMenu.js:681
#: ../js/ui/userMenu.js:790 #: ../js/ui/userMenu.js:792
msgid "Suspend" msgid "Suspend"
msgstr "Zaustavi" msgstr "Zaustavi"
@@ -421,8 +413,8 @@ msgstr "Zaustavi"
msgid "Restart" msgid "Restart"
msgstr "Zaženi znova" msgstr "Zaženi znova"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:681 ../js/ui/userMenu.js:791
msgid "Power Off" msgid "Power Off"
msgstr "Izklop" msgstr "Izklop"
@@ -457,19 +449,19 @@ msgid "Execution of '%s' failed:"
msgstr "Izvedba '%s' je spodletela:" msgstr "Izvedba '%s' je spodletela:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:258 #: ../js/ui/appDisplay.js:259
msgid "All" msgid "All"
msgstr "Vse" msgstr "Vse"
#: ../js/ui/appDisplay.js:666 #: ../js/ui/appDisplay.js:667
msgid "New Window" msgid "New Window"
msgstr "Novo okno" msgstr "Novo okno"
#: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:670 ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstrani iz priljubljenih" msgstr "Odstrani iz priljubljenih"
#: ../js/ui/appDisplay.js:670 #: ../js/ui/appDisplay.js:671
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Dodaj med priljubljene" msgstr "Dodaj med priljubljene"
@@ -629,6 +621,14 @@ msgstr "Ta teden"
msgid "Next week" msgid "Next week"
msgstr "Naslednji teden" msgstr "Naslednji teden"
#: ../js/ui/components/automountManager.js:92
msgid "External drive connected"
msgstr "Zunanji pogon je priklopljen"
#: ../js/ui/components/automountManager.js:103
msgid "External drive disconnected"
msgstr "Zunanji pogon je odklopljen"
#: ../js/ui/components/autorunManager.js:295 #: ../js/ui/components/autorunManager.js:295
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Odstranljive naprave" msgstr "Odstranljive naprave"
@@ -986,7 +986,7 @@ msgstr "Povezava z %s ni mogoča."
msgid "View account" msgid "View account"
msgstr "Poglej račun" msgstr "Poglej račun"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1383
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznan vzrok" msgstr "Neznan vzrok"
@@ -998,18 +998,22 @@ msgstr "Okna"
msgid "Show Applications" msgid "Show Applications"
msgstr "Pokaži programe" msgstr "Pokaži programe"
#: ../js/ui/dateMenu.js:87 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "Nastavitve časa in datuma"
#: ../js/ui/dateMenu.js:112
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Odpri koledar" msgstr "Odpri koledar"
#: ../js/ui/dateMenu.js:96
msgid "Open Clocks"
msgstr "Odpri ure"
#: ../js/ui/dateMenu.js:105
msgid "Date and Time Settings"
msgstr "Nastavitve časa in datuma"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:191 #: ../js/ui/dateMenu.js:205
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a, %e. %b., %R" msgstr "%a, %e. %b., %R"
@@ -1152,7 +1156,9 @@ msgstr "Pokaži napake"
msgid "Enabled" msgid "Enabled"
msgstr "Omogočeno" msgstr "Omogočeno"
#: ../js/ui/lookingGlass.js:768 #. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:768 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Onemogočeno" msgstr "Onemogočeno"
@@ -1176,23 +1182,23 @@ msgstr "Poglej vir"
msgid "Web Page" msgid "Web Page"
msgstr "Spletna stran" msgstr "Spletna stran"
#: ../js/ui/messageTray.js:1090 #: ../js/ui/messageTray.js:1118
msgid "Open" msgid "Open"
msgstr "Odpri" msgstr "Odpri"
#: ../js/ui/messageTray.js:1097 #: ../js/ui/messageTray.js:1125
msgid "Remove" msgid "Remove"
msgstr "Odstrani" msgstr "Odstrani"
#: ../js/ui/messageTray.js:1554 #: ../js/ui/messageTray.js:1581
msgid "No Messages" msgid "No Messages"
msgstr "Ni sporočil" msgstr "Ni sporočil"
#: ../js/ui/messageTray.js:1572 #: ../js/ui/messageTray.js:1599
msgid "Message Tray" msgid "Message Tray"
msgstr "Vrstica sporočanja" msgstr "Vrstica sporočanja"
#: ../js/ui/messageTray.js:2641 #: ../js/ui/messageTray.js:2672
msgid "System Information" msgid "System Information"
msgstr "Podrobnosti sistema" msgstr "Podrobnosti sistema"
@@ -1278,15 +1284,15 @@ msgstr[1] "%d novo obvestilo"
msgstr[2] "%d novi obvestili" msgstr[2] "%d novi obvestili"
msgstr[3] "%d nova obvestila" msgstr[3] "%d nova obvestila"
#: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:783
msgid "Lock" msgid "Lock"
msgstr "Zakleni" msgstr "Zakleni"
#: ../js/ui/searchDisplay.js:403 #: ../js/ui/searchDisplay.js:430
msgid "Searching..." msgid "Searching..."
msgstr "Iskanje ..." msgstr "Iskanje ..."
#: ../js/ui/searchDisplay.js:451 #: ../js/ui/searchDisplay.js:478
msgid "No results." msgid "No results."
msgstr "Ni najdenih zadetkov." msgstr "Ni najdenih zadetkov."
@@ -1369,6 +1375,7 @@ msgstr "Veliko besedilo"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31 #: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319 #: ../js/ui/status/bluetooth.js:288 ../js/ui/status/bluetooth.js:319
#: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386 #: ../js/ui/status/bluetooth.js:355 ../js/ui/status/bluetooth.js:386
#: ../js/ui/status/network.js:813
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@@ -1389,7 +1396,7 @@ msgid "Bluetooth Settings"
msgstr "Nastavitve za Bluetooth" msgstr "Nastavitve za Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:169 #: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:177
msgid "hardware disabled" msgid "hardware disabled"
msgstr "strojno onemogočen" msgstr "strojno onemogočen"
@@ -1397,12 +1404,12 @@ msgstr "strojno onemogočen"
msgid "Connection" msgid "Connection"
msgstr "Povezava" msgstr "Povezava"
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:436 #: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:459
msgid "disconnecting..." msgid "disconnecting..."
msgstr "prekinjanje povezave ..." msgstr "prekinjanje povezave ..."
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:465
#: ../js/ui/status/network.js:1464 #: ../js/ui/status/network.js:1533
msgid "connecting..." msgid "connecting..."
msgstr "povezovanje ..." msgstr "povezovanje ..."
@@ -1418,7 +1425,7 @@ msgstr "Nastavitve tipkovnice"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Nastavitve miške" msgstr "Nastavitve miške"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:317
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Nastavitve zvoka" msgstr "Nastavitve zvoka"
@@ -1494,109 +1501,117 @@ msgstr "Nastavitve območja in jezika"
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Nosilec, omrežje, baterija" msgstr "Nosilec, omrežje, baterija"
#: ../js/ui/status/network.js:95 #: ../js/ui/status/network.js:103
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznano>" msgstr "<neznano>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:191 #: ../js/ui/status/network.js:199
msgid "disabled" msgid "disabled"
msgstr "onemogočeno" msgstr "onemogočeno"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:434 #: ../js/ui/status/network.js:457
msgid "unmanaged" msgid "unmanaged"
msgstr "neupravljano" msgstr "neupravljano"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467 #: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1536
msgid "authentication required" msgid "authentication required"
msgstr "zahtevana je overitev" msgstr "zahtevana je overitev"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:455 #: ../js/ui/status/network.js:478
msgid "firmware missing" msgid "firmware missing"
msgstr "manjka strojna programska oprema" msgstr "manjka strojna programska oprema"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:485
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel ni priklopljen" msgstr "kabel ni priklopljen"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:490
msgid "unavailable" msgid "unavailable"
msgstr "ni na voljo" msgstr "ni na voljo"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469 #: ../js/ui/status/network.js:492 ../js/ui/status/network.js:1538
msgid "connection failed" msgid "connection failed"
msgstr "povezovanje je spodletelo" msgstr "povezovanje je spodletelo"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403 #: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1422
#: ../js/ui/status/network.js:1545 #: ../js/ui/status/network.js:1614
msgid "More..." msgid "More..."
msgstr "Več ..." msgstr "Več ..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333 #: ../js/ui/status/network.js:587 ../js/ui/status/network.js:1352
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Povezano (zasebna povezava)" msgstr "Povezano (zasebna povezava)"
#: ../js/ui/status/network.js:641 #: ../js/ui/status/network.js:666
msgid "Wired"
msgstr "Žično"
#: ../js/ui/status/network.js:667
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Samodejni eternet" msgstr "Samodejni eternet"
#: ../js/ui/status/network.js:688 #: ../js/ui/status/network.js:694
msgid "Mobile broadband"
msgstr "Mobilni širokopasovni dostop"
#: ../js/ui/status/network.js:715
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Samodejni širokopasovni dostop" msgstr "Samodejni širokopasovni dostop"
#: ../js/ui/status/network.js:691 #: ../js/ui/status/network.js:718
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Samodejni klicni dostop" msgstr "Samodejni klicni dostop"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350 #: ../js/ui/status/network.js:848 ../js/ui/status/network.js:1369
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Samodejna povezava z %s" msgstr "Samodejna povezava z %s"
#: ../js/ui/status/network.js:822 #: ../js/ui/status/network.js:850
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Samodejna povezava z Bluetooth" msgstr "Samodejna povezava z Bluetooth"
#: ../js/ui/status/network.js:1352 #: ../js/ui/status/network.js:1371
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Samodejni brezžični dostop" msgstr "Samodejni brezžični dostop"
#: ../js/ui/status/network.js:1595 #: ../js/ui/status/network.js:1664
msgid "Enable networking" msgid "Enable networking"
msgstr "Omogoči omrežje" msgstr "Omogoči omrežje"
#: ../js/ui/status/network.js:1627 #: ../js/ui/status/network.js:1706
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1725
msgid "Network Settings" msgid "Network Settings"
msgstr "Omrežne nastavitve" msgstr "Omrežne nastavitve"
#: ../js/ui/status/network.js:1692 #: ../js/ui/status/network.js:1784
msgid "Network Manager" msgid "Network Manager"
msgstr "Upravljalnik omrežij" msgstr "Upravljalnik omrežij"
#: ../js/ui/status/network.js:1774 #: ../js/ui/status/network.js:1873
msgid "Connection failed" msgid "Connection failed"
msgstr "Povezava je spodletela" msgstr "Povezava je spodletela"
#: ../js/ui/status/network.js:1775 #: ../js/ui/status/network.js:1874
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Omogočanje omrežne povezave je spodletelo." msgstr "Omogočanje omrežne povezave je spodletelo."
#: ../js/ui/status/network.js:2092 #: ../js/ui/status/network.js:2252
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Omrežje je onemogočeno" msgstr "Omrežje je onemogočeno"
@@ -1705,12 +1720,16 @@ msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Neznano" msgstr "Neznano"
#: ../js/ui/status/volume.js:124
msgid "Volume changed"
msgstr "Glasnost je spremenjena"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295 #: ../js/ui/status/volume.js:250 ../js/ui/status/volume.js:298
msgid "Volume" msgid "Volume"
msgstr "Glasnost" msgstr "Glasnost"
#: ../js/ui/status/volume.js:256 #: ../js/ui/status/volume.js:259
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
@@ -1722,55 +1741,55 @@ msgstr "Prijava kot drug uporabnik"
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Odkleni okno" msgstr "Odkleni okno"
#: ../js/ui/userMenu.js:177 #: ../js/ui/userMenu.js:178
msgid "Available" msgid "Available"
msgstr "Na voljo" msgstr "Na voljo"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Busy" msgid "Busy"
msgstr "Zaposleno" msgstr "Zaposleno"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Invisible" msgid "Invisible"
msgstr "Nevidno" msgstr "Nevidno"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Away" msgid "Away"
msgstr "Odsotno" msgstr "Odsotno"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Idle" msgid "Idle"
msgstr "Nedejavno" msgstr "Nedejavno"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Offline" msgid "Offline"
msgstr "Nepovezano" msgstr "Nepovezano"
#: ../js/ui/userMenu.js:755 #: ../js/ui/userMenu.js:757
msgid "Notifications" msgid "Notifications"
msgstr "Obvestila" msgstr "Obvestila"
#: ../js/ui/userMenu.js:763 #: ../js/ui/userMenu.js:765
msgid "Settings" msgid "Settings"
msgstr "Nastavitve" msgstr "Nastavitve"
#: ../js/ui/userMenu.js:771 #: ../js/ui/userMenu.js:773
msgid "Switch User" msgid "Switch User"
msgstr "Preklopi uporabnika" msgstr "Preklopi uporabnika"
#: ../js/ui/userMenu.js:776 #: ../js/ui/userMenu.js:778
msgid "Log Out" msgid "Log Out"
msgstr "Odjava" msgstr "Odjava"
#: ../js/ui/userMenu.js:796 #: ../js/ui/userMenu.js:798
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Namesti posodobitve in ponovno zaženi" msgstr "Namesti posodobitve in ponovno zaženi"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:816
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno" msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"
#: ../js/ui/userMenu.js:815 #: ../js/ui/userMenu.js:817
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@@ -1810,19 +1829,45 @@ msgstr "'%s' storitev je pripravljena"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Koledar Evolution " msgstr "Koledar Evolution "
#: ../src/main.c:332 #. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1837
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u odvodov naprave"
msgstr[1] "%u odvod naprave"
msgstr[2] "%u odvoda naprave"
msgstr[3] "%u odvodi naprave"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1847
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u dovodov naprave"
msgstr[1] "%u dovod naprave"
msgstr[2] "%u dovoda naprave"
msgstr[3] "%u dovodi naprave"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Sistemski zvoki"
#: ../src/main.c:347
msgid "Print version" msgid "Print version"
msgstr "Izpiši različico" msgstr "Izpiši različico"
#: ../src/main.c:338 #: ../src/main.c:353
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Način uporabljen v GDM za prijavni naslov" msgstr "Način uporabljen v GDM za prijavni naslov"
#: ../src/main.c:344 #: ../src/main.c:359
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Uporabi poseben način, npr.: \"gdm\" za prijavni zaslon" msgstr "Uporabi poseben način, npr.: \"gdm\" za prijavni zaslon"
#: ../src/main.c:350 #: ../src/main.c:365
msgid "List possible modes" msgid "List possible modes"
msgstr "Seznam mogočih načinov" msgstr "Seznam mogočih načinov"
@@ -1851,6 +1896,12 @@ msgstr "Privzeto"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Uporabnik je zavrnil pogovorno okno overitve" msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "Show full name in the user menu"
#~ msgstr "Pokaži polno ime v meniju uporabnika"
#~ msgid "Whether the users full name is shown in the user menu or not."
#~ msgstr "Ali naj bo prikazano uporabnikovo polno ime v meniju uporabnika."
#~ msgid "APPLICATIONS" #~ msgid "APPLICATIONS"
#~ msgstr "Programi" #~ msgstr "Programi"
@@ -1887,15 +1938,9 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "The requested device cannot be browsed, error is '%s'" #~ msgid "The requested device cannot be browsed, error is '%s'"
#~ msgstr "Po zahtevani naprave ni mogoče brskati, napaka je '%s'" #~ msgstr "Po zahtevani naprave ni mogoče brskati, napaka je '%s'"
#~ msgid "Wired"
#~ msgstr "Žično"
#~ msgid "Wireless" #~ msgid "Wireless"
#~ msgstr "Brezžično" #~ msgstr "Brezžično"
#~ msgid "Mobile broadband"
#~ msgstr "Mobilni širokopasovni dostop"
#~ msgid "VPN Connections" #~ msgid "VPN Connections"
#~ msgstr "Povezave VPN" #~ msgstr "Povezave VPN"
@@ -1905,23 +1950,6 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "System Settings" #~ msgid "System Settings"
#~ msgstr "Sistemske nastavitve" #~ msgstr "Sistemske nastavitve"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u odvodov naprave"
#~ msgstr[1] "%u odvod naprave"
#~ msgstr[2] "%u odvoda naprave"
#~ msgstr[3] "%u odvodi naprave"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u dovodov naprave"
#~ msgstr[1] "%u dovod naprave"
#~ msgstr[2] "%u dovoda naprave"
#~ msgstr[3] "%u dovodi naprave"
#~ msgid "System Sounds"
#~ msgstr "Sistemski zvoki"
#~ msgid "Switch Session" #~ msgid "Switch Session"
#~ msgstr "Preklopi sejo" #~ msgstr "Preklopi sejo"

846
po/sr.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

450
po/ug.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -115,6 +115,7 @@ shell_public_headers_h = \
shell-gtk-embed.h \ shell-gtk-embed.h \
shell-global.h \ shell-global.h \
shell-invert-lightness-effect.h \ shell-invert-lightness-effect.h \
shell-keybinding-modes.h \
shell-mobile-providers.h \ shell-mobile-providers.h \
shell-mount-operation.h \ shell-mount-operation.h \
shell-network-agent.h \ shell-network-agent.h \
@@ -291,7 +292,7 @@ libgnome_shell_la_LIBADD = \
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags) libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
Shell-0.1.gir: libgnome-shell.la St-1.0.gir Shell-0.1.gir: libgnome-shell.la St-1.0.gir
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0 Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 TelepathyLogger-0.2 Soup-2.4 GMenu-3.0 NetworkManager-1.0 NMClient-1.0 xlib-2.0
Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir) Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
Shell_0_1_gir_LIBS = libgnome-shell.la Shell_0_1_gir_LIBS = libgnome-shell.la
Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources) Shell_0_1_gir_FILES = $(libgnome_shell_la_gir_sources)

View File

@@ -1,12 +1,12 @@
#!/bin/sh #!/bin/sh
if [ -n "$GI_TYPELIB_PATH" ]; then if [ -z "$GI_TYPELIB_PATH" ]; then
export GI_TYPELIB_PATH=@pkglibdir@ export GI_TYPELIB_PATH=@pkglibdir@
else else
export GI_TYPELIB_PATH=@pkglibdir@:$GI_TYPELIB_PATH export GI_TYPELIB_PATH=@pkglibdir@:$GI_TYPELIB_PATH
fi fi
if [ -n "$LD_LIBRARY_PATH" ] ; then if [ -z "$LD_LIBRARY_PATH" ] ; then
export LD_LIBRARY_PATH=@pkglibdir@ export LD_LIBRARY_PATH=@pkglibdir@
else else
export LD_LIBRARY_PATH=@pkglibdir@:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=@pkglibdir@:$LD_LIBRARY_PATH

View File

@@ -8,6 +8,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <cogl-pango/cogl-pango.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
@@ -194,6 +195,20 @@ shell_introspection_init (void)
} }
static void
shell_fonts_init (void)
{
CoglPangoFontMap *fontmap;
/* Disable text mipmapping; it causes problems on pre-GEM Intel
* drivers and we should just be rendering text at the right
* size rather than scaling it. If we do effects where we dynamically
* zoom labels, then we might want to reconsider.
*/
fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
}
static void static void
malloc_statistics_callback (ShellPerfLog *perf_log, malloc_statistics_callback (ShellPerfLog *perf_log,
gpointer data) gpointer data)
@@ -396,6 +411,7 @@ main (int argc, char **argv)
shell_perf_log_init (); shell_perf_log_init ();
shell_prefs_init (); shell_prefs_init ();
shell_introspection_init (); shell_introspection_init ();
shell_fonts_init ();
/* Turn on telepathy-glib debugging but filter it out in /* Turn on telepathy-glib debugging but filter it out in
* default_log_handler. This handler also exposes all the logs over D-Bus * default_log_handler. This handler also exposes all the logs over D-Bus

View File

@@ -457,38 +457,6 @@ shell_app_system_get_tree (ShellAppSystem *self)
return self->priv->apps_tree; return self->priv->apps_tree;
} }
/**
* shell_app_system_get_settings_tree:
*
* Return Value: (transfer none): The #GMenuTree for apps
*/
GMenuTree *
shell_app_system_get_settings_tree (ShellAppSystem *self)
{
return self->priv->settings_tree;
}
/**
* shell_app_system_lookup_setting:
* @system:
* @id: desktop file id
*
* Returns: (transfer none): Application in gnomecc.menu, or %NULL if none
*/
ShellApp *
shell_app_system_lookup_setting (ShellAppSystem *self,
const char *id)
{
ShellApp *app;
/* Actually defer to the main app set if there's overlap */
app = shell_app_system_lookup_app (self, id);
if (app != NULL)
return app;
return g_hash_table_lookup (self->priv->setting_id_to_app, id);
}
/** /**
* shell_app_system_get_default: * shell_app_system_get_default:
* *

View File

@@ -60,13 +60,7 @@ GSList *shell_app_system_subsearch (ShellAppSystem *sys
GSList *previous_results, GSList *previous_results,
GSList *terms); GSList *terms);
GMenuTree *shell_app_system_get_settings_tree (ShellAppSystem *system);
GSList *shell_app_system_search_settings (ShellAppSystem *system, GSList *shell_app_system_search_settings (ShellAppSystem *system,
GSList *terms); GSList *terms);
ShellApp *shell_app_system_lookup_setting (ShellAppSystem *system,
const char *id);
#endif /* __SHELL_APP_SYSTEM_H__ */ #endif /* __SHELL_APP_SYSTEM_H__ */

View File

@@ -13,10 +13,11 @@
#ifdef HAVE_SYS_RESOURCE_H #ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <locale.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
#include <cogl-pango/cogl-pango.h>
#include <canberra.h> #include <canberra.h>
#include <canberra-gtk.h>
#include <clutter/glx/clutter-glx.h> #include <clutter/glx/clutter-glx.h>
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
@@ -266,8 +267,13 @@ shell_global_init (ShellGlobal *global)
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL; global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
ca_context_create (&global->sound_context); global->sound_context = ca_gtk_context_get ();
ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL); ca_context_change_props (global->sound_context,
CA_PROP_APPLICATION_NAME, "GNOME Shell",
CA_PROP_APPLICATION_ID, "org.gnome.Shell",
CA_PROP_APPLICATION_ICON_NAME, "start-here",
CA_PROP_APPLICATION_LANGUAGE, setlocale (LC_MESSAGES, NULL),
NULL);
ca_context_open (global->sound_context); ca_context_open (global->sound_context);
if (!shell_js) if (!shell_js)
@@ -811,20 +817,6 @@ global_stage_after_paint (ClutterStage *stage,
"clutter.stagePaintDone"); "clutter.stagePaintDone");
} }
static void
shell_fonts_init (ClutterStage *stage)
{
CoglPangoFontMap *fontmap;
/* Disable text mipmapping; it causes problems on pre-GEM Intel
* drivers and we should just be rendering text at the right
* size rather than scaling it. If we do effects where we dynamically
* zoom labels, then we might want to reconsider.
*/
fontmap = COGL_PANGO_FONT_MAP (clutter_get_font_map ());
cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE);
}
/* This is an IBus workaround. The flow of events with IBus is that every time /* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it: * it gets gets a key event, it:
* *
@@ -963,8 +955,6 @@ _shell_global_set_plugin (ShellGlobal *global,
g_signal_connect (global->meta_display, "notify::focus-window", g_signal_connect (global->meta_display, "notify::focus-window",
G_CALLBACK (focus_window_changed), global); G_CALLBACK (focus_window_changed), global);
shell_fonts_init (global->stage);
gdk_event_handler_set (gnome_shell_gdk_event_handler, global->stage, NULL); gdk_event_handler_set (gnome_shell_gdk_event_handler, global->stage, NULL);
global->focus_manager = st_focus_manager_get_for_stage (global->stage); global->focus_manager = st_focus_manager_get_for_stage (global->stage);
@@ -1594,21 +1584,99 @@ shell_global_run_at_leisure (ShellGlobal *global,
schedule_leisure_functions (global); schedule_leisure_functions (global);
} }
static void
build_ca_proplist_for_event (ca_proplist *props,
const char *event_id,
const char *event_description,
ClutterEvent *for_event)
{
ca_proplist_sets (props, CA_PROP_EVENT_ID, event_id);
ca_proplist_sets (props, CA_PROP_EVENT_DESCRIPTION, event_description);
ca_proplist_sets (props, CA_PROP_CANBERRA_CACHE_CONTROL, "volatile");
if (for_event)
{
if (clutter_event_type (for_event) != CLUTTER_KEY_PRESS &&
clutter_event_type (for_event) != CLUTTER_KEY_RELEASE)
{
ClutterPoint point;
clutter_event_get_position (for_event, &point);
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_X, "%d", (int)point.x);
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_Y, "%d", (int)point.y);
}
if (clutter_event_type (for_event) == CLUTTER_BUTTON_PRESS ||
clutter_event_type (for_event) == CLUTTER_BUTTON_RELEASE)
{
gint button;
button = clutter_event_get_button (for_event);
ca_proplist_setf (props, CA_PROP_EVENT_MOUSE_BUTTON, "%d", button);
}
}
}
/** /**
* shell_global_play_theme_sound: * shell_global_play_theme_sound:
* @global: the #ShellGlobal * @global: the #ShellGlobal
* @id: an id, used to cancel later (0 if not needed) * @id: an id, used to cancel later (0 if not needed)
* @name: the sound name * @name: the sound name
* @for_event: (allow-none): a #ClutterEvent in response to which the sound is played
* *
* Plays a simple sound picked according to Freedesktop sound theme. * Plays a simple sound picked according to Freedesktop sound theme.
* Really just a workaround for libcanberra not being introspected. * Really just a workaround for libcanberra not being introspected.
*/ */
void void
shell_global_play_theme_sound (ShellGlobal *global, shell_global_play_theme_sound (ShellGlobal *global,
guint id, guint id,
const char *name) const char *name,
const char *description,
ClutterEvent *for_event)
{ {
ca_context_play (global->sound_context, id, CA_PROP_EVENT_ID, name, NULL); ca_proplist *props;
ca_proplist_create (&props);
build_ca_proplist_for_event (props, name, description, for_event);
ca_context_play_full (global->sound_context, id, props, NULL, NULL);
ca_proplist_destroy (props);
}
/**
* shell_global_play_theme_sound_full:
* @global: the #ShellGlobal
* @id: an id, used to cancel later (0 if not needed)
* @name: the sound name
* @description: the localized description of the event that triggered this alert
* @for_event: (allow-none): a #ClutterEvent in response to which the sound is played
* @application_id: application on behalf of which the sound is played
* @application_name:
*
* Plays a simple sound picked according to Freedesktop sound theme.
* Really just a workaround for libcanberra not being introspected.
*/
void
shell_global_play_theme_sound_full (ShellGlobal *global,
guint id,
const char *name,
const char *description,
ClutterEvent *for_event,
const char *application_id,
const char *application_name)
{
ca_proplist *props;
ca_proplist_create (&props);
build_ca_proplist_for_event (props, name, description, for_event);
ca_proplist_sets (props, CA_PROP_APPLICATION_ID, application_id);
ca_proplist_sets (props, CA_PROP_APPLICATION_NAME, application_name);
ca_context_play_full (global->sound_context, id, props, NULL, NULL);
ca_proplist_destroy (props);
} }
/** /**

View File

@@ -121,9 +121,18 @@ void shell_global_sync_pointer (ShellGlobal *global);
GAppLaunchContext * GAppLaunchContext *
shell_global_create_app_launch_context (ShellGlobal *global); shell_global_create_app_launch_context (ShellGlobal *global);
void shell_global_play_theme_sound (ShellGlobal *global, void shell_global_play_theme_sound (ShellGlobal *global,
guint id,
const char *name,
const char *description,
ClutterEvent *for_event);
void shell_global_play_theme_sound_full (ShellGlobal *global,
guint id, guint id,
const char *name); const char *name,
const char *description,
ClutterEvent *for_event,
const char *application_id,
const char *application_name);
void shell_global_cancel_theme_sound (ShellGlobal *global, void shell_global_cancel_theme_sound (ShellGlobal *global,
guint id); guint id);

View File

@@ -0,0 +1,35 @@
/**
* ShellKeyBindingMode:
* @SHELL_KEYBINDING_MODE_NONE: block keybinding
* @SHELL_KEYBINDING_MODE_NORMAL: allow keybinding when in window mode,
* e.g. when the focus is in an application window
* @SHELL_KEYBINDING_MODE_OVERVIEW: allow keybinding while the overview
* is active
* @SHELL_KEYBINDING_MODE_LOCK_SCREEN: allow keybinding when the screen
* is locked, e.g. when the screen shield is shown
* @SHELL_KEYBINDING_MODE_UNLOCK_SCREEN: allow keybinding in the unlock
* dialog
* @SHELL_KEYBINDING_MODE_LOGIN_SCREEN: allow keybinding in the login screen
* @SHELL_KEYBINDING_MODE_MESSAGE_TRAY: allow keybinding while the message
* tray is popped up
* @SHELL_KEYBINDING_MODE_SYSTEM_MODAL: allow keybinding when a system modal
* dialog (e.g. authentification or session dialogs) is open
* @SHELL_KEYBINDING_MODE_LOOKING_GLASS: allow keybinding in looking glass
* @SHELL_KEYBINDING_MODE_ALL: always allow keybinding
*
* Controls in which GNOME Shell states a keybinding should be handled.
*/
typedef enum {
SHELL_KEYBINDING_MODE_NONE = 0,
SHELL_KEYBINDING_MODE_NORMAL = 1 << 0,
SHELL_KEYBINDING_MODE_OVERVIEW = 1 << 1,
SHELL_KEYBINDING_MODE_LOCK_SCREEN = 1 << 2,
SHELL_KEYBINDING_MODE_UNLOCK_SCREEN = 1 << 3,
SHELL_KEYBINDING_MODE_LOGIN_SCREEN = 1 << 4,
SHELL_KEYBINDING_MODE_MESSAGE_TRAY = 1 << 5,
SHELL_KEYBINDING_MODE_SYSTEM_MODAL = 1 << 6,
SHELL_KEYBINDING_MODE_LOOKING_GLASS = 1 << 7,
SHELL_KEYBINDING_MODE_ALL = ~SHELL_KEYBINDING_MODE_NONE
} ShellKeyBindingMode;

View File

@@ -180,6 +180,7 @@ void
shell_tray_icon_click (ShellTrayIcon *icon, shell_tray_icon_click (ShellTrayIcon *icon,
ClutterEvent *event) ClutterEvent *event)
{ {
XKeyEvent xkevent;
XButtonEvent xbevent; XButtonEvent xbevent;
XCrossingEvent xcevent; XCrossingEvent xcevent;
GdkWindow *remote_window; GdkWindow *remote_window;
@@ -187,8 +188,10 @@ shell_tray_icon_click (ShellTrayIcon *icon,
int x_root, y_root; int x_root, y_root;
Display *xdisplay; Display *xdisplay;
Window xwindow, xrootwindow; Window xwindow, xrootwindow;
ClutterEventType event_type = clutter_event_type (event);
g_return_if_fail (clutter_event_type (event) == CLUTTER_BUTTON_RELEASE); g_return_if_fail (event_type == CLUTTER_BUTTON_RELEASE ||
event_type == CLUTTER_KEY_RELEASE);
gdk_error_trap_push (); gdk_error_trap_push ();
@@ -215,22 +218,44 @@ shell_tray_icon_click (ShellTrayIcon *icon,
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xcevent); XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xcevent);
/* Now do the click */ /* Now do the click */
xbevent.type = ButtonPress; if (event_type == CLUTTER_BUTTON_RELEASE)
xbevent.window = xwindow; {
xbevent.root = xrootwindow; xbevent.window = xwindow;
xbevent.subwindow = None; xbevent.root = xrootwindow;
xbevent.time = xcevent.time; xbevent.subwindow = None;
xbevent.x = xcevent.x; xbevent.time = xcevent.time;
xbevent.y = xcevent.y; xbevent.x = xcevent.x;
xbevent.x_root = xcevent.x_root; xbevent.y = xcevent.y;
xbevent.y_root = xcevent.y_root; xbevent.x_root = xcevent.x_root;
xbevent.state = clutter_event_get_state (event); xbevent.y_root = xcevent.y_root;
xbevent.button = clutter_event_get_button (event); xbevent.state = clutter_event_get_state (event);
xbevent.same_screen = True; xbevent.same_screen = True;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent); xbevent.type = ButtonPress;
xbevent.button = clutter_event_get_button (event);
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
xbevent.type = ButtonRelease; xbevent.type = ButtonRelease;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent); XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xbevent);
}
else
{
xkevent.window = xwindow;
xkevent.root = xrootwindow;
xkevent.subwindow = None;
xkevent.time = xcevent.time;
xkevent.x = xcevent.x;
xkevent.y = xcevent.y;
xkevent.x_root = xcevent.x_root;
xkevent.y_root = xcevent.y_root;
xkevent.state = clutter_event_get_state (event);
xkevent.same_screen = True;
xkevent.type = KeyPress;
xkevent.keycode = clutter_event_get_key_code (event);
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xkevent);
xkevent.type = KeyRelease;
XSendEvent (xdisplay, xwindow, False, 0, (XEvent *)&xkevent);
}
/* And move the pointer back out */ /* And move the pointer back out */
xcevent.type = LeaveNotify; xcevent.type = LeaveNotify;

View File

@@ -9,6 +9,8 @@
#include <glib/gi18n-lib.h> #include <glib/gi18n-lib.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk/gdkx.h>
#include <X11/Xatom.h>
#ifdef HAVE__NL_TIME_FIRST_WEEKDAY #ifdef HAVE__NL_TIME_FIRST_WEEKDAY
#include <langinfo.h> #include <langinfo.h>
@@ -430,3 +432,56 @@ shell_util_create_pixbuf_from_data (const guchar *data,
bits_per_sample, width, height, rowstride, bits_per_sample, width, height, rowstride,
(GdkPixbufDestroyNotify) g_free, NULL); (GdkPixbufDestroyNotify) g_free, NULL);
} }
Pixmap
shell_util_get_root_background (void)
{
Display *display;
Pixmap pixmap;
Window rootwin;
Atom xrootpmap;
Atom actual_type;
int actual_format;
unsigned long n_items;
unsigned long bytes_after;
unsigned char *buffer;
display = gdk_x11_get_default_xdisplay ();
xrootpmap = gdk_x11_atom_to_xatom (gdk_atom_intern_static_string ("_XROOTPMAP_ID"));
rootwin = gdk_x11_get_default_root_xwindow ();
gdk_error_trap_push ();
actual_type = None;
buffer = NULL;
if (XGetWindowProperty (display, rootwin, xrootpmap,
0, G_MAXLONG,
False, XA_PIXMAP, &actual_type, &actual_format,
&n_items,
&bytes_after,
&buffer) != Success ||
actual_type == None)
{
if (buffer)
XFree (buffer);
gdk_error_trap_pop_ignored ();
return FALSE;
}
if (gdk_error_trap_pop () != Success ||
n_items == 0 ||
actual_type != XA_PIXMAP ||
actual_format != 32)
{
if (buffer)
XFree (buffer);
return FALSE;
}
pixmap = *((Pixmap*) buffer);
XFree (buffer);
return pixmap;
}

View File

@@ -7,6 +7,7 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <libsoup/soup.h> #include <libsoup/soup.h>
#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf.h>
#include <gdk/gdkx.h>
G_BEGIN_DECLS G_BEGIN_DECLS
@@ -46,6 +47,8 @@ GdkPixbuf *shell_util_create_pixbuf_from_data (const guchar *data,
int height, int height,
int rowstride); int rowstride);
Pixmap shell_util_get_root_background (void);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_UTIL_H__ */ #endif /* __SHELL_UTIL_H__ */

View File

@@ -316,10 +316,6 @@ key_event_to_gdk (ClutterKeyEvent *event_clutter)
* doesn't support XKB; we'll just end up with group == 0 */ * doesn't support XKB; we'll just end up with group == 0 */
event_gdk->group = XkbGroupForCoreState (event_gdk->state); event_gdk->group = XkbGroupForCoreState (event_gdk->state);
gdk_keymap_translate_keyboard_state (keymap, event_gdk->hardware_keycode,
event_gdk->state, event_gdk->group,
&event_gdk->keyval, NULL, NULL, NULL);
if (event_clutter->unicode_value) if (event_clutter->unicode_value)
{ {
/* This is not particularly close to what GDK does - event_gdk->string /* This is not particularly close to what GDK does - event_gdk->string

View File

@@ -50,8 +50,8 @@
* *
* The second simplification that we make that allows us to implement * The second simplification that we make that allows us to implement
* a straighforward height-for-width negotiation without multiple * a straighforward height-for-width negotiation without multiple
* allocate passes is that when the vertical scrollbar policy is * allocate passes is that when the scrollbar policy is
* AUTO, we always reserve space for the vertical scrollbar in the * AUTO, we always reserve space for the scrollbar in the
* reported minimum and natural size. * reported minimum and natural size.
* *
* See https://bugzilla.gnome.org/show_bug.cgi?id=611740 for a more * See https://bugzilla.gnome.org/show_bug.cgi?id=611740 for a more
@@ -451,7 +451,11 @@ st_scroll_view_get_preferred_height (ClutterActor *actor,
account_for_hscrollbar = TRUE; account_for_hscrollbar = TRUE;
break; break;
case GTK_POLICY_AUTOMATIC: case GTK_POLICY_AUTOMATIC:
account_for_hscrollbar = for_width < child_min_width; /* For automatic scrollbars, we always request space for the horizontal
* scrollbar; we won't know whether we actually need one until our
* width is assigned in allocate().
*/
account_for_hscrollbar = TRUE;
break; break;
} }
@@ -622,12 +626,14 @@ st_scroll_view_allocate (ClutterActor *actor,
clutter_actor_allocate (priv->hscroll, &child_box, flags); clutter_actor_allocate (priv->hscroll, &child_box, flags);
} }
/* Now fold visibility into the scrollbar sizes to simplify the rest /* In case the scrollbar policy is NEVER, we don't trim the content
* of the computations. * box allocation by the scrollbar size.
* Fold this into the scrollbar sizes to simplify the rest of the
* computations.
*/ */
if (!hscrollbar_visible) if (priv->hscrollbar_policy == GTK_POLICY_NEVER)
sb_height = 0; sb_height = 0;
if (!vscrollbar_visible) if (priv->vscrollbar_policy == GTK_POLICY_NEVER)
sb_width = 0; sb_width = 0;
/* Child */ /* Child */

View File

@@ -61,6 +61,14 @@ st_theme_node_class_init (StThemeNodeClass *klass)
object_class->finalize = st_theme_node_finalize; object_class->finalize = st_theme_node_finalize;
} }
static void
on_custom_stylesheets_changed (StTheme *theme,
gpointer data)
{
StThemeNode *node = data;
node->properties_computed = FALSE;
}
static void static void
st_theme_node_dispose (GObject *gobject) st_theme_node_dispose (GObject *gobject)
@@ -85,6 +93,10 @@ st_theme_node_dispose (GObject *gobject)
node->icon_colors = NULL; node->icon_colors = NULL;
} }
if (node->theme)
g_signal_handlers_disconnect_by_func (node->theme,
on_custom_stylesheets_changed, node);
g_clear_object (&node->theme); g_clear_object (&node->theme);
G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject); G_OBJECT_CLASS (st_theme_node_parent_class)->dispose (gobject);
@@ -221,10 +233,11 @@ st_theme_node_new (StThemeContext *context,
theme = parent_node->theme; theme = parent_node->theme;
if (theme != NULL) if (theme != NULL)
node->theme = theme; {
node->theme = g_object_ref (theme);
if (node->theme != NULL) g_signal_connect (node->theme, "custom-stylesheets-changed",
g_object_ref (node->theme); G_CALLBACK (on_custom_stylesheets_changed), node);
}
node->element_type = element_type; node->element_type = element_type;
node->element_id = g_strdup (element_id); node->element_id = g_strdup (element_id);

View File

@@ -87,6 +87,14 @@ enum
PROP_DEFAULT_STYLESHEET PROP_DEFAULT_STYLESHEET
}; };
enum
{
STYLESHEETS_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE (StTheme, st_theme, G_TYPE_OBJECT) G_DEFINE_TYPE (StTheme, st_theme, G_TYPE_OBJECT)
/* Quick strcmp. Test only for == 0 or != 0, not < 0 or > 0. */ /* Quick strcmp. Test only for == 0 or != 0, not < 0 or > 0. */
@@ -153,6 +161,13 @@ st_theme_class_init (StThemeClass *klass)
NULL, NULL,
G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY)); G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
signals[STYLESHEETS_CHANGED] =
g_signal_new ("custom-stylesheets-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, /* no default handler slot */
NULL, NULL, NULL,
G_TYPE_NONE, 0);
} }
static CRStyleSheet * static CRStyleSheet *
@@ -238,6 +253,7 @@ st_theme_load_stylesheet (StTheme *theme,
insert_stylesheet (theme, path, stylesheet); insert_stylesheet (theme, path, stylesheet);
cr_stylesheet_ref (stylesheet); cr_stylesheet_ref (stylesheet);
theme->custom_stylesheets = g_slist_prepend (theme->custom_stylesheets, stylesheet); theme->custom_stylesheets = g_slist_prepend (theme->custom_stylesheets, stylesheet);
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
return TRUE; return TRUE;
} }
@@ -259,6 +275,7 @@ st_theme_unload_stylesheet (StTheme *theme,
g_hash_table_remove (theme->stylesheets_by_filename, path); g_hash_table_remove (theme->stylesheets_by_filename, path);
g_hash_table_remove (theme->filenames_by_stylesheet, stylesheet); g_hash_table_remove (theme->filenames_by_stylesheet, stylesheet);
cr_stylesheet_unref (stylesheet); cr_stylesheet_unref (stylesheet);
g_signal_emit (theme, signals[STYLESHEETS_CHANGED], 0);
} }
/** /**