Compare commits

...

116 Commits
3.7.3 ... 3.7.4

Author SHA1 Message Date
f0ebc84840 Bump version to 3.7.4
Update NEWS.
2013-01-15 02:48:12 +01:00
490eb59ea3 build: Add missing file 2013-01-15 02:48:12 +01:00
16a9391726 remoteSearch: fix a typo in createIcon
4288761235 changed the method to always
create a GIcon, but didn't pass it down to the StIcon constructor.

https://bugzilla.gnome.org/show_bug.cgi?id=691750
2013-01-14 19:43:45 -05:00
adf8ba67d2 run-test: Properly set the path for the GVC library
We really should get a better testrunner rather than this hacked
together thing.

https://bugzilla.gnome.org/show_bug.cgi?id=691743
2013-01-14 17:53:23 -05:00
c37b222cbf network: support NM 0.9.6 again
NM 0.9.7 is still not released even as a tarball, so fix this to work
with 0.9.6 again for now (although it doesn't do any device name
disambiguation in this case now).

https://bugzilla.gnome.org/show_bug.cgi?id=691720
2013-01-14 11:25:40 -05:00
72f8f2beb1 Updated Norwegian bokmål translation 2013-01-14 11:21:19 +01:00
16bb9c17f5 status/keyboard: Add input source switching per window
If the setting is enabled, we record the last activated input source
for the currently focused window and switch to it when focusing back
that window. The Overview is considered a window for this purpose.

https://bugzilla.gnome.org/show_bug.cgi?id=691414
2013-01-14 11:11:00 +01:00
ca44977d92 status/keyboard: Only change the current source setting if it changed
This avoids all the work that goes on in various processes when
switching input sources if the activated source is the currently
configured one.

https://bugzilla.gnome.org/show_bug.cgi?id=691414
2013-01-14 11:11:00 +01:00
bcf294475f Updated Slovenian translation 2013-01-12 23:03:41 +01:00
3b31774dd3 Fix remaining uses of transition-duration without time units
Commit 8be3c5ed21 changed the CSS parser
to only accept values with explicit time units.
2013-01-12 17:39:08 +01:00
c106347c59 Updated Uyghur translation
Signed-off-by: Gheyret Kenji <gheyret@gmail.com>
2013-01-12 14:30:08 +09:00
2679be9d97 Telepathy: lookup PATH when launching empathy-accounts
It might be installed only in the jhbuild path.

https://bugzilla.gnome.org/show_bug.cgi?id=691553
2013-01-11 16:27:53 +01:00
4d59368c7d Updated Slovenian translation 2013-01-10 21:37:09 +01:00
3f29680fb6 workspace: Use MetaButtonLayout to get side of close button
The current code parses the button-layout setting because MetaButtonLayout
was not usable from introspection. With that fixed, we can switch to
using meta_prefs_get_button_layout().

https://bugzilla.gnome.org/show_bug.cgi?id=689263
2013-01-10 00:08:55 +01:00
8f1df14ae7 Revert "Remove non-existing file to make intltool happy"
This reverts commit 8410fc38c9.

It very much exists. Do a 'git submodule init && git submodule update'.
2013-01-09 21:02:06 +01:00
7159e360d9 Update Simplified Chinese translation 2013-01-09 06:40:20 +08:00
65723bcac5 PowerMenu: increase padding to the left of the percentage
This avoids having the percentage and device label in close succession.

https://bugzilla.gnome.org/show_bug.cgi?id=689297
2013-01-08 23:30:02 +01:00
73ae451cb4 Updated slovak translation 2013-01-08 21:41:08 +01:00
dc0ea3a248 main: Remove unused 'background' property 2013-01-08 13:24:09 -05:00
9548cd8341 js: Explicitly dispose all cairo contexts
Due to limitations and bugs in SpiderMonkey's GC, wrapper objects
for cairo contexts and similar may not get cleaned up immediately
after repainting, leading to leaking memory. Explicitly disposing
of such objects after they're not needed can clean up large portions
of memory for cairo surfaces.

https://bugzilla.gnome.org/show_bug.cgi?id=685513
2013-01-08 13:07:51 -05:00
8410fc38c9 Remove non-existing file to make intltool happy 2013-01-08 14:40:18 +01:00
0c9c2168b3 Updated minor fixes in Brazilian Portuguese translation contributed by F. Neves <florencioneves@gmail.com> 2013-01-08 10:32:34 -02:00
2690f54743 Updated Brazilian Portuguese translation 2013-01-08 10:17:45 -02:00
22783813c5 Update German translation 2013-01-07 15:38:44 +01:00
b5ed46a5af Updated Norwegian bokmål translation 2013-01-07 11:28:29 +01:00
1a3f17e296 Updated Kazakh translation 2013-01-06 20:22:44 +06:00
9281129f07 Really use the right getter
Doh, it is actually a uint, not an int.
2013-01-05 14:21:30 -05:00
0e9ddd3b99 Use the right getter
org.gnome.desktop.screensaver lock-delay is an integer, not
a boolean, so don't use get_bool() on it.

https://bugzilla.gnome.org/show_bug.cgi?id=691170
2013-01-04 22:01:25 -05:00
d87db04e55 panel: Update corners' nearest button on session mode change
With panel buttons changing dynamically on session mode changes we can
no longer rely on a corner's respective box style-changed signal to
find the nearest button.

Instead, make the panel take care of telling the corners to look for a
new button when buttons are changed.

https://bugzilla.gnome.org/show_bug.cgi?id=690180
2013-01-04 13:35:53 +00:00
906ec3c8a9 panel: Remove unused method
https://bugzilla.gnome.org/show_bug.cgi?id=690180
2013-01-04 13:35:47 +00:00
449575ceae keyboard: Don't hide or show the keyboard immediately
Acting on each Show/Hide DBus call immediately may cause a lot of
jittery movement when Alt+Tabbing or even just switching tabs in
e.g. gnome-terminal.

To make the OSK feel sturdier, we wait a bit before actually showing
or hiding it so that we can coalesce tight sequences of Show/Hide
calls. I.e. the last call wins which means that we might end up not
doing anything.

https://bugzilla.gnome.org/show_bug.cgi?id=688646
2013-01-04 13:13:15 +00:00
6255c77eba keyboard: Don't set keys as checked
There's no reason to do it and it actually breaks when showing subkeys
since then we won't get a 'key-released' signal for the main key.

https://bugzilla.gnome.org/show_bug.cgi?id=674955
2013-01-04 13:13:08 +00:00
c33622f2b3 keyboard: Fix subkeys handling
We can't pushModal() when showing the subkeys popup because that will
cause the application to lose focus and thus we get a Hide() call for
the whole OSK.

Instead, capture events on the main OSK actor while the subkeys popup
is shown so that we can both prevent events from reaching the main
keys but also cancel the subkeys if the user clicks away in the OSK.

https://bugzilla.gnome.org/show_bug.cgi?id=674955
2013-01-04 13:13:00 +00:00
e4860acb58 screenshot: use g_file_replace() when using an absolute path
Instead of g_file_create(), which always fails if the file exists
already.
2013-01-03 15:02:00 +01:00
e96867f757 screenshot: document the Screenshot interface
Use gdbus-codegen to generate a docbook for the screenshot interface,
and add it to our gtk-doc.

https://bugzilla.gnome.org/show_bug.cgi?id=688004
2013-01-03 12:56:46 +01:00
57bd43baf3 screenshot: move to a separate interface
Since we're breaking API already, take this as an occasion to use a
separate interface for all the screenshot-related methods. The interface
name is org.gnome.Shell.Screenshot.
Internally, move all the related code to screenshot.js.

https://bugzilla.gnome.org/show_bug.cgi?id=688004
2013-01-03 12:56:45 +01:00
3a4e595d32 screenshot: save to an unique path when using a basename
When a basename is passed, avoid filename conflicts. The unique path is
returned by the API.

https://bugzilla.gnome.org/show_bug.cgi?id=688004
2013-01-03 12:56:45 +01:00
dcad22bfa8 screenshot: change API to return the filename used for saving
Since we also support passing a basename now, clients might be
interested in knowing the path used to save the file.
Add an out argument to the interface for that.

https://bugzilla.gnome.org/show_bug.cgi?id=688004
2013-01-03 12:56:45 +01:00
acba0e47d8 screenshot: support non-absolute paths when saving screenshots
If a non-absolute path is passed to the screenshot methods, treat it as
a basename for the output image, and automatically try to save it in
$XDG_PICTURES_DIR, falling back to $HOME if it doesn't exist.

https://bugzilla.gnome.org/show_bug.cgi?id=688004
2013-01-03 12:56:45 +01:00
dd19459e18 Add a SelectArea() DBus method
This will be useful for e.g. selecting an area for a screenshot.

https://bugzilla.gnome.org/show_bug.cgi?id=687954
2013-01-03 12:56:45 +01:00
8be3c5ed21 St: fix parsing of transition-duration values
According to css3-transition, transition-duration is expressed
as a time, that is, in seconds or milliseconds. Fix that by
recognizing numbers with units and implicitly converting to
milliseconds after parsing.

https://bugzilla.gnome.org/show_bug.cgi?id=681376
2013-01-03 03:47:58 +01:00
51726d8de7 Fix regression from 4288761235 2013-01-03 02:48:22 +01:00
8f41c6bad8 UnlockDialog: honor org.gnome.desktop.screensaver.user-switch-enabled
The screensaver schema has a key that it is meant for locking down
the ability to switch user when the screen is locked, but support
for it was not implemented in the new screenshield.
Fix that by checking the key before creating the button.

https://bugzilla.gnome.org/show_bug.cgi?id=691042
2013-01-03 01:43:27 +01:00
e294abc567 keyboard: Remove leftover DBus import
This isn't there in newer versions of gjs.
2013-01-02 13:59:33 -05:00
9f9518c872 gnome-shell-plugin: Port event filter to XInput2
Otherwise, we'll see issues with tray icons.

https://bugzilla.gnome.org/show_bug.cgi?id=690590
2013-01-02 13:43:06 -05:00
5faf7cb59e gnome-shell-plugin: Extract crossing event ignores
This is a preliminary patch to make the diff in the next patch
cleaner. This just shuffles code around without changing anything.

https://bugzilla.gnome.org/show_bug.cgi?id=690590
2013-01-02 13:43:06 -05:00
4b095d532c st-texture-cache: Remove st_texture_cache_load_from_raw
This is now unused.

https://bugzilla.gnome.org/show_bug.cgi?id=691019
2013-01-02 12:32:29 -05:00
4288761235 remoteSearch: Use GIcon for loading icon data
This removes us from caching the pixbuf data in the icon cache,
and allows us to remove St.TextureCache.load_from_raw().

https://bugzilla.gnome.org/show_bug.cgi?id=691019
2013-01-02 12:32:29 -05:00
73388f30fd main: Add a better comment about shifting the modal stack
It took me a few minutes to realize why, so let's just add this
in for future reference.

https://bugzilla.gnome.org/show_bug.cgi?id=690965
2013-01-02 12:32:29 -05:00
2d9ddd4bc8 main: Rename curFocus to prevFocus
This better describes what we're tracking here: the previous
keyboard focus before pushing the modal.

https://bugzilla.gnome.org/show_bug.cgi?id=690965
2013-01-02 12:32:29 -05:00
55aa0cf303 main: Don't mess up the modal stack when the focus actor is destroyed
This seems to be an incorrect conversion when we moved from an array
to an object of keys in 3a6b4f3.

https://bugzilla.gnome.org/show_bug.cgi?id=690965
2013-01-02 12:32:29 -05:00
52ca15b514 grabHelper: Allow pressing escape on grab focus grabs
We didn't install the captured event handler on grab focus grabs,
leading to the case where we didn't ungrab correctly.

https://bugzilla.gnome.org/show_bug.cgi?id=690897
2013-01-02 12:32:29 -05:00
bd383888de notificationDaemon: Clean up icon/image handling
Make the logic for this clearer and easier to see.

https://bugzilla.gnome.org/show_bug.cgi?id=680414
2013-01-02 12:24:10 -05:00
1bd349485f notificationDaemon: Merge two pieces of similar code
Use the same code for parsing notification data to handle both
icons and images.

https://bugzilla.gnome.org/show_bug.cgi?id=680414
2012-12-30 14:09:39 -05:00
155f9dc1b1 messageTray: Support setImage(null) to mean unsetImage()
This is a quick API change that should clean up some conditionals.

https://bugzilla.gnome.org/show_bug.cgi?id=680414
2012-12-30 14:09:39 -05:00
fe7ee1edc3 notificationDaemon: Clean up code paths
While we really need to clean up the bad MessageTray API, this is
a quick step to allow for a cleaner codebase for the future.

https://bugzilla.gnome.org/show_bug.cgi?id=680414
2012-12-30 14:09:39 -05:00
c11cbff605 notificationDaemon: Prevent doing redundant work
We already calculated and created a gicon based on the icon and hints.

https://bugzilla.gnome.org/show_bug.cgi?id=680414
2012-12-30 14:09:39 -05:00
fbc629266f notificationDaemon: Fix style
https://bugzilla.gnome.org/show_bug.cgi?id=680414
2012-12-30 14:09:39 -05:00
75d44dca6b keyring: Actually ensure sensitivity when the keyring dialog opens
I misunderstood how the control flow for the keyring worked.

https://bugzilla.gnome.org/show_bug.cgi?id=690895
2012-12-30 14:09:39 -05:00
3e6b794a33 keyring: Fix copy/paste error
This was clearly meant to be continueButton.

https://bugzilla.gnome.org/show_bug.cgi?id=690895
2012-12-30 14:09:39 -05:00
a757ce48a1 ScreenShield: don't reset the lock screen animation if it's already happening
When you click Suspend from the user menu, the following things happen:
- we lock the screen internally by calling Main.screenShield.lock() and waiting
  for lock-screen-shown
- logind emits a Lock signal, which causes us to lock again
- gnome-settings-daemon notices PrepareForSleep, and calls org.gnome.ScreenSaver.Lock,
  just in case, so we lock once more
This means that, if you're lucky, you can see the curtain fall down multiple times,
as each .lock() call resets the animation.

https://bugzilla.gnome.org/show_bug.cgi?id=690858
2012-12-30 01:39:24 +01:00
507f29a7bd layout: Make OSK animation quicker, snappier
https://bugzilla.gnome.org/show_bug.cgi?id=688642
2012-12-30 00:12:27 +01:00
e5f4f77073 Updated Hungarian translation 2012-12-29 16:14:51 +01:00
f07fee538d keyboard: Show in an idle on clutter key focus changes
It's common to do actor.grab_key_focus() before the actor is mapped
which means that we can't reliably determine where the actor is at
notify::key-focus time and thus might end up showing the keyboard on
the wrong monitor.

This is happening, in particular, with the run dialog. Delaying until
we hit the main loop allows us to know where the actor finally is
before showing the OSK.

https://bugzilla.gnome.org/show_bug.cgi?id=685856
2012-12-28 13:00:15 -05:00
fa1420b384 lookingGlass: Move to an inspect() function
Rather than add invalid results to the place where you enter JavaScript
commands when you use the eyedropped, add an inspect() function and add
a fake call to it.

https://bugzilla.gnome.org/show_bug.cgi?id=690726
2012-12-28 03:20:37 -05:00
724a2bd72f Calendar: use text/calendar preferred app as the calendar app
That's what the info panel in g-c-c defines as the preferred calendar
application.

https://bugzilla.gnome.org/show_bug.cgi?id=690767
2012-12-27 19:05:52 +01:00
d525d02348 ScreenShield: honor lock-delay GSettings key
org.gnome.desktop.screensaver.lock-delay contains the grace period
of the screensaver: if deactivated within that many seconds from the
start of the idle period, the shell should not prompt for a password.
This setting correspond to the "Lock screen after" combo in screen
and privacy panels.

https://bugzilla.gnome.org/show_bug.cgi?id=690766
2012-12-27 19:05:44 +01:00
4920cf2b98 Updated Polish translation 2012-12-27 00:42:13 +01:00
f41d0938a4 shell-global: Drop unused variable
Leftover from 5566aa4588
2012-12-26 16:23:38 +01:00
924a405829 Updated Spanish translation 2012-12-26 11:59:17 +01:00
fc9225e24a keyring: Make sure the entries are insensitive after submission
https://bugzilla.gnome.org/show_bug.cgi?id=690594
2012-12-25 22:18:42 -05:00
ac202cbdd3 keyring: Don't use setButtons
https://bugzilla.gnome.org/show_bug.cgi?id=690594
2012-12-25 22:18:42 -05:00
cedd68c942 polkitAgent: Make sure the entries are insensitive after submission
It feels weird and strange to be able to type in the polkit agent
dialog after hitting enter.

https://bugzilla.gnome.org/show_bug.cgi?id=690594
2012-12-25 22:18:42 -05:00
4231c879ef polkitAgent: Don't use setButtons
https://bugzilla.gnome.org/show_bug.cgi?id=690594
2012-12-25 22:18:42 -05:00
42e58a4b72 modalDialog: Make the button layout visible always
With the last button-less modal dialog gone, there's no reason it
should ever be hidden.

https://bugzilla.gnome.org/show_bug.cgi?id=690594
2012-12-25 22:18:42 -05:00
ebd1bc83c9 Ping the active window when using the app menu
Use the new meta_window_check_alive() to verify if the application is
responding after the user activates an action from the app menu.
This in particular restores the ability to force quit applications
from the menu, even if the use a custom GMenu.

https://bugzilla.gnome.org/show_bug.cgi?id=684340
2012-12-25 18:41:22 +01:00
0bc9d7455f Updated Galician translations 2012-12-25 00:37:18 +01:00
5274166f8c layout: Fix strut heuristics for multi-monitor
Spotted while going through the code.

https://bugzilla.gnome.org/show_bug.cgi?id=690666
2012-12-23 21:17:40 -05:00
5566aa4588 shell-global: Remove hacks around clutter_event_get_current_time()
clutter_event_get_current_time() has been fixed upstream as part
of reentrant bug fixes, so there's no need for these shenanigans.

https://bugzilla.gnome.org/show_bug.cgi?id=690665
2012-12-23 21:17:40 -05:00
ab638a4f54 gnome-shell-jhbuild: Remove old envvar
This isn't used anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=690667
2012-12-23 21:17:40 -05:00
86a8452ab7 run-test: Load shell files from the srcdir
https://bugzilla.gnome.org/show_bug.cgi?id=690667
2012-12-23 21:17:26 -05:00
8c96c16eac Update Arabic translation 2012-12-23 18:35:16 +02:00
45c2e6575d Bluetooth: remove dead code
Notification.grabFocus doesn't exist anymore.

https://bugzilla.gnome.org/show_bug.cgi?id=687081
2012-12-23 13:32:13 +01:00
a786a7dc55 Revert "Remove a non-existing file"
This reverts commit 685262fc5e.

Please don't remove this file from POTFILES.in.

You need to run 'git submodule init && git submodule update' in your
git checkout. Damned Lies currently lacks support for submodules,
thus this error.
2012-12-21 20:43:42 +01:00
6adf5cbee5 Reverting "volume: Put canberra sound events on output streams only"
This reverts commit 1964b54627.

This was committed accidentally.
2012-12-21 13:28:46 -05:00
1964b54627 volume: Put canberra sound events on output streams only
This seems to be an oversight in the original volume menu code
that slipped in by accident.
2012-12-21 13:24:02 -05:00
c9d0e82c52 volume: Clean up stream/slider handling code
Rather than using naming schemes and dynamic property lookups as
a kind of namespace, use what was designed to be used as a namespace:
a class.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 13:23:48 -05:00
1a4948f0f2 volume: Pick up hasHeadphones from the signal handler
A preliminary patch for big cleanups happening soon.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 12:30:16 -05:00
66da3f5668 volume: Don't have a separate syncVisibility method
With it doing less now, we can simply do it inline.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 12:30:03 -05:00
9ebeb64570 volume: Don't set the visibility of the main icon
As the main icon is inside the actor, this is needless calculation.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 12:30:03 -05:00
571aaece2e volume: Merge the two update handlers
With our mess of callbacks gone, we can update stream volume
in a single place only.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 12:30:03 -05:00
f60fb954a2 volume: Make icon calculation stable
Calculate an icon based on our current state, not a mess of
signal emissions and callbacks. This is a preliminary basic
cleanup patch in preparation for the next one.

https://bugzilla.gnome.org/show_bug.cgi?id=690539
2012-12-21 12:30:03 -05:00
1d136cacfb lockScreenMenu: Construct actual panel icons much more accurately
Instead of faking it by adding a bunch of main icons and secondary
icons to our own box, try and recreate the original button box
with the original icons.

https://bugzilla.gnome.org/show_bug.cgi?id=690589
2012-12-21 12:28:00 -05:00
994021d77f panelMenu: Remove inaccurate comment
This has been out of date ever since the -symbolic fallbacks
have gone away.

https://bugzilla.gnome.org/show_bug.cgi?id=690589
2012-12-21 12:26:32 -05:00
8899325a0e boxpointer: Fix a small typo
This was showing up in my auto-complete results.
2012-12-21 12:24:48 -05:00
43876a9357 boxpointer: Defer re-allocation after a flip
As we may be flipping the box pointer in response to re-allocation,
like the addition of a new actor to the boxpointer, we can't queue
a re-layout while in a re-layout, so defer.

https://bugzilla.gnome.org/show_bug.cgi?id=690608
2012-12-21 12:24:48 -05:00
d6cace32f5 boxpointer: Don't use the box allocation when calculating the arrow side
Depending on the current state of arrowSide, the box allocation may be
wrong; e.g. if the user requested a TOP, but we flipped to a BOTTOM, the
next request would look to the y2 value of the flipped BOTTOM, which is
wrong.

Instead, use the origin, plus the calculated preferred size of the box.

https://bugzilla.gnome.org/show_bug.cgi?id=690608
2012-12-21 12:24:48 -05:00
2388de455b boxpointer: Rework how flipping works
Make sure we re-allocate after we flip sides, to ensure that
padding around the child actor is updated correctly. Additionally,
ensure that we flip after we setPosition, as we won't get re-allocated
auotmatically by just changing the position.

https://bugzilla.gnome.org/show_bug.cgi?id=690608
2012-12-21 12:24:48 -05:00
b14b3ab276 boxpointer: Clean up reposition
Given that it's modifying state, there's no reason it can't be
using it instead. This makes it easier to use, so we aren't passing
in a bunch of instance variables every time.

https://bugzilla.gnome.org/show_bug.cgi?id=690608
2012-12-21 12:24:48 -05:00
32ccb779c6 theme: notification improvements
Tweak the layout to give more space to action buttons, associate
the heading with the body text, and give button labels a regular
font weight.

https://bugzilla.gnome.org/show_bug.cgi?id=688506
2012-12-21 11:37:48 +00:00
52536e94e5 st-scroll-view: Fix build with -Werror=maybe-uninitialized 2012-12-20 23:01:13 +01:00
5d6b3abd26 st-adjustment: Add missing math.h include 2012-12-20 23:01:13 +01:00
79682bbcb0 Updated Lithuanian translation 2012-12-20 23:55:18 +02:00
770ff19313 workspace: Add smooth scrolling support to zoom windows
https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-12-20 08:40:05 -05:00
8d4855f100 volume: Add smooth scrolling to adjust output volume
Allow users to smoothly scroll on the volume indicator icon
to adjust the volume. Do this by simply passing the scroll
event to the slider inside the menu.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-12-20 08:40:04 -05:00
7d4e14f384 popupMenu: Add smooth scrolling support for sliders
Allowing smooth scrolling on the Y axis to accurately adjust the value
of the slider.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-12-20 08:40:04 -05:00
f162dd7e87 scroll-bar: Add smooth scrolling support
Do the same for StScrollBar.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-12-20 08:40:04 -05:00
06dc12e217 scroll-view: Add proper smooth scrolling
The code here before was added as dummy code to satisfy an error
in the missing switch, and wasn't ever tested due to the lack of XI2
in mutter. Use the same math as GtkRange does to calculate scroll bar
positions from raw XI2 deltas to allow for proper smooth scrolling.

https://bugzilla.gnome.org/show_bug.cgi?id=687573
2012-12-20 08:40:04 -05:00
36edff9e15 Updated Hebrew translation. 2012-12-20 13:37:03 +02:00
34a0c079de power: Update for new D-Bus name
https://bugzilla.gnome.org/show_bug.cgi?id=690506
2012-12-19 17:18:32 +01:00
84b581ae13 Crisp menu separators
Instead of being fuzzy, the menu separators should be a clear
line with a horizontal gradient. This looks better and is
consistent with the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=641745
2012-12-19 15:45:18 +00:00
587c93eadf StDrawingArea: fix texture drawing
cogl_rectangle() wants the four rectangle corners, not the size.

https://bugzilla.gnome.org/show_bug.cgi?id=641745
2012-12-19 15:45:18 +00:00
b5aa549e0c [l10n] Updated Estonian translation 2012-12-19 17:14:03 +02:00
5fb6738612 Updated Norwegian bokmål translation 2012-12-19 15:45:24 +01:00
685262fc5e Remove a non-existing file 2012-12-19 15:45:21 +01:00
8802f6cf23 Updated Slovenian translation 2012-12-19 11:38:43 +01:00
72 changed files with 9497 additions and 7090 deletions

37
NEWS
View File

@ -1,3 +1,40 @@
3.7.4
=====
* Make menu separators crisp [Giovanni, Allan; #641745]
* power: Update for new D-Bus name [Bastien; #690506]
* Add smooth scrolling support [Jasper; #687573]
* Tweak notification layout [Allan; #688506]
* Ping the active window when using the app menu [Giovanni; #684340]
* Make password entries insensitive after submission [Jasper; #690594, #690895]
* Honor lock-delay GSettings key [Giovanni, Matthias; #690766, #691170]
* Use text/calendar preferred app as the calendar app [Giovanni; #690767]
* lookingGlass: Move to an inspect() function [Jasper; #690726]
* Make OSK animation quicker, snappier [Rui; #688642]
* Allow to close chat notifications with Escape [Jasper; #690897]
* Honor org.gnome.desktop.screensaver.user-switch-enabled [Giovanni; #691042]
* Add a SelectArea() DBus method [Cosimo; #687954]
* Support non-absolute paths when saving screenshots [Cosimo; #688004]
* OSK: Fix extended keys popups [Rui; #674955]
* Don't hide or show the keyboard immediately [Rui; #688646]
* Improve padding in power menu [Giovanni; #689297]
* Add per-window input source switching [Rui; #691414]
* Misc bug fixes and cleanups [Rico, Jasper, Giovanni, Rui, Florian, Dan;
#690608, #690589, #690539, #687081, #690667, #690665, #690666, #685856,
#690858, #690895, #680414, #690965, #691019, #690590, #681376, #690180,
#685513, #689263, #691553, #691720, #691743, #691750]
Contributors:
Giovanni Campagna, Cosimo Cecchi, Matthias Clasen, Allan Day, Rui Matos,
Florian Müllner, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz,
Dan Winship
Translations:
Matej Urbančič [sl], Kjartan Maraas [nb], Mattias Põldaru [et],
Yaron Shahrabani [he], Aurimas Černius [lt], Khaled Hosny [ar],
Fran Diéguez [gl], Daniel Mustieles [es], Piotr Drąg [pl], Balázs Úr [hu],
Baurzhan Muftakhidinov [kk], Tobias Endrigkeit [de], Dušan Kazik [sk],
Aron Xu [zh_CN], Gheyret Kenji [ug]
3.7.3 3.7.3
===== =====
* Add 'No Messages' label when message tray is empty [Victoria; #686738] * Add 'No Messages' label when message tray is empty [Victoria; #686738]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.7.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.7.4],[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])
@ -65,7 +65,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11 CLUTTER_MIN_VERSION=1.11.11
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.33.2 GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.7.3 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
@ -78,7 +78,7 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90 GCR_MIN_VERSION=3.3.90
GNOME_DESKTOP_REQUIRED_VERSION=3.7.1 GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
GNOME_MENUS_REQUIRED_VERSION=3.5.3 GNOME_MENUS_REQUIRED_VERSION=3.5.3
NETWORKMANAGER_MIN_VERSION=0.9.7 NETWORKMANAGER_MIN_VERSION=0.9.6
PULSE_MIN_VERS=2.0 PULSE_MIN_VERS=2.0
# Collect more than 20 libraries for a prize! # Collect more than 20 libraries for a prize!

View File

@ -12,6 +12,7 @@ desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
introspectiondir = $(datadir)/dbus-1/interfaces introspectiondir = $(datadir)/dbus-1/interfaces
introspection_DATA = \ introspection_DATA = \
org.gnome.Shell.Screenshot.xml \
org.gnome.ShellSearchProvider.xml \ org.gnome.ShellSearchProvider.xml \
org.gnome.ShellSearchProvider2.xml org.gnome.ShellSearchProvider2.xml

View File

@ -0,0 +1,128 @@
<!DOCTYPE node PUBLIC
'-//freedesktop//DTD D-BUS Object Introspection 1.0//EN'
'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>
<node>
<!--
org.gnome.Shell.Screenshot:
@short_description: Screenshot interface
The interface used to capture pictures of the screen contents.
-->
<interface name="org.gnome.Shell.Screenshot">
<!--
Screenshot:
@filename: The filename for the screenshot
@include_cursor: Whether to include the cursor image or not
@flash: Whether to flash the screen or not
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the whole screen and saves it
in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
ScreenshotWindow:
@include_frame: Whether to include the frame or not
@include_cursor: Whether to include the cursor image or not
@flash: Whether to flash the window area or not
@filename: The filename for the screenshot
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the focused window (optionally omitting the frame)
and saves it in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
ScreenshotArea:
@x: the X coordinate of the area to capture
@y: the Y coordinate of the area to capture
@width: the width of the area to capture
@height: the height of the area to capture
@flash: whether to flash the area or not
@filename: the filename for the screenshot
@success: whether the screenshot was captured
@filename_used: the file where the screenshot was saved
Takes a screenshot of the passed in area and saves it
in @filename as png image, it returns a boolean
indicating whether the operation was successful or not.
@filename can either be an absolute path or a basename, in
which case the screenshot will be saved in the $XDG_PICTURES_DIR
or the home directory if it doesn't exist. The filename used
to save the screenshot will be returned in @filename_used.
-->
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<!--
FlashArea:
@x: the X coordinate of the area to flash
@y: the Y coordinate of the area to flash
@width: the width of the area to flash
@height: the height of the area to flash
Renders a flash spot effect in the specified rectangle of the screen.
-->
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
<!--
SelectArea:
@x: the X coordinate of the selected area
@y: the Y coordinate of the selected area
@width: the width of the selected area
@height: the height of the selected area
Interactively allows the user to select a rectangular area of
the screen, and returns its coordinates.
-->
<method name="SelectArea">
<arg type="i" direction="out" name="x"/>
<arg type="i" direction="out" name="y"/>
<arg type="i" direction="out" name="width"/>
<arg type="i" direction="out" name="height"/>
</method>
</interface>
</node>

View File

@ -206,11 +206,12 @@ StScrollBar StButton#vhandle:active {
} }
.popup-separator-menu-item { .popup-separator-menu-item {
-gradient-height: 2px; -gradient-height: 1px;
-gradient-start: rgba(8,8,8,0); -gradient-start: rgba(255,255,255,0.0);
-gradient-end: #333333; -gradient-end: rgba(255,255,255,0.3);
-margin-horizontal: 1.5em; -margin-horizontal: 24px;
height: 1em; height: 1px;
padding: 8px 0px;
} }
.popup-alternating-menu-item:alternate { .popup-alternating-menu-item:alternate {
@ -251,6 +252,10 @@ StScrollBar StButton#vhandle:active {
icon-size: 1.09em; icon-size: 1.09em;
} }
.popup-battery-percentage {
padding-left: 24px;
}
/* Switches */ /* Switches */
.toggle-switch { .toggle-switch {
width: 65px; width: 65px;
@ -287,13 +292,17 @@ StScrollBar StButton#vhandle:active {
.hotplug-notification-item, .hotplug-notification-item,
.hotplug-resident-eject-button, .hotplug-resident-eject-button,
.modal-dialog-button { .modal-dialog-button {
font-weight: bold;
border: 1px solid #8b8b8b; border: 1px solid #8b8b8b;
background-gradient-direction: vertical; background-gradient-direction: vertical;
background-gradient-start: rgba(255, 255, 255, 0.2); background-gradient-start: rgba(255, 255, 255, 0.2);
background-gradient-end: rgba(255, 255, 255, 0); background-gradient-end: rgba(255, 255, 255, 0);
} }
.dash-search-button,
.modal-dialog-button {
font-weight: bold;
}
.dash-search-button:hover, .dash-search-button:hover,
.notification-button:hover, .notification-button:hover,
.notification-icon-button:hover, .notification-icon-button:hover,
@ -354,7 +363,7 @@ StScrollBar StButton#vhandle:active {
background-gradient-start: rgba(5,5,6,0.1); background-gradient-start: rgba(5,5,6,0.1);
background-gradient-end: rgba(254,254,254,0.1); background-gradient-end: rgba(254,254,254,0.1);
background-gradient-direction: vertical; background-gradient-direction: vertical;
transition-duration: 300; transition-duration: 300ms;
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6); box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
} }
@ -389,7 +398,7 @@ StScrollBar StButton#vhandle:active {
color: rgb(64, 64, 64); color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64); caret-color: rgb(64, 64, 64);
font-weight: bold; font-weight: bold;
transition-duration: 0; transition-duration: 0ms;
} }
.notification StEntry, .notification StEntry,
@ -420,7 +429,7 @@ StScrollBar StButton#vhandle:active {
background-color: black; background-color: black;
font-weight: bold; font-weight: bold;
height: 1.86em; height: 1.86em;
transition-duration: 250; transition-duration: 250ms;
} }
#panel.lock-screen { #panel.lock-screen {
@ -503,7 +512,7 @@ StScrollBar StButton#vhandle:active {
-minimum-hpadding: 6px; -minimum-hpadding: 6px;
font-weight: bold; font-weight: bold;
color: #ccc; color: #ccc;
transition-duration: 100; transition-duration: 100ms;
} }
#panel.unlock-screen .panel-button, #panel.unlock-screen .panel-button,
@ -917,7 +926,7 @@ StScrollBar StButton#vhandle:active {
border-radius: 4px; border-radius: 4px;
padding: 3px; padding: 3px;
border: 1px rgba(0,0,0,0); border: 1px rgba(0,0,0,0);
transition-duration: 100; transition-duration: 100ms;
text-align: center; text-align: center;
} }
@ -934,7 +943,7 @@ StScrollBar StButton#vhandle:active {
.grid-search-result:hover .overview-icon { .grid-search-result:hover .overview-icon {
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
transition-duration: 100; transition-duration: 100ms;
color:white; color:white;
} }
@ -956,13 +965,13 @@ StScrollBar StButton#vhandle:active {
background-gradient-direction: vertical; background-gradient-direction: vertical;
border-radius: 4px; border-radius: 4px;
box-shadow: inset 0px 1px 2px 0px rgba(0, 0, 0, 1); box-shadow: inset 0px 1px 2px 0px rgba(0, 0, 0, 1);
transition-duration: 100; transition-duration: 100ms;
} }
.show-apps:checked .show-apps-icon, .show-apps:checked .show-apps-icon,
.show-apps:focus .show-apps-icon { .show-apps:focus .show-apps-icon {
color: white; color: white;
transition-duration: 100; transition-duration: 100ms;
} }
.app-well-app:focus > .overview-icon, .app-well-app:focus > .overview-icon,
@ -1001,7 +1010,7 @@ StScrollBar StButton#vhandle:active {
-minimum-hpadding: 6px; -minimum-hpadding: 6px;
font-weight: bold; font-weight: bold;
color: #ccc; color: #ccc;
transition-duration: 100; transition-duration: 100ms;
padding-left: .3em; padding-left: .3em;
padding-right: .3em; padding-right: .3em;
} }
@ -1304,7 +1313,8 @@ 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: 250; transition-duration: 250ms;
height: 72px;
} }
#message-tray:keyboard { #message-tray:keyboard {
@ -1331,7 +1341,7 @@ StScrollBar StButton#vhandle:active {
border-radius: 10px 10px 0px 0px; border-radius: 10px 10px 0px 0px;
background: rgba(0,0,0,0.9); background: rgba(0,0,0,0.9);
padding: 8px 8px 4px 8px; padding: 8px 8px 4px 8px;
spacing-rows: 10px; spacing-rows: 4px;
spacing-columns: 10px; spacing-columns: 10px;
} }
@ -1411,6 +1421,7 @@ StScrollBar StButton#vhandle:active {
} }
.notification-actions { .notification-actions {
padding-top: 18px;
spacing: 10px; spacing: 10px;
} }
@ -1573,7 +1584,7 @@ StScrollBar StButton#vhandle:active {
.summary-source { .summary-source {
border-radius: 4px; border-radius: 4px;
padding: 0 6px 0 6px; padding: 0 6px 0 6px;
transition-duration: 100; transition-duration: 100ms;
} }
.summary-source-counter { .summary-source-counter {

View File

@ -88,11 +88,18 @@ doc-gen-org.gnome.Shell.SearchProvider2.xml: $(top_srcdir)/data/org.gnome.ShellS
--generate-docbook doc-gen \ --generate-docbook doc-gen \
$(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml $(top_srcdir)/data/org.gnome.ShellSearchProvider2.xml
doc-gen-org.gnome.Shell.Screenshot.xml: $(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
gdbus-codegen \
--interface-prefix org.gnome.Shell.Screenshot. \
--generate-docbook doc-gen \
$(top_srcdir)/data/org.gnome.Shell.Screenshot.xml
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
# e.g. content_files=running.sgml building.sgml changes-2.0.sgml # e.g. content_files=running.sgml building.sgml changes-2.0.sgml
content_files= \ content_files= \
doc-gen-org.gnome.Shell.SearchProvider.xml \ doc-gen-org.gnome.Shell.SearchProvider.xml \
doc-gen-org.gnome.Shell.SearchProvider2.xml doc-gen-org.gnome.Shell.SearchProvider2.xml \
doc-gen-org.gnome.Shell.Screenshot.xml
# SGML files where gtk-doc abbrevations (#GtkWidget) are expanded # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded
# These files must be listed here *and* in content_files # These files must be listed here *and* in content_files

View File

@ -49,7 +49,6 @@ nobase_dist_js_DATA = \
ui/extensionSystem.js \ ui/extensionSystem.js \
ui/extensionDownloader.js \ ui/extensionDownloader.js \
ui/environment.js \ ui/environment.js \
ui/flashspot.js \
ui/ibusCandidatePopup.js\ ui/ibusCandidatePopup.js\
ui/grabHelper.js \ ui/grabHelper.js \
ui/iconGrid.js \ ui/iconGrid.js \
@ -74,6 +73,7 @@ nobase_dist_js_DATA = \
ui/popupMenu.js \ ui/popupMenu.js \
ui/remoteSearch.js \ ui/remoteSearch.js \
ui/runDialog.js \ ui/runDialog.js \
ui/screenshot.js \
ui/screenShield.js \ ui/screenShield.js \
ui/scripting.js \ ui/scripting.js \
ui/search.js \ ui/search.js \

View File

@ -532,6 +532,7 @@ const SessionListItem = new Lang.Class({
color.alpha / 255); color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI); cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill(); cr.fill();
cr.$dispose();
}, },
_onClicked: function() { _onClicked: function() {

View File

@ -220,25 +220,8 @@ const BoxPointer = new Lang.Class({
this.bin.allocate(childBox, flags); this.bin.allocate(childBox, flags);
if (this._sourceActor && this._sourceActor.mapped) { if (this._sourceActor && this._sourceActor.mapped) {
this._reposition(this._sourceActor, this._arrowAlignment); this._reposition();
this._updateFlip();
if (this._shouldFlip()) {
switch (this._arrowSide) {
case St.Side.TOP:
this._arrowSide = St.Side.BOTTOM;
break;
case St.Side.BOTTOM:
this._arrowSide = St.Side.TOP;
break;
case St.Side.LEFT:
this._arrowSide = St.Side.RIGHT;
break;
case St.Side.RIGHT:
this._arrowSide = St.Side.LEFT;
break;
}
this._reposition(this._sourceActor, this._arrowAlignment);
}
} }
}, },
@ -405,11 +388,11 @@ const BoxPointer = new Lang.Class({
cr.setLineWidth(borderWidth); cr.setLineWidth(borderWidth);
cr.stroke(); cr.stroke();
} }
cr.$dispose();
}, },
setPosition: function(sourceActor, alignment) { setPosition: function(sourceActor, alignment) {
this._arrowSide = this._userArrowSide;
// We need to show it now to force an allocation, // We need to show it now to force an allocation,
// so that we can query the correct size. // so that we can query the correct size.
this.actor.show(); this.actor.show();
@ -417,7 +400,8 @@ const BoxPointer = new Lang.Class({
this._sourceActor = sourceActor; this._sourceActor = sourceActor;
this._arrowAlignment = alignment; this._arrowAlignment = alignment;
this._reposition(sourceActor, alignment); this._reposition();
this._updateFlip();
}, },
setSourceAlignment: function(alignment) { setSourceAlignment: function(alignment) {
@ -429,7 +413,10 @@ const BoxPointer = new Lang.Class({
this.setPosition(this._sourceActor, this._arrowAlignment); this.setPosition(this._sourceActor, this._arrowAlignment);
}, },
_reposition: function(sourceActor, alignment) { _reposition: function() {
let sourceActor = this._sourceActor;
let alignment = this._arrowAlignment;
// Position correctly relative to the sourceActor // Position correctly relative to the sourceActor
let sourceNode = sourceActor.get_theme_node(); let sourceNode = sourceActor.get_theme_node();
let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box()); let sourceContentBox = sourceNode.get_content_box(sourceActor.get_allocation_box());
@ -553,7 +540,7 @@ const BoxPointer = new Lang.Class({
_shiftActor : function() { _shiftActor : function() {
// Since the position of the BoxPointer depends on the allocated size // Since the position of the BoxPointer depends on the allocated size
// of the BoxPointer and the position of the source actor, trying // of the BoxPointer and the position of the source actor, trying
// to position the BoxPoiner via the x/y properties will result in // to position the BoxPointer via the x/y properties will result in
// allocation loops and warnings. Instead we do the positioning via // allocation loops and warnings. Instead we do the positioning via
// the anchor point, which is independent of allocation, and leave // the anchor point, which is independent of allocation, and leave
// x == y == 0. // x == y == 0.
@ -561,37 +548,47 @@ const BoxPointer = new Lang.Class({
-(this._yPosition + this._yOffset)); -(this._yPosition + this._yOffset));
}, },
_shouldFlip: function() { _calculateArrowSide: function(arrowSide) {
let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor); let sourceAllocation = Shell.util_get_transformed_allocation(this._sourceActor);
let boxAllocation = Shell.util_get_transformed_allocation(this.actor); let [minWidth, minHeight, boxWidth, boxHeight] = this._container.get_preferred_size();
let boxWidth = boxAllocation.x2 - boxAllocation.x1;
let boxHeight = boxAllocation.y2 - boxAllocation.y1;
let monitor = Main.layoutManager.findMonitorForActor(this.actor); let monitor = Main.layoutManager.findMonitorForActor(this.actor);
switch (this._arrowSide) { switch (arrowSide) {
case St.Side.TOP: case St.Side.TOP:
if (boxAllocation.y2 > monitor.y + monitor.height && if (sourceAllocation.y2 + boxHeight > monitor.y + monitor.height &&
boxHeight < sourceAllocation.y1 - monitor.y) boxHeight < sourceAllocation.y1 - monitor.y)
return true; return St.Side.BOTTOM;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
if (boxAllocation.y1 < monitor.y && if (sourceAllocation.y1 - boxHeight < monitor.y &&
boxHeight < monitor.y + monitor.height - sourceAllocation.y2) boxHeight < monitor.y + monitor.height - sourceAllocation.y2)
return true; return St.Side.TOP;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
if (boxAllocation.x2 > monitor.x + monitor.width && if (sourceAllocation.y2 + boxWidth > monitor.x + monitor.width &&
boxWidth < sourceAllocation.x1 - monitor.x) boxWidth < sourceAllocation.x1 - monitor.x)
return true; return St.Side.RIGHT;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
if (boxAllocation.x1 < monitor.x && if (sourceAllocation.y1 - boxWidth < monitor.x &&
boxWidth < monitor.x + monitor.width - sourceAllocation.x2) boxWidth < monitor.x + monitor.width - sourceAllocation.x2)
return true; return St.Side.LEFT;
break; break;
} }
return arrowSide;
},
_updateFlip: function() {
let arrowSide = this._calculateArrowSide(this._userArrowSide);
if (this._arrowSide != arrowSide) {
this._arrowSide = arrowSide;
this._reposition();
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
this._container.queue_relayout();
return false; return false;
}));
}
}, },
set xOffset(offset) { set xOffset(offset) {

View File

@ -60,18 +60,14 @@ const KeyringDialog = new Lang.Class({
this._controlTable = null; this._controlTable = null;
let buttons = [{ label: '',
action: Lang.bind(this, this._onCancelButton),
key: Clutter.Escape
},
{ label: '',
action: Lang.bind(this, this._onContinueButton),
default: true
}]
this.setButtons(buttons); this._cancelButton = this.addButton({ label: '',
this._cancelButton = buttons[0].button; action: Lang.bind(this, this._onCancelButton),
this._continueButton = buttons[1].button; key: Clutter.Escape });
this._continueButton = this.addButton({ label: '',
action: Lang.bind(this, this._onContinueButton),
default: true },
{ expand: true, x_fill: false, x_align: St.Align.END });
this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('cancel-label', this._cancelButton, 'label', GObject.BindingFlags.SYNC_CREATE);
this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE); this.prompt.bind_property('continue-label', this._continueButton, 'label', GObject.BindingFlags.SYNC_CREATE);
@ -146,6 +142,14 @@ const KeyringDialog = new Lang.Class({
this._messageBox.add(table, { x_fill: true, y_fill: true }); this._messageBox.add(table, { x_fill: true, y_fill: true });
}, },
_updateSensitivity: function(sensitive) {
this._passwordEntry.reactive = sensitive;
this._passwordEntry.clutter_text.editable = sensitive;
this._continueButton.can_focus = sensitive;
this._continueButton.reactive = sensitive;
},
_ensureOpen: function() { _ensureOpen: function() {
// NOTE: ModalDialog.open() is safe to call if the dialog is // NOTE: ModalDialog.open() is safe to call if the dialog is
// already open - it just returns true without side-effects // already open - it just returns true without side-effects
@ -167,12 +171,14 @@ const KeyringDialog = new Lang.Class({
_onShowPassword: function(prompt) { _onShowPassword: function(prompt) {
this._buildControlTable(); this._buildControlTable();
this._ensureOpen(); this._ensureOpen();
this._updateSensitivity(true);
this._passwordEntry.grab_key_focus(); this._passwordEntry.grab_key_focus();
}, },
_onShowConfirm: function(prompt) { _onShowConfirm: function(prompt) {
this._buildControlTable(); this._buildControlTable();
this._ensureOpen(); this._ensureOpen();
this._updateSensitivity(true);
this._continueButton.grab_key_focus(); this._continueButton.grab_key_focus();
}, },
@ -192,6 +198,7 @@ const KeyringDialog = new Lang.Class({
}, },
_onContinueButton: function() { _onContinueButton: function() {
this._updateSensitivity(false);
this.prompt.complete(); this.prompt.complete();
}, },

View File

@ -159,14 +159,13 @@ const AuthenticationDialog = new Lang.Class({
messageBox.add(this._nullMessageLabel); messageBox.add(this._nullMessageLabel);
this._nullMessageLabel.show(); this._nullMessageLabel.show();
this.setButtons([{ label: _("Cancel"), this._cancelButton = this.addButton({ label: _("Cancel"),
action: Lang.bind(this, this.cancel), action: Lang.bind(this, this.cancel),
key: Clutter.Escape key: Clutter.Escape });
}, this._okButton = this.addButton({ label: _("Authenticate"),
{ label: _("Authenticate"),
action: Lang.bind(this, this._onAuthenticateButtonPressed), action: Lang.bind(this, this._onAuthenticateButtonPressed),
default: true default: true },
}]); { expand: true, x_fill: false, x_align: St.Align.END });
this._doneEmitted = false; this._doneEmitted = false;
@ -214,8 +213,17 @@ const AuthenticationDialog = new Lang.Class({
} }
}, },
_updateSensitivity: function(sensitive) {
this._passwordEntry.reactive = sensitive;
this._passwordEntry.clutter_text.editable = sensitive;
this._okButton.can_focus = sensitive;
this._okButton.reactive = sensitive;
},
_onEntryActivate: function() { _onEntryActivate: function() {
let response = this._passwordEntry.get_text(); let response = this._passwordEntry.get_text();
this._updateSensitivity(false);
this._session.response(response); this._session.response(response);
// When the user responds, dismiss already shown info and // When the user responds, dismiss already shown info and
// error texts (if any) // error texts (if any)
@ -269,6 +277,7 @@ const AuthenticationDialog = new Lang.Class({
this._passwordBox.show(); this._passwordBox.show();
this._passwordEntry.set_text(''); this._passwordEntry.set_text('');
this._passwordEntry.grab_key_focus(); this._passwordEntry.grab_key_focus();
this._updateSensitivity(true);
this._ensureOpen(); this._ensureOpen();
}, },

View File

@ -1346,9 +1346,8 @@ const AccountNotification = new Lang.Class({
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) { switch (action) {
case 'view': case 'view':
let cmd = '/usr/bin/empathy-accounts' let cmd = 'empathy-accounts --select-account=' +
+ ' --select-account=%s' account.get_path_suffix();
.format(account.get_path_suffix());
let app_info = Gio.app_info_create_from_commandline(cmd, null, 0); let app_info = Gio.app_info_create_from_commandline(cmd, null, 0);
app_info.launch([], global.create_app_launch_context()); app_info.launch([], global.create_app_launch_context());
break; break;

View File

@ -32,6 +32,7 @@ function _onVertSepRepaint (area)
cr.setDash([1, 3], 1); // Hard-code for now cr.setDash([1, 3], 1); // Hard-code for now
cr.setLineWidth(stippleWidth); cr.setLineWidth(stippleWidth);
cr.stroke(); cr.stroke();
cr.$dispose();
}; };
const DateMenuButton = new Lang.Class({ const DateMenuButton = new Lang.Class({
@ -113,11 +114,6 @@ const DateMenuButton = new Lang.Class({
this._openCalendarItem.actor.can_focus = false; this._openCalendarItem.actor.can_focus = false;
vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false}); vbox.add(this._openCalendarItem.actor, {y_align: St.Align.END, expand: true, y_fill: false});
this._calendarSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.office.calendar' });
this._calendarSettings.connect('changed::exec',
Lang.bind(this, this._calendarSettingsChanged));
this._calendarSettingsChanged();
// 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) {
@ -151,12 +147,6 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated(); this._sessionUpdated();
}, },
_calendarSettingsChanged: function() {
let exec = this._calendarSettings.get_string('exec');
let fullExec = GLib.find_program_in_path(exec);
this._openCalendarItem.actor.visible = fullExec != 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;
@ -205,24 +195,8 @@ const DateMenuButton = new Lang.Class({
_onOpenCalendarActivate: function() { _onOpenCalendarActivate: function() {
this.menu.close(); this.menu.close();
let tool = this._calendarSettings.get_string('exec');
if (tool.length == 0 || tool.substr(0, 9) == 'evolution') { let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
// TODO: pass the selected day app.launch([], global.create_app_launch_context());
let app = Shell.AppSystem.get_default().lookup_app('evolution-calendar.desktop');
app.activate();
} else {
let needTerm = this._calendarSettings.get_boolean('needs-term');
if (needTerm) {
let terminalSettings = new Gio.Settings({ schema: 'org.gnome.desktop.default-applications.terminal' });
let term = terminalSettings.get_string('exec');
let arg = terminalSettings.get_string('exec-arg');
if (arg != '')
Util.spawn([term, arg, tool]);
else
Util.spawn([term, tool]);
} else {
Util.spawnCommandLine(tool)
}
}
} }
}); });

View File

@ -1,45 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Lang = imports.lang;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const FLASHSPOT_ANIMATION_TIME = 0.25; // seconds
const Flashspot = new Lang.Class({
Name: 'Flashspot',
Extends: Lightbox.Lightbox,
_init: function(area) {
this.parent(Main.uiGroup, { inhibitEvents: true,
width: area.width,
height: area.height });
this.actor.style_class = 'flashspot';
this.actor.set_position(area.x, area.y);
},
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();
},
_onFireShowComplete: function() {
Tweener.addTween(this.actor,
{ opacity: 0,
time: FLASHSPOT_ANIMATION_TIME,
transition: 'linear',
onComplete: Lang.bind(this, function() {
this.destroy();
})
});
}
});

View File

@ -183,6 +183,9 @@ const GrabHelper = new Lang.Class({
else if (hadFocus || params.grabFocus) else if (hadFocus || params.grabFocus)
_navigateActor(newFocus); _navigateActor(newFocus);
if ((params.grabFocus || params.modal) && !this._capturedEventId)
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._grabStack.push(params); this._grabStack.push(params);
return true; return true;
}, },
@ -192,8 +195,6 @@ const GrabHelper = new Lang.Class({
if (firstGrab) { if (firstGrab) {
if (!Main.pushModal(this._owner, this._modalParams)) if (!Main.pushModal(this._owner, this._modalParams))
return false; return false;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
} }
this._modalCount++; this._modalCount++;
@ -205,11 +206,6 @@ const GrabHelper = new Lang.Class({
if (this._modalCount > 0) if (this._modalCount > 0)
return; return;
if (this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
Main.popModal(this._owner); Main.popModal(this._owner);
global.sync_pointer(); global.sync_pointer();
}, },
@ -308,6 +304,11 @@ const GrabHelper = new Lang.Class({
this._releaseFocusGrab(); this._releaseFocusGrab();
} }
if (!this.grabbed && this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
if (hadFocus) { if (hadFocus) {
let poppedGrab = poppedGrabs[0]; let poppedGrab = poppedGrabs[0];
_navigateActor(poppedGrab.savedFocus); _navigateActor(poppedGrab.savedFocus);
@ -316,6 +317,13 @@ const GrabHelper = new Lang.Class({
_onCapturedEvent: function(actor, event) { _onCapturedEvent: function(actor, event) {
let type = event.type(); let type = event.type();
if (type == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_Escape) {
this.ungrab({ isUser: true });
return true;
}
let press = type == Clutter.EventType.BUTTON_PRESS; let press = type == Clutter.EventType.BUTTON_PRESS;
let release = type == Clutter.EventType.BUTTON_RELEASE; let release = type == Clutter.EventType.BUTTON_RELEASE;
let button = press || release; let button = press || release;
@ -328,12 +336,6 @@ const GrabHelper = new Lang.Class({
if (!button && this._modalCount == 0) if (!button && this._modalCount == 0)
return false; return false;
if (type == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_Escape) {
this.ungrab({ isUser: true });
return true;
}
if (this._isWithinGrabbedActor(event.get_source())) if (this._isWithinGrabbedActor(event.get_source()))
return false; return false;

View File

@ -2,18 +2,21 @@
const Caribou = imports.gi.Caribou; const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const Layout = imports.ui.layout;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const KEYBOARD_REST_TIME = Layout.KEYBOARD_ANIMATION_TIME * 2 * 1000;
const KEYBOARD_SCHEMA = 'org.gnome.shell.keyboard'; const KEYBOARD_SCHEMA = 'org.gnome.shell.keyboard';
const KEYBOARD_TYPE = 'keyboard-type'; const KEYBOARD_TYPE = 'keyboard-type';
@ -56,14 +59,7 @@ const Key = new Lang.Class({
if (this._key.name == 'Control_L' || this._key.name == 'Alt_L') if (this._key.name == 'Control_L' || this._key.name == 'Alt_L')
this._key.latch = true; this._key.latch = true;
this._key.connect('key-pressed', Lang.bind(this, function ()
{ this.actor.checked = true }));
this._key.connect('key-released', Lang.bind(this, function ()
{ this.actor.checked = false; }));
if (this._extended_keys.length > 0) { if (this._extended_keys.length > 0) {
this._grabbed = false;
this._eventCaptureId = 0;
this._key.connect('notify::show-subkeys', Lang.bind(this, this._onShowSubkeysChanged)); this._key.connect('notify::show-subkeys', Lang.bind(this, this._onShowSubkeysChanged));
this._boxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM, this._boxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ x_fill: true, { x_fill: true,
@ -115,52 +111,23 @@ const Key = new Lang.Class({
this._boxPointer.bin.add_actor(this._extended_keyboard); this._boxPointer.bin.add_actor(this._extended_keyboard);
}, },
_onEventCapture: function (actor, event) { get subkeys() {
let source = event.get_source(); return this._boxPointer;
let type = event.type();
if ((type == Clutter.EventType.BUTTON_PRESS ||
type == Clutter.EventType.BUTTON_RELEASE) &&
this._extended_keyboard.contains(source)) {
source.extended_key.press();
source.extended_key.release();
return false;
}
if (type == Clutter.EventType.BUTTON_PRESS) {
this._boxPointer.actor.hide();
this._ungrab();
return true;
}
return false;
},
_ungrab: function () {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
this._grabbed = false;
Main.popModal(this.actor);
}, },
_onShowSubkeysChanged: function () { _onShowSubkeysChanged: function () {
if (this._key.show_subkeys) { if (this._key.show_subkeys) {
this.actor.fake_release();
this._boxPointer.actor.raise_top(); this._boxPointer.actor.raise_top();
this._boxPointer.setPosition(this.actor, 0.5); this._boxPointer.setPosition(this.actor, 0.5);
this._boxPointer.show(BoxPointer.PopupAnimation.FULL); this.emit('show-subkeys');
this.actor.fake_release();
this.actor.set_hover(false); this.actor.set_hover(false);
if (!this._grabbed) {
Main.pushModal(this.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
this._grabbed = true;
}
this._key.release();
} else { } else {
if (this._grabbed) this.emit('hide-subkeys');
this._ungrab();
this._boxPointer.hide(BoxPointer.PopupAnimation.FULL);
} }
} }
}); });
Signals.addSignalMethods(Key.prototype);
const Keyboard = new Lang.Class({ const Keyboard = new Lang.Class({
// HACK: we can't set Name, because it collides with Name dbus property // HACK: we can't set Name, because it collides with Name dbus property
@ -182,6 +149,18 @@ const Keyboard = new Lang.Class({
this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA }); this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged)); this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._settingsChanged(); this._settingsChanged();
this._showIdleId = 0;
this._subkeysBoxPointer = null;
this._capturedEventId = 0;
this._capturedPress = false;
this._keyboardVisible = false;
Main.layoutManager.connect('keyboard-visible-changed', Lang.bind(this, function(o, visible) {
this._keyboardVisible = visible;
}));
this._keyboardRequested = false;
this._keyboardRestingId = 0;
}, },
init: function () { init: function () {
@ -273,10 +252,14 @@ const Keyboard = new Lang.Class({
return; return;
let time = global.get_current_time(); let time = global.get_current_time();
if (focus instanceof Clutter.Text) if (!(focus instanceof Clutter.Text)) {
this.Show(time);
else
this.Hide(time); this.Hide(time);
return;
}
if (!this._showIdleId)
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() { this.Show(time); }));
}, },
_addKeys: function () { _addKeys: function () {
@ -331,6 +314,19 @@ const Keyboard = new Lang.Class({
return trayButton; return trayButton;
}, },
_onCapturedEvent: function(actor, event) {
let type = event.type();
let press = type == Clutter.EventType.BUTTON_PRESS;
let release = type == Clutter.EventType.BUTTON_RELEASE;
if (press)
this._capturedPress = true;
else if (release && this._capturedPress)
this._hideSubkeys();
return true;
},
_addRows : function (keys, layout) { _addRows : function (keys, layout) {
let keyboard_row = new St.BoxLayout(); let keyboard_row = new St.BoxLayout();
for (let i = 0; i < keys.length; ++i) { for (let i = 0; i < keys.length; ++i) {
@ -353,6 +349,19 @@ const Keyboard = new Lang.Class({
// Add new key for hiding message tray // Add new key for hiding message tray
right_box.add(this._getTrayIcon()); right_box.add(this._getTrayIcon());
} }
button.connect('show-subkeys', Lang.bind(this, function() {
if (this._subkeysBoxPointer)
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = button.subkeys;
this._subkeysBoxPointer.show(BoxPointer.PopupAnimation.FULL);
if (!this._capturedEventId)
this._capturedEventId = this.actor.connect('captured-event',
Lang.bind(this, this._onCapturedEvent));
}));
button.connect('hide-subkeys', Lang.bind(this, function() {
this._hideSubkeys();
}));
} }
keyboard_row.add(left_box, { expand: true, x_fill: false, x_align: St.Align.START }); keyboard_row.add(left_box, { expand: true, x_fill: false, x_align: St.Align.START });
keyboard_row.add(right_box, { expand: true, x_fill: false, x_align: St.Align.END }); keyboard_row.add(right_box, { expand: true, x_fill: false, x_align: St.Align.END });
@ -462,7 +471,37 @@ const Keyboard = new Lang.Class({
actor._extended_keys || actor.extended_key; actor._extended_keys || actor.extended_key;
}, },
_clearKeyboardRestTimer: function() {
if (!this._keyboardRestingId)
return;
GLib.source_remove(this._keyboardRestingId);
this._keyboardRestingId = 0;
},
show: function (monitor) { show: function (monitor) {
this._keyboardRequested = true;
if (this._keyboardVisible) {
if (monitor != Main.layoutManager.keyboardIndex) {
Main.layoutManager.keyboardIndex = monitor;
this._redraw();
}
return;
}
this._clearKeyboardRestTimer();
this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
KEYBOARD_REST_TIME,
Lang.bind(this, function() {
this._clearKeyboardRestTimer();
this._show(monitor);
}));
},
_show: function(monitor) {
if (!this._keyboardRequested)
return;
Main.layoutManager.keyboardIndex = monitor; Main.layoutManager.keyboardIndex = monitor;
this._redraw(); this._redraw();
Main.layoutManager.showKeyboard(); Main.layoutManager.showKeyboard();
@ -470,10 +509,41 @@ const Keyboard = new Lang.Class({
}, },
hide: function () { hide: function () {
this._keyboardRequested = false;
if (!this._keyboardVisible)
return;
this._clearKeyboardRestTimer();
this._keyboardRestingId = GLib.timeout_add(GLib.PRIORITY_DEFAULT,
KEYBOARD_REST_TIME,
Lang.bind(this, function() {
this._clearKeyboardRestTimer();
this._hide();
}));
},
_hide: function() {
if (this._keyboardRequested)
return;
this._hideSubkeys();
Main.layoutManager.hideKeyboard(); Main.layoutManager.hideKeyboard();
this._createSource(); this._createSource();
}, },
_hideSubkeys: function() {
if (this._subkeysBoxPointer) {
this._subkeysBoxPointer.hide(BoxPointer.PopupAnimation.FULL);
this._subkeysBoxPointer = null;
}
if (this._capturedEventId) {
this.actor.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
this._capturedPress = false;
},
_moveTemporarily: function () { _moveTemporarily: function () {
let currentWindow = global.screen.get_display().focus_window; let currentWindow = global.screen.get_display().focus_window;
let rect = currentWindow.get_outer_rect(); let rect = currentWindow.get_outer_rect();
@ -502,6 +572,13 @@ const Keyboard = new Lang.Class({
return one - two; return one - two;
}, },
_clearShowIdle: function() {
if (!this._showIdleId)
return;
GLib.source_remove(this._showIdleId);
this._showIdleId = 0;
},
// D-Bus methods // D-Bus methods
Show: function(timestamp) { Show: function(timestamp) {
if (!this._enableKeyboard) if (!this._enableKeyboard)
@ -510,6 +587,8 @@ const Keyboard = new Lang.Class({
if (this._compareTimestamp(timestamp, this._timestamp) < 0) if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return; return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME) if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp; this._timestamp = timestamp;
this.show(Main.layoutManager.focusIndex); this.show(Main.layoutManager.focusIndex);
@ -522,6 +601,8 @@ const Keyboard = new Lang.Class({
if (this._compareTimestamp(timestamp, this._timestamp) < 0) if (this._compareTimestamp(timestamp, this._timestamp) < 0)
return; return;
this._clearShowIdle();
if (timestamp != Clutter.CURRENT_TIME) if (timestamp != Clutter.CURRENT_TIME)
this._timestamp = timestamp; this._timestamp = timestamp;
this.hide(); this.hide();

View File

@ -16,7 +16,7 @@ const Tweener = imports.ui.tweener;
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5; const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
const STARTUP_ANIMATION_TIME = 0.2; const STARTUP_ANIMATION_TIME = 0.2;
const KEYBOARD_ANIMATION_TIME = 0.5; const KEYBOARD_ANIMATION_TIME = 0.15;
const PLYMOUTH_TRANSITION_TIME = 1; const PLYMOUTH_TRANSITION_TIME = 1;
const MonitorConstraint = new Lang.Class({ const MonitorConstraint = new Lang.Class({
@ -437,7 +437,7 @@ const LayoutManager = new Lang.Class({
Tweener.addTween(this.keyboardBox, Tweener.addTween(this.keyboardBox,
{ anchor_y: 0, { anchor_y: 0,
time: immediate ? 0 : KEYBOARD_ANIMATION_TIME, time: immediate ? 0 : KEYBOARD_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeInQuad',
onComplete: this._hideKeyboardComplete, onComplete: this._hideKeyboardComplete,
onCompleteScope: this onCompleteScope: this
}); });
@ -1092,7 +1092,7 @@ const Chrome = new Lang.Class({
} else if (y1 <= primary.y && y2 >= primary.y + primary.height) { } else if (y1 <= primary.y && y2 >= primary.y + primary.height) {
if (x1 <= 0) if (x1 <= 0)
side = Meta.Side.LEFT; side = Meta.Side.LEFT;
else if (x2 >= global.screen_width) else if (x2 >= primary.x + primary.width)
side = Meta.Side.RIGHT; side = Meta.Side.RIGHT;
else else
continue; continue;

View File

@ -39,6 +39,7 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
* in the shell core code too. */ * in the shell core code too. */
'const stage = global.stage; ' + 'const stage = global.stage; ' +
/* Special lookingGlass functions */ /* Special lookingGlass functions */
'const inspect = Lang.bind(Main.lookingGlass, Main.lookingGlass.inspect); ' +
'const it = Main.lookingGlass.getIt(); ' + 'const it = Main.lookingGlass.getIt(); ' +
'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); '; 'const r = Lang.bind(Main.lookingGlass, Main.lookingGlass.getResult); ';
@ -871,8 +872,7 @@ const LookingGlass = new Lang.Class({
inspectIcon.connect('button-press-event', Lang.bind(this, function () { inspectIcon.connect('button-press-event', Lang.bind(this, function () {
let inspector = new Inspector(this); let inspector = new Inspector(this);
inspector.connect('target', Lang.bind(this, function(i, target, stageX, stageY) { inspector.connect('target', Lang.bind(this, function(i, target, stageX, stageY) {
this._pushResult('<inspect x:' + stageX + ' y:' + stageY + '>', this._pushResult('inspect(' + Math.round(stageX) + ', ' + Math.round(stageY) + ')', target);
target);
})); }));
inspector.connect('closed', Lang.bind(this, function() { inspector.connect('closed', Lang.bind(this, function() {
this.actor.show(); this.actor.show();
@ -1057,6 +1057,10 @@ const LookingGlass = new Lang.Class({
this._entry.text = ''; this._entry.text = '';
}, },
inspect: function(x, y) {
return global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
},
getIt: function () { getIt: function () {
return this._it; return this._it;
}, },

View File

@ -81,8 +81,6 @@ let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
let _overridesSettings = null; let _overridesSettings = null;
let background = null;
function _sessionUpdated() { function _sessionUpdated() {
wm.setCustomKeybindingHandler('panel-main-menu', wm.setCustomKeybindingHandler('panel-main-menu',
KeybindingMode.NORMAL | KeybindingMode.NORMAL |
@ -547,19 +545,20 @@ function pushModal(actor, params) {
if (index >= 0) if (index >= 0)
popModal(actor); popModal(actor);
}); });
let curFocus = global.stage.get_key_focus();
let curFocusDestroyId; let prevFocus = global.stage.get_key_focus();
if (curFocus != null) { let prevFocusDestroyId;
curFocusDestroyId = curFocus.connect('destroy', function() { if (prevFocus != null) {
prevFocusDestroyId = prevFocus.connect('destroy', function() {
let index = _findModal(actor); let index = _findModal(actor);
if (index >= 0) if (index >= 0)
modalActorFocusStack[index].actor = null; modalActorFocusStack[index].prevFocus = null;
}); });
} }
modalActorFocusStack.push({ actor: actor, modalActorFocusStack.push({ actor: actor,
focus: curFocus,
destroyId: actorDestroyId, destroyId: actorDestroyId,
focusDestroyId: curFocusDestroyId, prevFocus: prevFocus,
prevFocusDestroyId: prevFocusDestroyId,
keybindingMode: keybindingMode }); keybindingMode: keybindingMode });
keybindingMode = params.keybindingMode; keybindingMode = params.keybindingMode;
@ -600,18 +599,33 @@ function popModal(actor, timestamp) {
record.actor.disconnect(record.destroyId); record.actor.disconnect(record.destroyId);
if (focusIndex == modalActorFocusStack.length - 1) { if (focusIndex == modalActorFocusStack.length - 1) {
if (record.focus) if (record.prevFocus)
record.focus.disconnect(record.focusDestroyId); record.prevFocus.disconnect(record.prevFocusDestroyId);
keybindingMode = record.keybindingMode; keybindingMode = record.keybindingMode;
global.stage.set_key_focus(record.focus); global.stage.set_key_focus(record.prevFocus);
} else { } else {
// If we have:
// global.stage.set_focus(a);
// Main.pushModal(b);
// Main.pushModal(c);
// Main.pushModal(d);
//
// then we have the stack:
// [{ prevFocus: a, actor: b },
// { prevFocus: b, actor: c },
// { prevFocus: c, actor: d }]
//
// When actor c is destroyed/popped, if we only simply remove the
// record, then the focus stack will be [a, c], rather than the correct
// [a, b]. Shift the focus stack up before removing the record to ensure
// that we get the correct result.
let t = modalActorFocusStack[modalActorFocusStack.length - 1]; let t = modalActorFocusStack[modalActorFocusStack.length - 1];
if (t.focus) if (t.prevFocus)
t.focus.disconnect(t.focusDestroyId); t.prevFocus.disconnect(t.prevFocusDestroyId);
// Remove from the middle, shift the focus chain up // Remove from the middle, shift the focus chain up
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) { for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus; modalActorFocusStack[i].prevFocus = modalActorFocusStack[i - 1].prevFocus;
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId; modalActorFocusStack[i].prevFocusDestroyId = modalActorFocusStack[i - 1].prevFocusDestroyId;
modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode; modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
} }
} }

View File

@ -611,6 +611,8 @@ const Notification = new Lang.Class({
setImage: function(image) { setImage: function(image) {
if (this._imageBin) if (this._imageBin)
this.unsetImage(); this.unsetImage();
if (!image)
return;
this._imageBin = new St.Bin(); this._imageBin = new St.Bin();
this._imageBin.child = image; this._imageBin.child = image;
this._imageBin.opacity = 230; this._imageBin.opacity = 230;

View File

@ -96,7 +96,6 @@ const ModalDialog = new Lang.Class({
y_align: St.Align.START }); y_align: St.Align.START });
this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box', this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
visible: false,
vertical: false }); vertical: false });
this.dialogLayout.add(this.buttonLayout, this.dialogLayout.add(this.buttonLayout,
{ expand: true, { expand: true,
@ -120,7 +119,6 @@ const ModalDialog = new Lang.Class({
setButtons: function(buttons) { setButtons: function(buttons) {
this.clearButtons(); this.clearButtons();
this.buttonLayout.visible = (buttons.length > 0);
for (let i = 0; i < buttons.length; i++) { for (let i = 0; i < buttons.length; i++) {
let buttonInfo = buttons[i]; let buttonInfo = buttons[i];

View File

@ -127,30 +127,19 @@ const NotificationDaemon = new Lang.Class({
this._trayManager.manage_stage(global.stage, Main.messageTray.actor); this._trayManager.manage_stage(global.stage, Main.messageTray.actor);
}, },
_iconForNotificationData: function(icon, hints) { _imageForNotificationData: function(hints) {
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon if (hints['image-data']) {
// and don't show a large image. There are currently many applications that use
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
// So the logic here does the right thing for this case. If both an icon and either
// one of 'image-data' or 'image-path' are specified, we show both an icon and
// a large image.
if (icon) {
if (icon.substr(0, 7) == 'file://')
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
else if (icon[0] == '/') {
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
} else
return new Gio.ThemedIcon({ name: icon });
} else if (hints['image-data']) {
let [width, height, rowStride, hasAlpha, let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints['image-data']; bitsPerSample, nChannels, data] = hints['image-data'];
return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha, return Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
bitsPerSample, width, height, rowStride); bitsPerSample, width, height, rowStride);
} else if (hints['image-path']) { } else if (hints['image-path']) {
return new Gio.FileIcon({ file: Gio.File.new_for_path(hints['image-path']) }); return new Gio.FileIcon({ file: Gio.File.new_for_path(hints['image-path']) });
} else { }
return null;
},
_fallbackIconForNotificationData: function(hints) {
let stockIcon; let stockIcon;
switch (hints.urgency) { switch (hints.urgency) {
case Urgency.LOW: case Urgency.LOW:
@ -162,7 +151,18 @@ const NotificationDaemon = new Lang.Class({
break; break;
} }
return new Gio.ThemedIcon({ name: stockIcon }); return new Gio.ThemedIcon({ name: stockIcon });
},
_iconForNotificationData: function(icon) {
if (icon) {
if (icon.substr(0, 7) == 'file://')
return new Gio.FileIcon({ file: Gio.File.new_for_uri(icon) });
else if (icon[0] == '/')
return new Gio.FileIcon({ file: Gio.File.new_for_path(icon) });
else
return new Gio.ThemedIcon({ name: icon });
} }
return null;
}, },
_lookupSource: function(title, pid, trayIcon) { _lookupSource: function(title, pid, trayIcon) {
@ -355,12 +355,8 @@ const NotificationDaemon = new Lang.Class({
[ndata.id, ndata.icon, ndata.summary, ndata.body, [ndata.id, ndata.icon, ndata.summary, ndata.body,
ndata.actions, ndata.hints, ndata.notification]; ndata.actions, ndata.hints, ndata.notification];
let gicon = this._iconForNotificationData(icon, hints);
if (notification == null) { if (notification == null) {
notification = new MessageTray.Notification(source, summary, body, notification = new MessageTray.Notification(source);
{ gicon: gicon,
bannerMarkup: true });
ndata.notification = notification; ndata.notification = notification;
notification.connect('destroy', Lang.bind(this, notification.connect('destroy', Lang.bind(this,
function(n, reason) { function(n, reason) {
@ -383,29 +379,33 @@ const NotificationDaemon = new Lang.Class({
function(n, actionId) { function(n, actionId) {
this._emitActionInvoked(ndata.id, actionId); this._emitActionInvoked(ndata.id, actionId);
})); }));
} else { }
let gicon = this._iconForNotificationData(icon, hints);
let gimage = this._imageForNotificationData(hints);
let image = null;
// If an icon is not specified, we use 'image-data' or 'image-path' hint for an icon
// and don't show a large image. There are currently many applications that use
// notify_notification_set_icon_from_pixbuf() from libnotify, which in turn sets
// the 'image-data' hint. These applications don't typically pass in 'app_icon'
// argument to Notify() and actually expect the pixbuf to be shown as an icon.
// So the logic here does the right thing for this case. If both an icon and either
// one of 'image-data' or 'image-path' are specified, we show both an icon and
// a large image.
if (gicon && gimage)
image = new St.Icon({ gicon: gimage });
else if (!gicon && gimage)
gicon = gimage;
else if (!gicon)
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 });
}
// We only display a large image if an icon is also specified.
if (icon && (hints['image-data'] || hints['image-path'])) {
let image = null;
if (hints['image-data']) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints['image-data'];
image = St.TextureCache.get_default().load_from_raw(data, hasAlpha,
width, height, rowStride, notification.IMAGE_SIZE);
} else if (hints['image-path']) {
image = St.TextureCache.get_default().load_uri_async(GLib.filename_to_uri(hints['image-path'], null),
notification.IMAGE_SIZE,
notification.IMAGE_SIZE);
}
notification.setImage(image);
} else {
notification.unsetImage();
}
if (actions.length) { if (actions.length) {
notification.setUseActionIcons(hints['action-icons'] == true); notification.setUseActionIcons(hints['action-icons'] == true);
@ -435,7 +435,7 @@ const NotificationDaemon = new Lang.Class({
// of the 'transient' hint with hints['transient'] rather than hints.transient // of the 'transient' hint with hints['transient'] rather than hints.transient
notification.setTransient(hints['transient'] == true); notification.setTransient(hints['transient'] == true);
let sourceGIcon = source.useNotificationIcon ? this._iconForNotificationData(icon, hints) : null; let sourceGIcon = source.useNotificationIcon ? gicon : null;
source.processNotification(notification, sourceGIcon); source.processNotification(notification, sourceGIcon);
}, },

View File

@ -598,6 +598,11 @@ const AppMenuButton = new Lang.Class({
return; return;
menu = new PopupMenu.RemoteMenu(this.actor, this._targetApp.menu, this._targetApp.action_group); menu = new PopupMenu.RemoteMenu(this.actor, this._targetApp.menu, this._targetApp.action_group);
menu.connect('activate', Lang.bind(this, function() {
let win = this._targetApp.get_windows()[0];
win.check_alive(global.get_current_time());
}));
} else { } else {
if (this.menu.isDummyQuitMenu) if (this.menu.isDummyQuitMenu)
return; return;
@ -746,12 +751,9 @@ const ActivitiesButton = new Lang.Class({
const PanelCorner = new Lang.Class({ const PanelCorner = new Lang.Class({
Name: 'PanelCorner', Name: 'PanelCorner',
_init: function(box, side) { _init: function(side) {
this._side = side; this._side = side;
this._box = box;
this._box.connect('style-changed', Lang.bind(this, this._boxStyleChanged));
this.actor = new St.DrawingArea({ style_class: 'panel-corner' }); this.actor = new St.DrawingArea({ style_class: 'panel-corner' });
this.actor.connect('style-changed', Lang.bind(this, this._styleChanged)); this.actor.connect('style-changed', Lang.bind(this, this._styleChanged));
this.actor.connect('repaint', Lang.bind(this, this._repaint)); this.actor.connect('repaint', Lang.bind(this, this._repaint));
@ -807,12 +809,12 @@ const PanelCorner = new Lang.Class({
return children[index]; return children[index];
}, },
_boxStyleChanged: function() { setStyleParent: function(box) {
let side = this._side; let side = this._side;
let rtlAwareContainer = this._box instanceof St.BoxLayout; let rtlAwareContainer = box instanceof St.BoxLayout;
if (rtlAwareContainer && if (rtlAwareContainer &&
this._box.get_text_direction() == Clutter.TextDirection.RTL) { box.get_text_direction() == Clutter.TextDirection.RTL) {
if (this._side == St.Side.LEFT) if (this._side == St.Side.LEFT)
side = St.Side.RIGHT; side = St.Side.RIGHT;
else if (this._side == St.Side.RIGHT) else if (this._side == St.Side.RIGHT)
@ -821,9 +823,9 @@ const PanelCorner = new Lang.Class({
let button; let button;
if (side == St.Side.LEFT) if (side == St.Side.LEFT)
button = this._findLeftmostButton(this._box); button = this._findLeftmostButton(box);
else if (side == St.Side.RIGHT) else if (side == St.Side.RIGHT)
button = this._findRightmostButton(this._box); button = this._findRightmostButton(box);
if (button) { if (button) {
if (this._button && this._buttonStyleChangedSignalId) { if (this._button && this._buttonStyleChangedSignalId) {
@ -850,7 +852,7 @@ const PanelCorner = new Lang.Class({
// The corner doesn't support theme transitions, so override // The corner doesn't support theme transitions, so override
// the .panel-button default // the .panel-button default
button.style = 'transition-duration: 0'; button.style = 'transition-duration: 0ms';
} }
}, },
@ -863,8 +865,8 @@ const PanelCorner = new Lang.Class({
let backgroundColor = node.get_color('-panel-corner-background-color'); let backgroundColor = node.get_color('-panel-corner-background-color');
let borderColor = node.get_color('-panel-corner-border-color'); let borderColor = node.get_color('-panel-corner-border-color');
let noOverlap = borderColor.alpha == 0; let overlap = borderColor.alpha != 0;
let offsetY = noOverlap ? borderWidth : 0; let offsetY = overlap ? 0 : borderWidth;
let cr = this.actor.get_context(); let cr = this.actor.get_context();
cr.setOperator(Cairo.Operator.SOURCE); cr.setOperator(Cairo.Operator.SOURCE);
@ -888,9 +890,7 @@ const PanelCorner = new Lang.Class({
Clutter.cairo_set_source_color(cr, over); Clutter.cairo_set_source_color(cr, over);
cr.fill(); cr.fill();
if (noOverlap) if (overlap) {
return;
let offset = borderWidth; let offset = borderWidth;
Clutter.cairo_set_source_color(cr, backgroundColor); Clutter.cairo_set_source_color(cr, backgroundColor);
@ -899,6 +899,9 @@ const PanelCorner = new Lang.Class({
cr.appendPath(savedPath); cr.appendPath(savedPath);
cr.fill(); cr.fill();
cr.restore(); cr.restore();
}
cr.$dispose();
}, },
_styleChanged: function() { _styleChanged: function() {
@ -958,17 +961,10 @@ const Panel = new Lang.Class({
this._rightBox = new St.BoxLayout({ name: 'panelRight' }); this._rightBox = new St.BoxLayout({ name: 'panelRight' });
this.actor.add_actor(this._rightBox); this.actor.add_actor(this._rightBox);
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) this._leftCorner = new PanelCorner(St.Side.LEFT);
this._leftCorner = new PanelCorner(this._rightBox, St.Side.LEFT);
else
this._leftCorner = new PanelCorner(this._leftBox, St.Side.LEFT);
this.actor.add_actor(this._leftCorner.actor); this.actor.add_actor(this._leftCorner.actor);
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) this._rightCorner = new PanelCorner(St.Side.RIGHT);
this._rightCorner = new PanelCorner(this._leftBox, St.Side.RIGHT);
else
this._rightCorner = new PanelCorner(this._rightBox, St.Side.RIGHT);
this.actor.add_actor(this._rightCorner.actor); this.actor.add_actor(this._rightCorner.actor);
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
@ -1141,17 +1137,13 @@ const Panel = new Lang.Class({
this._sessionStyle = Main.sessionMode.panelStyle; this._sessionStyle = Main.sessionMode.panelStyle;
if (this._sessionStyle) if (this._sessionStyle)
this._addStyleClassName(this._sessionStyle); this._addStyleClassName(this._sessionStyle);
},
_initBox: function(elements, box) { if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) {
for (let i = 0; i < elements.length; i++) { this._leftCorner.setStyleParent(this._rightBox);
let role = elements[i]; this._rightCorner.setStyleParent(this._leftBox);
let constructor = PANEL_ITEM_IMPLEMENTATIONS[role]; } else {
if (!constructor) { this._leftCorner.setStyleParent(this._leftBox);
// panel icon is not supported (can happen for this._rightCorner.setStyleParent(this._rightBox);
// bluetooth or network)
continue;
}
} }
}, },

View File

@ -244,18 +244,21 @@ const SystemStatusButton = new Lang.Class({
this.setIcon(iconName); this.setIcon(iconName);
}, },
get icons() {
return this._box.get_children();
},
addIcon: function(gicon) { addIcon: function(gicon) {
let icon = new St.Icon({ gicon: gicon, let icon = new St.Icon({ gicon: gicon,
style_class: 'system-status-icon' }); style_class: 'system-status-icon' });
this._box.add_actor(icon); this._box.add_actor(icon);
this.emit('icons-changed');
return icon; return icon;
}, },
setIcon: function(iconName) { setIcon: function(iconName) {
// Need to first add a NULL GIcon and then set icon_name, to ensure
// compatibility with -symbolic fallbacks
if (!this.mainIcon) if (!this.mainIcon)
this.mainIcon = this.addIcon(null); this.mainIcon = this.addIcon(null);
this.mainIcon.icon_name = iconName; this.mainIcon.icon_name = iconName;

View File

@ -207,6 +207,7 @@ const PopupBaseMenuItem = new Lang.Class({
color.alpha / 255); color.alpha / 255);
cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI); cr.arc(width / 2, height / 2, width / 3, 0, 2 * Math.PI);
cr.fill(); cr.fill();
cr.$dispose();
}, },
// This returns column widths in logical order (i.e. from the dot // This returns column widths in logical order (i.e. from the dot
@ -604,6 +605,7 @@ const PopupSliderMenuItem = new Lang.Class({
color.alpha / 255); color.alpha / 255);
cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI); cr.arc(handleX, handleY, handleRadius, 0, 2 * Math.PI);
cr.fill(); cr.fill();
cr.$dispose();
}, },
_startDragging: function(actor, event) { _startDragging: function(actor, event) {
@ -636,20 +638,34 @@ const PopupSliderMenuItem = new Lang.Class({
return true; return true;
}, },
_onScrollEvent: function (actor, event) { scroll: function(event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) { if (direction == Clutter.ScrollDirection.DOWN) {
this._value = Math.max(0, this._value - SLIDER_SCROLL_STEP); delta = -SLIDER_SCROLL_STEP;
} } else if (direction == Clutter.ScrollDirection.UP) {
else if (direction == Clutter.ScrollDirection.UP) { delta = +SLIDER_SCROLL_STEP;
this._value = Math.min(1, this._value + SLIDER_SCROLL_STEP); } else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
// Even though the slider is horizontal, use dy to match
// the UP/DOWN above.
delta = -dy / 10;
} }
this._value = Math.min(Math.max(0, this._value + delta), 1);
this._slider.queue_repaint(); this._slider.queue_repaint();
this.emit('value-changed', this._value); this.emit('value-changed', this._value);
}, },
_onScrollEvent: function(actor, event) {
this.scroll(event);
},
_motionEvent: function(actor, event) { _motionEvent: function(actor, event) {
let absX, absY; let absX, absY;
[absX, absY] = event.get_coords(); [absX, absY] = event.get_coords();

View File

@ -1,9 +1,11 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell;
const FileUtils = imports.misc.fileUtils; const FileUtils = imports.misc.fileUtils;
const Search = imports.ui.search; const Search = imports.ui.search;
@ -187,18 +189,18 @@ const RemoteSearchProvider = new Lang.Class({
}, },
createIcon: function(size, meta) { createIcon: function(size, meta) {
let gicon;
if (meta['gicon']) { if (meta['gicon']) {
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']), gicon = Gio.icon_new_for_string(meta['gicon']);
icon_size: size });
} else if (meta['icon-data']) { } else if (meta['icon-data']) {
let [width, height, rowStride, hasAlpha, let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = meta['icon-data']; bitsPerSample, nChannels, data] = meta['icon-data'];
let textureCache = St.TextureCache.get_default(); gicon = Shell.util_create_pixbuf_from_data(data, GdkPixbuf.Colorspace.RGB, hasAlpha,
return textureCache.load_from_raw(data, hasAlpha, bitsPerSample, width, height, rowStride);
width, height, rowStride, size);
} }
return null; return new St.Icon({ gicon: gicon,
icon_size: size });
}, },
_getResultsFinished: function(results, error) { _getResultsFinished: function(results, error) {

View File

@ -25,6 +25,7 @@ const Util = imports.misc.util;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const LOCK_DELAY_KEY = 'lock-delay';
const CURTAIN_SLIDE_TIME = 0.3; const CURTAIN_SLIDE_TIME = 0.3;
// fraction of screen height the arrow must reach before completing // fraction of screen height the arrow must reach before completing
@ -636,7 +637,11 @@ const ScreenShield = new Lang.Class({
let lightboxWasShown = this._lightbox.shown; let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide(); this._lightbox.hide();
let shouldLock = lightboxWasShown && this._settings.get_boolean(LOCK_ENABLED_KEY); // GLib.get_monotonic_time() returns microseconds, convert to seconds
let elapsedTime = (GLib.get_monotonic_time() - this._activationTime) / 1000000;
let shouldLock = lightboxWasShown &&
this._settings.get_boolean(LOCK_ENABLED_KEY) &&
(elapsedTime >= this._settings.get_uint(LOCK_DELAY_KEY));
if (shouldLock || this._isLocked) { if (shouldLock || this._isLocked) {
this.lock(false); this.lock(false);
} else if (this._isActive) { } else if (this._isActive) {
@ -755,6 +760,10 @@ const ScreenShield = new Lang.Class({
}, },
_resetLockScreen: function(animateLockScreen, animateLockDialog) { _resetLockScreen: function(animateLockScreen, animateLockDialog) {
if (this._lockScreenState == MessageTray.State.SHOWING ||
this._lockScreenState == MessageTray.State.SHOWN)
return;
this._ensureLockScreen(); this._ensureLockScreen();
this._lockDialogGroup.scale_x = 1; this._lockDialogGroup.scale_x = 1;
this._lockDialogGroup.scale_y = 1; this._lockDialogGroup.scale_y = 1;

281
js/ui/screenshot.js Normal file
View File

@ -0,0 +1,281 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const ScreenshotIface = <interface name="org.gnome.Shell.Screenshot">
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>
<method name="SelectArea">
<arg type="i" direction="out" name="x"/>
<arg type="i" direction="out" name="y"/>
<arg type="i" direction="out" name="width"/>
<arg type="i" direction="out" name="height"/>
</method>
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
</interface>;
const ScreenshotService = new Lang.Class({
Name: 'ScreenshotService',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenshotIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell/Screenshot');
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
if (flash && result) {
let flashspot = new Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(bs)', [result, filenameUsed]);
invocation.return_value(retval);
},
ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, flash, filename, callback] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
SelectAreaAsync: function (params, invocation) {
let selectArea = new SelectArea();
selectArea.show();
selectArea.connect('finished', Lang.bind(this,
function(selectArea, areaRectangle) {
if (areaRectangle) {
let retval = GLib.Variant.new('(iiii)',
[areaRectangle.x, areaRectangle.y,
areaRectangle.width, areaRectangle.height]);
invocation.return_value(retval);
} else {
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
"Operation was cancelled");
}
}));
},
FlashArea: function(x, y, width, height) {
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire();
}
});
const SelectArea = new Lang.Class({
Name: 'SelectArea',
_init: function() {
this._startX = -1;
this._startY = -1;
this._lastX = 0;
this._lastY = 0;
this._initRubberbandColors();
this._group = new St.Widget({ visible: false,
reactive: true,
x: 0,
y: 0 });
Main.uiGroup.add_actor(this._group);
this._group.connect('button-press-event',
Lang.bind(this, this._onButtonPress));
this._group.connect('button-release-event',
Lang.bind(this, this._onButtonRelease));
this._group.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._group.connect('motion-event',
Lang.bind(this, this._onMotionEvent));
let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL });
this._group.add_constraint(constraint);
this._rubberband = new Clutter.Rectangle({ color: this._background,
has_border: true,
border_width: 1,
border_color: this._border });
this._group.add_actor(this._rubberband);
},
show: function() {
if (!Main.pushModal(this._group) || this._group.visible)
return;
global.set_cursor(Shell.Cursor.CROSSHAIR);
this._group.visible = true;
},
_initRubberbandColors: function() {
function colorFromRGBA(rgba) {
return new Clutter.Color({ red: rgba.red * 255,
green: rgba.green * 255,
blue: rgba.blue * 255,
alpha: rgba.alpha * 255 });
}
let path = new Gtk.WidgetPath();
path.append_type(Gtk.IconView);
let context = new Gtk.StyleContext();
context.set_path(path);
context.add_class('rubberband');
this._background = colorFromRGBA(context.get_background_color(Gtk.StateFlags.NORMAL));
this._border = colorFromRGBA(context.get_border_color(Gtk.StateFlags.NORMAL));
},
_getGeometry: function() {
return { x: Math.min(this._startX, this._lastX),
y: Math.min(this._startY, this._lastY),
width: Math.abs(this._startX - this._lastX),
height: Math.abs(this._startY - this._lastY) };
},
_onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape)
this._destroy(null, false);
return;
},
_onMotionEvent: function(actor, event) {
if (this._startX == -1 || this._startY == -1)
return false;
[this._lastX, this._lastY] = event.get_coords();
let geometry = this._getGeometry();
this._rubberband.set_position(geometry.x, geometry.y);
this._rubberband.set_size(geometry.width, geometry.height);
return false;
},
_onButtonPress: function(actor, event) {
[this._startX, this._startY] = event.get_coords();
this._rubberband.set_position(this._startX, this._startY);
return false;
},
_onButtonRelease: function(actor, event) {
this._destroy(this._getGeometry(), true);
return false;
},
_destroy: function(geometry, fade) {
Tweener.addTween(this._group,
{ opacity: 0,
time: fade ? 0.2 : 0,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
Main.popModal(this._group);
this._group.destroy();
global.unset_cursor();
this.emit('finished', geometry);
})
});
}
});
Signals.addSignalMethods(SelectArea.prototype);
const FLASHSPOT_ANIMATION_TIME = 0.25; // seconds
const Flashspot = new Lang.Class({
Name: 'Flashspot',
Extends: Lightbox.Lightbox,
_init: function(area) {
this.parent(Main.uiGroup, { inhibitEvents: true,
width: area.width,
height: area.height });
this.actor.style_class = 'flashspot';
this.actor.set_position(area.x, area.y);
},
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();
},
_onFireShowComplete: function() {
Tweener.addTween(this.actor,
{ opacity: 0,
time: FLASHSPOT_ANIMATION_TIME,
transition: 'linear',
onComplete: Lang.bind(this, function() {
this.destroy();
})
});
}
});

View File

@ -30,5 +30,6 @@ const HorizontalSeparator = new Lang.Class({
cr.setSource(pattern); cr.setSource(pattern);
cr.rectangle(margin, gradientOffset, gradientWidth, gradientHeight); cr.rectangle(margin, gradientOffset, gradientWidth, gradientHeight);
cr.fill(); cr.fill();
cr.$dispose();
} }
}); });

View File

@ -9,8 +9,8 @@ const Config = imports.misc.config;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionDownloader = imports.ui.extensionDownloader; const ExtensionDownloader = imports.ui.extensionDownloader;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Flashspot = imports.ui.flashspot;
const Main = imports.ui.main; const Main = imports.ui.main;
const Screenshot = imports.ui.screenshot;
const GnomeShellIface = <interface name="org.gnome.Shell"> const GnomeShellIface = <interface name="org.gnome.Shell">
<method name="Eval"> <method name="Eval">
@ -18,34 +18,6 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="b" direction="out" name="success" /> <arg type="b" direction="out" name="success" />
<arg type="s" direction="out" name="result" /> <arg type="s" direction="out" name="result" />
</method> </method>
<method name="ScreenshotArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="Screenshot">
<arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="FlashArea">
<arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/>
</method>
<property name="Mode" type="s" access="read" /> <property name="Mode" type="s" access="read" />
<property name="OverviewActive" type="b" access="readwrite" /> <property name="OverviewActive" type="b" access="readwrite" />
<property name="ShellVersion" type="s" access="read" /> <property name="ShellVersion" type="s" access="read" />
@ -76,6 +48,7 @@ const GnomeShell = new Lang.Class({
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsSerivce = new GnomeShellExtensions(); this._extensionsSerivce = new GnomeShellExtensions();
this._screenshotService = new Screenshot.ScreenshotService();
}, },
/** /**
@ -111,82 +84,6 @@ const GnomeShell = new Lang.Class({
return [success, returnValue]; return [success, returnValue];
}, },
_onScreenshotComplete: function(obj, result, area, flash, invocation) {
if (flash && result) {
let flashspot = new Flashspot.Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(b)', [result]);
invocation.return_value(retval);
},
/**
* ScreenshotArea:
* @x: The X coordinate of the area
* @y: The Y coordinate of the area
* @width: The width of the area
* @height: The height of the area
* @flash: Whether to flash the area or not
* @filename: The filename for the screenshot
*
* Takes a screenshot of the passed in area and saves it
* in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, flash, filename, callback] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
/**
* ScreenshotWindow:
* @include_frame: Whether to include the frame or not
* @include_cursor: Whether to include the cursor image or not
* @flash: Whether to flash the window area or not
* @filename: The filename for the screenshot
*
* Takes a screenshot of the focused window (optionally omitting the frame)
* and saves it in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotWindowAsync : function (params, invocation) {
let [include_frame, include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot_window (include_frame, include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
/**
* Screenshot:
* @filename: The filename for the screenshot
* @include_cursor: Whether to include the cursor image or not
* @flash: Whether to flash the screen or not
*
* Takes a screenshot of the whole screen and saves it
* in @filename as png image, it returns a boolean
* indicating whether the operation was successful or not.
*
*/
ScreenshotAsync : function (params, invocation) {
let [include_cursor, flash, filename] = params;
let screenshot = new Shell.Screenshot();
screenshot.screenshot(include_cursor, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
FlashArea: function(x, y, width, height) {
let flashspot = new Flashspot.Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire();
},
Mode: global.session_mode, Mode: global.session_mode,
get OverviewActive() { get OverviewActive() {

View File

@ -446,10 +446,5 @@ const PinNotification = new Lang.Class({
return this._entry.clutter_text.text.length == 6; return this._entry.clutter_text.text.length == 6;
else else
return true; return true;
},
grabFocus: function(lockTray) {
this.parent(lockTray);
global.stage.set_key_focus(this._entry);
} }
}); });

View File

@ -366,6 +366,13 @@ const InputSourceIndicator = new Lang.Class({
this._sessionUpdated(); this._sessionUpdated();
this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop'); this.menu.addSettingsAction(_("Region and Language Settings"), 'gnome-region-panel.desktop');
this._sourcesPerWindow = false;
this._focusWindowNotifyId = 0;
this._overviewShowingId = 0;
this._overviewHiddenId = 0;
this._settings.connect('changed::per-window', Lang.bind(this, this._sourcesPerWindowChanged));
this._sourcesPerWindowChanged();
}, },
_sessionUpdated: function() { _sessionUpdated: function() {
@ -431,6 +438,8 @@ const InputSourceIndicator = new Lang.Class({
this._mruSources = currentSource.concat(this._mruSources); this._mruSources = currentSource.concat(this._mruSources);
break; break;
} }
this._changePerWindowSource();
}, },
_inputSourcesChanged: function() { _inputSourcesChanged: function() {
@ -470,6 +479,8 @@ const InputSourceIndicator = new Lang.Class({
let is = new InputSource(type, id, displayName, shortName, i); let is = new InputSource(type, id, displayName, shortName, i);
is.connect('activate', Lang.bind(this, function() { is.connect('activate', Lang.bind(this, function() {
if (this._currentSource.index == is.index)
return;
this._settings.set_value(KEY_CURRENT_INPUT_SOURCE, this._settings.set_value(KEY_CURRENT_INPUT_SOURCE,
GLib.Variant.new_uint32(is.index)); GLib.Variant.new_uint32(is.index));
})); }));
@ -702,6 +713,82 @@ const InputSourceIndicator = new Lang.Class({
} }
}, },
_getNewInputSource: function(current) {
for (let i in this._inputSources) {
let is = this._inputSources[i];
if (is.type == current.type &&
is.id == current.id)
return is;
}
return this._currentSource;
},
_getCurrentWindow: function() {
if (Main.overview.visible)
return Main.overview;
else
return global.display.focus_window;
},
_setPerWindowInputSource: function() {
let window = this._getCurrentWindow();
if (!window)
return;
if (!window._inputSources) {
window._inputSources = this._inputSources;
window._currentSource = this._currentSource;
} else if (window._inputSources == this._inputSources) {
window._currentSource.activate();
} else {
window._inputSources = this._inputSources;
window._currentSource = this._getNewInputSource(window._currentSource);
window._currentSource.activate();
}
},
_sourcesPerWindowChanged: function() {
this._sourcesPerWindow = this._settings.get_boolean('per-window');
if (this._sourcesPerWindow && this._focusWindowNotifyId == 0) {
this._focusWindowNotifyId = global.display.connect('notify::focus-window',
Lang.bind(this, this._setPerWindowInputSource));
this._overviewShowingId = Main.overview.connect('showing',
Lang.bind(this, this._setPerWindowInputSource));
this._overviewHiddenId = Main.overview.connect('hidden',
Lang.bind(this, this._setPerWindowInputSource));
} else if (!this._sourcesPerWindow && this._focusWindowNotifyId != 0) {
global.display.disconnect(this._focusWindowNotifyId);
this._focusWindowNotifyId = 0;
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
Main.overview.disconnect(this._overviewHiddenId);
this._overviewHiddenId = 0;
let windows = global.get_window_actors().map(function(w) {
return w.meta_window;
});
for (let i = 0; i < windows.length; ++i) {
delete windows[i]._inputSources;
delete windows[i]._currentSource;
}
delete Main.overview._inputSources;
delete Main.overview._currentSource;
}
},
_changePerWindowSource: function() {
if (!this._sourcesPerWindow)
return;
let window = this._getCurrentWindow();
if (!window)
return;
window._inputSources = this._inputSources;
window._currentSource = this._currentSource;
},
_containerGetPreferredWidth: function(container, for_height, alloc) { _containerGetPreferredWidth: function(container, for_height, alloc) {
// Here, and in _containerGetPreferredHeight, we need to query // Here, and in _containerGetPreferredHeight, we need to query
// for the height of all children, but we ignore the results // for the height of all children, but we ignore the results

View File

@ -10,6 +10,31 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const VolumeMenu = imports.ui.status.volume; const VolumeMenu = imports.ui.status.volume;
const FakeStatusIcon = new Lang.Class({
Name: 'FakeStatusIcon',
_init: function(button) {
this.actor = new St.BoxLayout({ style_class: 'panel-status-button-box' });
this._button = button;
this._button.connect('icons-updated', Lang.bind(this, this._reconstructIcons));
this._button.actor.bind_property('visible', this.actor, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._reconstructIcons();
},
_reconstructIcons: function() {
this.actor.destroy_all_children();
this._button.icons.forEach(Lang.bind(this, function(icon) {
let newIcon = new St.Icon({ style_class: 'system-status-icon' });
icon.bind_property('gicon', newIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
icon.bind_property('visible', newIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this.actor.add_actor(newIcon);
}));
}
});
const Indicator = new Lang.Class({ const Indicator = new Lang.Class({
Name: 'LockScreenMenuIndicator', Name: 'LockScreenMenuIndicator',
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
@ -18,41 +43,20 @@ const Indicator = new Lang.Class({
this.parent(null, _("Volume, network, battery")); this.parent(null, _("Volume, network, battery"));
this._box.style_class = 'lock-screen-status-button-box'; this._box.style_class = 'lock-screen-status-button-box';
this._volume = Main.panel.statusArea.volume;
if (this._volume) {
this._volumeIcon = this.addIcon(null);
this._volume.mainIcon.bind_property('gicon', this._volumeIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._volume.mainIcon.bind_property('visible', this._volumeIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._volumeControl = VolumeMenu.getMixerControl(); this._volumeControl = VolumeMenu.getMixerControl();
this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl); this._volumeMenu = new VolumeMenu.VolumeMenu(this._volumeControl);
this.menu.addMenuItem(this._volumeMenu); this.menu.addMenuItem(this._volumeMenu);
this._volume = new FakeStatusIcon(Main.panel.statusArea.volume);
this._box.add_child(this._volume.actor);
// Network may not exist if the user doesn't have NetworkManager
if (Main.panel.statusArea.network) {
this._network = new FakeStatusIcon(Main.panel.statusArea.network);
this._box.add_child(this._network.actor);
} }
this._network = Main.panel.statusArea.network; this._battery = new FakeStatusIcon(Main.panel.statusArea.battery);
if (this._network) { this._box.add_child(this._battery.actor);
this._networkIcon = this.addIcon(null);
this._network.mainIcon.bind_property('gicon', this._networkIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.mainIcon.bind_property('visible', this._networkIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
this._networkSecondaryIcon = this.addIcon(null);
this._network.secondaryIcon.bind_property('gicon', this._networkSecondaryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._network.secondaryIcon.bind_property('visible', this._networkSecondaryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
this._battery = Main.panel.statusArea.battery;
if (this._battery) {
this._batteryIcon = this.addIcon(null);
this._battery.mainIcon.bind_property('gicon', this._batteryIcon, 'gicon',
GObject.BindingFlags.SYNC_CREATE);
this._battery.mainIcon.bind_property('visible', this._batteryIcon, 'visible',
GObject.BindingFlags.SYNC_CREATE);
}
} }
}); });

View File

@ -5,10 +5,17 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const NetworkManager = imports.gi.NetworkManager; const NetworkManager = imports.gi.NetworkManager;
const NMClient = imports.gi.NMClient; const NMClient = imports.gi.NMClient;
const NMGtk = imports.gi.NMGtk;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
// Some of the new code depends on as-yet-unreleased NM
var NMGtk;
try {
NMGtk = imports.gi.NMGtk;
} catch(e) {
NMGtk = null;
}
const Main = imports.ui.main; 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;
@ -474,6 +481,7 @@ const NMDevice = new Lang.Class({
}, },
syncDescription: function() { syncDescription: function() {
if (this.device._description)
this.statusItem.label.text = this.device._description; this.statusItem.label.text = this.device._description;
}, },
@ -638,6 +646,7 @@ const NMDeviceWired = new Lang.Class({
Extends: NMDeviceSimple, Extends: NMDeviceSimple,
_init: function(client, device, connections) { _init: function(client, device, connections) {
device._description = _("Wired");
this._autoConnectionName = _("Auto Ethernet"); this._autoConnectionName = _("Auto Ethernet");
this.category = NMConnectionCategory.WIRED; this.category = NMConnectionCategory.WIRED;
@ -665,6 +674,7 @@ const NMDeviceModem = new Lang.Class({
_init: function(client, device, connections) { _init: function(client, device, connections) {
let is_wwan = false; let is_wwan = false;
device._description = _("Mobile broadband");
this._enabled = true; this._enabled = true;
this.mobileDevice = null; this.mobileDevice = null;
this._connectionType = 'ppp'; this._connectionType = 'ppp';
@ -783,6 +793,7 @@ const NMDeviceBluetooth = new Lang.Class({
Extends: NMDevice, Extends: NMDevice,
_init: function(client, device, connections) { _init: function(client, device, connections) {
device._description = _("Bluetooth");
this._autoConnectionName = this._makeConnectionName(device); this._autoConnectionName = this._makeConnectionName(device);
device.connect('notify::name', Lang.bind(this, this._updateAutoConnectionName)); device.connect('notify::name', Lang.bind(this, this._updateAutoConnectionName));
@ -1794,13 +1805,18 @@ const NMApplet = new Lang.Class({
}, },
_syncDeviceNames: function() { _syncDeviceNames: function() {
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];
if (device._description != names[i]) {
device._description = names[i]; device._description = names[i];
device._delegate.syncDescription(); device._delegate.syncDescription();
} }
} else {
for (let i = 0; i < this._nmDevices.length; i++) {
let device = this._nmDevices[i];
device._delegate.syncDescription();
}
} }
}, },

View File

@ -7,7 +7,7 @@ const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const BUS_NAME = 'org.gnome.SettingsDaemon'; const BUS_NAME = 'org.gnome.SettingsDaemon.Power';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
const UPDeviceType = { const UPDeviceType = {
@ -61,7 +61,7 @@ const Indicator = new Lang.Class({
this._primaryDeviceId = null; this._primaryDeviceId = null;
this._batteryItem = new PopupMenu.PopupMenuItem('', { reactive: false }); this._batteryItem = new PopupMenu.PopupMenuItem('', { reactive: false });
this._primaryPercentage = new St.Label(); this._primaryPercentage = new St.Label({ style_class: 'popup-battery-percentage' });
this._batteryItem.addActor(this._primaryPercentage, { align: St.Align.END }); this._batteryItem.addActor(this._primaryPercentage, { align: St.Align.END });
this.menu.addMenuItem(this._batteryItem); this.menu.addMenuItem(this._batteryItem);
@ -183,7 +183,8 @@ const DeviceItem = new Lang.Class({
this._box.add_actor(this._label); this._box.add_actor(this._label);
this.addActor(this._box); this.addActor(this._box);
let percentLabel = new St.Label({ text: C_("percent of battery remaining", "%d%%").format(Math.round(percentage)) }); let percentLabel = new St.Label({ text: C_("percent of battery remaining", "%d%%").format(Math.round(percentage)),
style_class: 'popup-battery-percentage' });
this.addActor(percentLabel, { align: St.Align.END }); this.addActor(percentLabel, { align: St.Align.END });
//FIXME: ideally we would like to expose this._label and percentLabel //FIXME: ideally we would like to expose this._label and percentLabel
this.actor.label_actor = percentLabel; this.actor.label_actor = percentLabel;

View File

@ -5,6 +5,7 @@ const Lang = imports.lang;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Gvc = imports.gi.Gvc; const Gvc = imports.gi.Gvc;
const St = imports.gi.St; const St = imports.gi.St;
const Signals = imports.signals;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@ -26,79 +27,134 @@ function getMixerControl() {
return _mixerControl; return _mixerControl;
} }
const VolumeMenu = new Lang.Class({ const StreamSlider = new Lang.Class({
Name: 'VolumeMenu', Name: 'StreamSlider',
Extends: PopupMenu.PopupMenuSection,
_init: function(control) {
this.parent();
this.hasHeadphones = false;
_init: function(control, title) {
this._control = control; this._control = control;
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
this._control.connect('stream-added', Lang.bind(this, this._maybeShowInput));
this._control.connect('stream-removed', Lang.bind(this, this._maybeShowInput));
this._volumeMax = this._control.get_vol_max_norm();
this._output = null; this.item = new PopupMenu.PopupMenuSection();
this._outputVolumeId = 0;
this._outputMutedId = 0;
/* Translators: This is the label for audio volume */
this._outputTitle = new PopupMenu.PopupMenuItem(_("Volume"), { reactive: false });
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.addMenuItem(this._outputTitle);
this.addMenuItem(this._outputSlider);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this._title = new PopupMenu.PopupMenuItem(title, { reactive: false });
this._slider = new PopupMenu.PopupSliderMenuItem(0);
this._slider.connect('value-changed', Lang.bind(this, this._sliderChanged));
this._slider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this._input = null; this.item.addMenuItem(this._title);
this._inputVolumeId = 0; this.item.addMenuItem(this._slider);
this._inputMutedId = 0;
this._inputTitle = new PopupMenu.PopupMenuItem(_("Microphone"), { reactive: false });
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.addMenuItem(this._inputTitle);
this.addMenuItem(this._inputSlider);
this._onControlStateChanged(); this._stream = null;
this._shouldShow = true;
}, },
scroll: function(direction) { get stream() {
let currentVolume = this._output.volume; return this._stream;
if (direction == Clutter.ScrollDirection.DOWN) {
let prev_muted = this._output.is_muted;
this._output.volume = Math.max(0, currentVolume - this._volumeMax * VOLUME_ADJUSTMENT_STEP);
if (this._output.volume < 1) {
this._output.volume = 0;
if (!prev_muted)
this._output.change_is_muted(true);
}
this._output.push_volume();
}
else if (direction == Clutter.ScrollDirection.UP) {
this._output.volume = Math.min(this._volumeMax, currentVolume + this._volumeMax * VOLUME_ADJUSTMENT_STEP);
this._output.change_is_muted(false);
this._output.push_volume();
}
this._notifyVolumeChange();
}, },
_onControlStateChanged: function() { set stream(stream) {
if (this._control.get_state() == Gvc.MixerControlState.READY) { if (this._stream) {
this._readOutput(); this._disconnectStream(this._stream);
this._readInput(); }
this._maybeShowInput();
this._stream = stream;
if (this._stream) {
this._connectStream(this._stream);
this._updateVolume();
} else { } else {
this.emit('icon-changed', null); this.emit('stream-updated');
} }
this._updateVisibility();
},
_disconnectStream: function(stream) {
stream.disconnect(this._mutedChangedId);
this._mutedChangedId = 0;
stream.disconnect(this._volumeChangedId);
this._volumeChangedId = 0;
},
_connectStream: function(stream) {
this._mutedChangedId = stream.connect('notify::is-muted', Lang.bind(this, this._updateVolume));
this._volumeChangedId = stream.connect('notify::volume', Lang.bind(this, this._updateVolume));
},
_shouldBeVisible: function() {
return this._stream != null;
},
_updateVisibility: function() {
let visible = this._shouldBeVisible();
this._title.actor.visible = visible;
this._slider.actor.visible = visible;
},
scroll: function(event) {
this._slider.scroll(event);
},
setValue: function(value) {
// piggy-back off of sliderChanged
this._slider.setValue(value);
},
_sliderChanged: function(slider, value, property) {
if (!this._stream)
return;
let volume = value * this._control.get_vol_max_norm();
let prevMuted = this._stream.is_muted;
if (volume < 1) {
this._stream.volume = 0;
if (!prevMuted)
this._stream.change_is_muted(true);
} else {
this._stream.volume = volume;
if (prevMuted)
this._stream.change_is_muted(false);
}
this._stream.push_volume();
},
_notifyVolumeChange: function() {
global.cancel_theme_sound(VOLUME_NOTIFY_ID);
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change');
},
_updateVolume: function() {
let muted = this._stream.is_muted;
this._slider.setValue(muted ? 0 : (this._stream.volume / this._control.get_vol_max_norm()));
this.emit('stream-updated');
},
getIcon: function() {
if (!this._stream)
return null;
let volume = this._stream.volume;
if (this._stream.is_muted || volume <= 0) {
return 'audio-volume-muted-symbolic';
} else {
let n = Math.floor(3 * volume / this._control.get_vol_max_norm()) + 1;
if (n < 2)
return 'audio-volume-low-symbolic';
if (n >= 3)
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
}
}
});
Signals.addSignalMethods(StreamSlider.prototype);
const OutputStreamSlider = new Lang.Class({
Name: 'OutputStreamSlider',
Extends: StreamSlider,
_connectStream: function(stream) {
this.parent(stream);
this._portChangedId = stream.connect('notify::port', Lang.bind(this, this._portChanged));
this._portChanged();
}, },
_findHeadphones: function(sink) { _findHeadphones: function(sink) {
@ -117,60 +173,41 @@ const VolumeMenu = new Lang.Class({
return false; return false;
}, },
_disconnectStream: function(stream) {
this.parent(stream);
stream.disconnect(this._portChangedId);
this._portChangedId = 0;
},
_portChanged: function() { _portChanged: function() {
this.hasHeadphones = this._findHeadphones(this._output); let hasHeadphones = this._findHeadphones(this._stream);
this.emit('headphones-changed'); if (hasHeadphones != this._hasHeadphones) {
this._hasHeadphones = hasHeadphones;
this.emit('headphones-changed', this._hasHeadphones);
}
}
});
const InputStreamSlider = new Lang.Class({
Name: 'InputStreamSlider',
Extends: StreamSlider,
_init: function(control, title) {
this.parent(control, title);
this._control.connect('stream-added', Lang.bind(this, this._maybeShowInput));
this._control.connect('stream-removed', Lang.bind(this, this._maybeShowInput));
}, },
_readOutput: function() { _connectStream: function(stream) {
if (this._outputVolumeId) { this.parent(stream);
this._output.disconnect(this._outputVolumeId); this._maybeShowInput();
this._output.disconnect(this._outputMutedId);
this._output.disconnect(this._outputPortId);
this._outputVolumeId = 0;
this._outputMutedId = 0;
this._outputPortId = 0;
}
this._output = this._control.get_default_sink();
if (this._output) {
this._outputMutedId = this._output.connect('notify::is-muted', Lang.bind(this, this._mutedChanged, '_output'));
this._outputVolumeId = this._output.connect('notify::volume', Lang.bind(this, this._volumeChanged, '_output'));
this._outputPortId = this._output.connect('notify::port', Lang.bind(this, this._portChanged));
this._mutedChanged(null, null, '_output');
this._volumeChanged(null, null, '_output');
this._portChanged();
} else {
this.hasHeadphones = false;
this._outputSlider.setValue(0);
this.emit('icon-changed', 'audio-volume-muted-symbolic');
}
},
_readInput: function() {
if (this._inputVolumeId) {
this._input.disconnect(this._inputVolumeId);
this._input.disconnect(this._inputMutedId);
this._inputVolumeId = 0;
this._inputMutedId = 0;
}
this._input = this._control.get_default_source();
if (this._input) {
this._inputMutedId = this._input.connect('notify::is-muted', Lang.bind(this, this._mutedChanged, '_input'));
this._inputVolumeId = this._input.connect('notify::volume', Lang.bind(this, this._volumeChanged, '_input'));
this._mutedChanged (null, null, '_input');
this._volumeChanged (null, null, '_input');
} else {
this._inputTitle.actor.hide();
this._inputSlider.actor.hide();
}
}, },
_maybeShowInput: function() { _maybeShowInput: function() {
// only show input widgets if any application is recording audio // only show input widgets if any application is recording audio
let showInput = false; let showInput = false;
let recordingApps = this._control.get_source_outputs(); let recordingApps = this._control.get_source_outputs();
if (this._input && recordingApps) { if (this._stream && recordingApps) {
for (let i = 0; i < recordingApps.length; i++) { for (let i = 0; i < recordingApps.length; i++) {
let outputStream = recordingApps[i]; let outputStream = recordingApps[i];
let id = outputStream.get_application_id(); let id = outputStream.get_application_id();
@ -183,63 +220,70 @@ const VolumeMenu = new Lang.Class({
} }
} }
this._inputTitle.actor.visible = showInput; this._showInput = showInput;
this._inputSlider.actor.visible = showInput; this._updateVisibility();
}, },
_volumeToIcon: function(volume) { _shouldBeVisible: function() {
if (volume <= 0) { return this.parent() && this._showInput;
return 'audio-volume-muted-symbolic'; }
});
const VolumeMenu = new Lang.Class({
Name: 'VolumeMenu',
Extends: PopupMenu.PopupMenuSection,
_init: function(control) {
this.parent();
this.hasHeadphones = false;
this._control = control;
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));
this._control.connect('default-sink-changed', Lang.bind(this, this._readOutput));
this._control.connect('default-source-changed', Lang.bind(this, this._readInput));
/* Translators: This is the label for audio volume */
this._output = new OutputStreamSlider(this._control, _("Volume"));
this._output.connect('stream-updated', Lang.bind(this, function() {
this.emit('icon-changed');
}));
this._output.connect('headphones-changed', Lang.bind(this, function(stream, value) {
this.emit('headphones-changed', value);
}));
this.addMenuItem(this._output.item);
this._input = new InputStreamSlider(this._control, _("Microphone"));
this.addMenuItem(this._input.item);
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._onControlStateChanged();
},
scroll: function(event) {
this._output.scroll(event);
},
_onControlStateChanged: function() {
if (this._control.get_state() == Gvc.MixerControlState.READY) {
this._readInput();
this._readOutput();
} else { } else {
let n = Math.floor(3 * volume / this._volumeMax) + 1; this.emit('icon-changed');
if (n < 2)
return 'audio-volume-low-symbolic';
if (n >= 3)
return 'audio-volume-high-symbolic';
return 'audio-volume-medium-symbolic';
} }
}, },
_sliderChanged: function(slider, value, property) { _readOutput: function() {
if (this[property] == null) { this._output.stream = this._control.get_default_sink();
log ('Volume slider changed for %s, but %s does not exist'.format(property, property));
return;
}
let volume = value * this._volumeMax;
let prev_muted = this[property].is_muted;
if (volume < 1) {
this[property].volume = 0;
if (!prev_muted)
this[property].change_is_muted(true);
} else {
this[property].volume = volume;
if (prev_muted)
this[property].change_is_muted(false);
}
this[property].push_volume();
}, },
_notifyVolumeChange: function() { _readInput: function() {
global.cancel_theme_sound(VOLUME_NOTIFY_ID); this._input.stream = this._control.get_default_source();
global.play_theme_sound(VOLUME_NOTIFY_ID, 'audio-volume-change');
}, },
_mutedChanged: function(object, param_spec, property) { getIcon: function() {
let muted = this[property].is_muted; return this._output.getIcon();
let slider = this[property+'Slider'];
slider.setValue(muted ? 0 : (this[property].volume / this._volumeMax));
if (property == '_output') {
if (muted)
this.emit('icon-changed', 'audio-volume-muted-symbolic');
else
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
}
},
_volumeChanged: function(object, param_spec, property) {
this[property+'Slider'].setValue(this[property].volume / this._volumeMax);
if (property == '_output' && !this._output.is_muted)
this.emit('icon-changed', this._volumeToIcon(this._output.volume));
} }
}); });
@ -252,13 +296,13 @@ const Indicator = new Lang.Class({
this._control = getMixerControl(); this._control = getMixerControl();
this._volumeMenu = new VolumeMenu(this._control); this._volumeMenu = new VolumeMenu(this._control);
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) { this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu) {
this._hasPulseAudio = (icon != null); let icon = this._volumeMenu.getIcon();
this.actor.visible = (icon != null);
this.setIcon(icon); this.setIcon(icon);
this._syncVisibility();
})); }));
this._volumeMenu.connect('headphones-changed', Lang.bind(this, function() { this._volumeMenu.connect('headphones-changed', Lang.bind(this, function(menu, value) {
this._syncVisibility(); this._headphoneIcon.visible = value;
})); }));
this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'headphones-symbolic' })); this._headphoneIcon = this.addIcon(new Gio.ThemedIcon({ name: 'headphones-symbolic' }));
@ -272,13 +316,7 @@ const Indicator = new Lang.Class({
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
}, },
_syncVisibility: function() {
this.actor.visible = this._hasPulseAudio;
this.mainIcon.visible = this._hasPulseAudio;
this._headphoneIcon.visible = this._hasPulseAudio && this._volumeMenu.hasHeadphones;
},
_onScrollEvent: function(actor, event) { _onScrollEvent: function(actor, event) {
this._volumeMenu.scroll(event.get_scroll_direction()); this._volumeMenu.scroll(event);
} }
}); });

View File

@ -637,5 +637,6 @@ function drawArrow(area, side) {
Clutter.cairo_set_source_color(cr, bodyColor); Clutter.cairo_set_source_color(cr, bodyColor);
cr.fill(); cr.fill();
cr.$dispose();
} }

View File

@ -198,6 +198,8 @@ const UnlockDialog = new Lang.Class({
x_align: St.Align.END, x_align: St.Align.END,
y_align: St.Align.MIDDLE }); y_align: St.Align.MIDDLE });
let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
let otherUserLabel = new St.Label({ text: _("Log in as another user"), let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' }); style_class: 'login-dialog-not-listed-label' });
this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button', this._otherUserButton = new St.Button({ style_class: 'login-dialog-not-listed-button',
@ -210,6 +212,9 @@ const UnlockDialog = new Lang.Class({
this.dialogLayout.add(this._otherUserButton, this.dialogLayout.add(this._otherUserButton,
{ x_align: St.Align.START, { x_align: St.Align.START,
x_fill: false }); x_fill: false });
} else {
this._otherUserButton = null;
}
this._updateSensitivity(true); this._updateSensitivity(true);
@ -231,8 +236,10 @@ const UnlockDialog = new Lang.Class({
this._promptEntry.reactive = sensitive; this._promptEntry.reactive = sensitive;
this._promptEntry.clutter_text.editable = sensitive; this._promptEntry.clutter_text.editable = sensitive;
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0); this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
if (this._otherUserButton) {
this._otherUserButton.reactive = sensitive; this._otherUserButton.reactive = sensitive;
this._otherUserButton.can_focus = sensitive; this._otherUserButton.can_focus = sensitive;
}
}, },
_updateOkButtonSensitivity: function(sensitive) { _updateOkButtonSensitivity: function(sensitive) {

View File

@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
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;
@ -30,9 +29,6 @@ const CLOSE_BUTTON_FADE_TIME = 0.1;
const DRAGGING_WINDOW_OPACITY = 100; const DRAGGING_WINDOW_OPACITY = 100;
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
const BUTTON_LAYOUT_KEY = 'button-layout';
// When calculating a layout, we calculate the scale of windows and the percent // When calculating a layout, we calculate the scale of windows and the percent
// of the available area the new layout uses. If the values for the new layout, // of the available area the new layout uses. If the values for the new layout,
// when weighted with the values as below, are worse than the previous layout's, // when weighted with the values as below, are worse than the previous layout's,
@ -260,23 +256,37 @@ const WindowClone = new Lang.Class({
_onScroll : function (actor, event) { _onScroll : function (actor, event) {
let direction = event.get_scroll_direction(); let direction = event.get_scroll_direction();
if (direction == Clutter.ScrollDirection.UP) { let delta;
if (event.is_pointer_emulated())
return;
if (direction == Clutter.ScrollDirection.DOWN) {
delta = -SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.UP) {
delta = +SCROLL_SCALE_AMOUNT;
} else if (direction == Clutter.ScrollDirection.SMOOTH) {
let [dx, dy] = event.get_scroll_delta();
delta = -dy * 10;
}
if (delta > 0) {
if (this._zoomStep == undefined) if (this._zoomStep == undefined)
this._zoomStart(); this._zoomStart();
if (this._zoomStep < 100) { if (this._zoomStep < 100) {
this._zoomStep += SCROLL_SCALE_AMOUNT; this._zoomStep += delta;
this._zoomStep = Math.min(100, this._zoomStep);
this._zoomUpdate(); this._zoomUpdate();
} }
} else if (direction == Clutter.ScrollDirection.DOWN) { } else if (delta < 0) {
if (this._zoomStep > 0) { if (this._zoomStep > 0) {
this._zoomStep -= SCROLL_SCALE_AMOUNT; this._zoomStep += delta;
this._zoomStep = Math.max(0, this._zoomStep); this._zoomStep = Math.max(0, this._zoomStep);
this._zoomUpdate(); this._zoomUpdate();
} }
if (this._zoomStep <= 0.0) if (this._zoomStep <= 0.0)
this._zoomEnd(); this._zoomEnd();
} }
}, },
_zoomUpdate : function () { _zoomUpdate : function () {
@ -441,8 +451,6 @@ const WindowOverlay = new Lang.Class({
this._parentActor = parentActor; this._parentActor = parentActor;
this._hidden = false; this._hidden = false;
this._settings = new Gio.Settings({ schema: BUTTON_LAYOUT_SCHEMA });
this.borderSize = 0; this.borderSize = 0;
this.border = new St.Bin({ style_class: 'window-clone-border' }); this.border = new St.Bin({ style_class: 'window-clone-border' });
@ -535,15 +543,8 @@ const WindowOverlay = new Lang.Class({
let button = this.closeButton; let button = this.closeButton;
let title = this.title; let title = this.title;
let layout = this._settings.get_string(BUTTON_LAYOUT_KEY); let layout = Meta.prefs_get_button_layout();
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; let side = layout.left_buttons.indexOf(Meta.ButtonFunction.CLOSE) > -1 ? St.Side.LEFT : St.Side.RIGHT;
let split = layout.split(":");
let side;
if (split[0].indexOf("close") > -1)
side = rtl ? St.Side.RIGHT : St.Side.LEFT;
else
side = rtl ? St.Side.LEFT : St.Side.RIGHT;
let buttonX; let buttonX;
let buttonY = cloneY - (button.height - button._overlap); let buttonY = cloneY - (button.height - button._overlap);

237
po/ar.po
View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-09 04:45+0200\n" "POT-Creation-Date: 2012-12-23 18:34+0200\n"
"PO-Revision-Date: 2012-12-09 04:52+0200\n" "PO-Revision-Date: 2012-12-09 04:52+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n" "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n" "Language-Team: Arabic <doc@arabeyes.org>\n"
@ -365,8 +365,8 @@ msgstr "نافذة الولوج"
msgid "Power" msgid "Power"
msgstr "الطاقة" msgstr "الطاقة"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:790
msgid "Suspend" msgid "Suspend"
msgstr "علّق" msgstr "علّق"
@ -374,8 +374,8 @@ msgstr "علّق"
msgid "Restart" msgid "Restart"
msgstr "أعِد التشغيل" msgstr "أعِد التشغيل"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788 #: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
msgid "Power Off" msgid "Power Off"
msgstr "أطفئ الحاسوب" msgstr "أطفئ الحاسوب"
@ -410,27 +410,19 @@ msgid "Execution of '%s' failed:"
msgstr "فشل تنفيذ '%s':" msgstr "فشل تنفيذ '%s':"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:259 #: ../js/ui/appDisplay.js:258
msgid "All" msgid "All"
msgstr "الكل" msgstr "الكل"
#: ../js/ui/appDisplay.js:318 #: ../js/ui/appDisplay.js:666
msgid "APPLICATIONS"
msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "الإعدادات"
#: ../js/ui/appDisplay.js:679
msgid "New Window" msgid "New Window"
msgstr "نافذة جديدة" msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة" msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:683 #: ../js/ui/appDisplay.js:670
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة" msgstr "أضِف إلى المفضّلة"
@ -447,19 +439,19 @@ msgstr "أُزيل %s من مفضّلتك."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:61
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "طوال اليوم" msgstr "طوال اليوم"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:67 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H:%M" msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:74 #: ../js/ui/calendar.js:73
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l:%M %p" msgstr "%l:%M %p"
@ -469,43 +461,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:104
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "ح" msgstr "ح"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:106
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "ن" msgstr "ن"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:108
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "ث" msgstr "ث"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:110
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "ر" msgstr "ر"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:122 #: ../js/ui/calendar.js:112
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "خ" msgstr "خ"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:124 #: ../js/ui/calendar.js:114
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "ج" msgstr "ج"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:126 #: ../js/ui/calendar.js:116
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "س" msgstr "س"
@ -516,77 +508,77 @@ msgstr "س"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:129
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "الأحد" msgstr "الأحد"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:131
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "الاثنين" msgstr "الاثنين"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:133
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "الثلاثاء" msgstr "الثلاثاء"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:135
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "الأربعاء" msgstr "الأربعاء"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:147 #: ../js/ui/calendar.js:137
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "الخميس" msgstr "الخميس"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:149 #: ../js/ui/calendar.js:139
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "الجمعة" msgstr "الجمعة"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:151 #: ../js/ui/calendar.js:141
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "السبت" msgstr "السبت"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:700 #: ../js/ui/calendar.js:674
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "الجدول خال" msgstr "الجدول خال"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:716 #: ../js/ui/calendar.js:690
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A %d %B" msgstr "%A %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:719 #: ../js/ui/calendar.js:693
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %d %B %Y" msgstr "%A %d %B %Y"
#: ../js/ui/calendar.js:729 #: ../js/ui/calendar.js:703
msgid "Today" msgid "Today"
msgstr "اليوم" msgstr "اليوم"
#: ../js/ui/calendar.js:733 #: ../js/ui/calendar.js:707
msgid "Tomorrow" msgid "Tomorrow"
msgstr "غدا" msgstr "غدا"
#: ../js/ui/calendar.js:744 #: ../js/ui/calendar.js:718
msgid "This week" msgid "This week"
msgstr "هذا الأسبوع" msgstr "هذا الأسبوع"
#: ../js/ui/calendar.js:752 #: ../js/ui/calendar.js:726
msgid "Next week" msgid "Next week"
msgstr "الأسبوع القادم" msgstr "الأسبوع القادم"
@ -948,7 +940,7 @@ msgstr "أظهر الحساب"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "السبب غير معروف" msgstr "السبب غير معروف"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
msgid "Windows" msgid "Windows"
msgstr "النوافذ" msgstr "النوافذ"
@ -1088,7 +1080,7 @@ msgstr "هل تريد تنزيل وتثبيت '%s' من extensions.gnome.org؟"
msgid "tray" msgid "tray"
msgstr "لوحة النظام" msgstr "لوحة النظام"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "لوحة المفاتيح" msgstr "لوحة المفاتيح"
@ -1115,7 +1107,9 @@ msgstr "اظهر الأخطاء"
msgid "Enabled" msgid "Enabled"
msgstr "مفعّل" msgstr "مفعّل"
#: ../js/ui/lookingGlass.js:767 #. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "معطّل" msgstr "معطّل"
@ -1147,15 +1141,15 @@ msgstr "افتح"
msgid "Remove" msgid "Remove"
msgstr "أزِل" msgstr "أزِل"
#: ../js/ui/messageTray.js:1551 #: ../js/ui/messageTray.js:1552
msgid "No Messages" msgid "No Messages"
msgstr "لا رسائل" msgstr "لا رسائل"
#: ../js/ui/messageTray.js:1568 #: ../js/ui/messageTray.js:1570
msgid "Message Tray" msgid "Message Tray"
msgstr "لوحة الرسائل" msgstr "لوحة الرسائل"
#: ../js/ui/messageTray.js:2635 #: ../js/ui/messageTray.js:2639
msgid "System Information" msgid "System Information"
msgstr "معلومات النظام" msgstr "معلومات النظام"
@ -1164,11 +1158,11 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "غير معروف" msgstr "غير معروف"
#: ../js/ui/overview.js:95 #: ../js/ui/overview.js:92
msgid "Undo" msgid "Undo"
msgstr "تراجع" msgstr "تراجع"
#: ../js/ui/overview.js:144 #: ../js/ui/overview.js:139
msgid "Overview" msgid "Overview"
msgstr "نظرة عامة" msgstr "نظرة عامة"
@ -1176,13 +1170,13 @@ msgstr "نظرة عامة"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:221 #: ../js/ui/overview.js:218
msgid "Type to search..." msgid "Type to search..."
msgstr "اكتب نصا للبحث عنه..." msgstr "اكتب نصا للبحث عنه..."
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:242 #: ../js/ui/overview.js:236
msgid "Dash" msgid "Dash"
msgstr "الشريط" msgstr "الشريط"
@ -1205,7 +1199,7 @@ msgstr "الشريط العلوي"
#. "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:732 #: ../js/ui/popupMenu.js:725
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1245,15 +1239,15 @@ msgstr[3] "%d تنبيهات جديدة"
msgstr[4] "%d تنبيها جديدا" msgstr[4] "%d تنبيها جديدا"
msgstr[5] "%d تنبيه جديد" msgstr[5] "%d تنبيه جديد"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780 #: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
msgid "Lock" msgid "Lock"
msgstr "أوصِد" msgstr "أوصِد"
#: ../js/ui/searchDisplay.js:277 #: ../js/ui/searchDisplay.js:403
msgid "Searching..." msgid "Searching..."
msgstr "يبحث..." msgstr "يبحث..."
#: ../js/ui/searchDisplay.js:325 #: ../js/ui/searchDisplay.js:451
msgid "No results." msgid "No results."
msgstr "لا نتائج." msgstr "لا نتائج."
@ -1369,7 +1363,7 @@ msgid "disconnecting..."
msgstr "يقطع الاتّصال..." msgstr "يقطع الاتّصال..."
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1464
msgid "connecting..." msgid "connecting..."
msgstr "يتّصل..." msgstr "يتّصل..."
@ -1385,7 +1379,7 @@ msgstr "إعدادات لوحة المفاتيح"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "إعدادات الفأرة" msgstr "إعدادات الفأرة"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
msgid "Sound Settings" msgid "Sound Settings"
msgstr "إعدادات الصوت" msgstr "إعدادات الصوت"
@ -1449,15 +1443,15 @@ msgstr "من فضلك أدخل الرقم المذكور على الجهاز."
msgid "OK" msgid "OK"
msgstr "حسنا" msgstr "حسنا"
#: ../js/ui/status/keyboard.js:228 #: ../js/ui/status/keyboard.js:363
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "أظهر تخطيط لوحة المفاتيح" msgstr "أظهر تخطيط لوحة المفاتيح"
#: ../js/ui/status/keyboard.js:233 #: ../js/ui/status/keyboard.js:368
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "إعدادات الإقليم واللغة" msgstr "إعدادات الإقليم واللغة"
#: ../js/ui/status/lockScreenMenu.js:18 #: ../js/ui/status/lockScreenMenu.js:43
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "الصوت، الشبكة، البطارية" msgstr "الصوت، الشبكة، البطارية"
@ -1477,7 +1471,7 @@ msgid "unmanaged"
msgstr "غير مُدار" msgstr "غير مُدار"
#. 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:1456 #: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
msgid "authentication required" msgid "authentication required"
msgstr "الاستيثاق مطلوب" msgstr "الاستيثاق مطلوب"
@ -1498,72 +1492,72 @@ msgstr "الكبل مفصول"
msgid "unavailable" msgid "unavailable"
msgstr "غير متاح" msgstr "غير متاح"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
msgid "connection failed" msgid "connection failed"
msgstr "فشل الاتصال" msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392 #: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1534 #: ../js/ui/status/network.js:1545
msgid "More..." msgid "More..."
msgstr "المزيد..." msgstr "المزيد..."
#. 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:1322 #: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
msgid "Connected (private)" msgid "Connected (private)"
msgstr "متّصل (شخصي)" msgstr "متّصل (شخصي)"
#: ../js/ui/status/network.js:619 #: ../js/ui/status/network.js:641
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "إيثرنت تلقائي" msgstr "إيثرنت تلقائي"
#: ../js/ui/status/network.js:677 #: ../js/ui/status/network.js:688
msgid "Auto broadband" msgid "Auto broadband"
msgstr "شبكة هاتف محمول تلقائية" msgstr "شبكة هاتف محمول تلقائية"
#: ../js/ui/status/network.js:680 #: ../js/ui/status/network.js:691
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "اتصال هاتفي تلقائي" msgstr "اتصال هاتفي تلقائي"
#. 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:809 ../js/ui/status/network.js:1339 #: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s تلقائي" msgstr "%s تلقائي"
#: ../js/ui/status/network.js:811 #: ../js/ui/status/network.js:822
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "بلوتوث تلقائي" msgstr "بلوتوث تلقائي"
#: ../js/ui/status/network.js:1341 #: ../js/ui/status/network.js:1352
msgid "Auto wireless" msgid "Auto wireless"
msgstr "لاسلكي تلقائي" msgstr "لاسلكي تلقائي"
#: ../js/ui/status/network.js:1584 #: ../js/ui/status/network.js:1595
msgid "Enable networking" msgid "Enable networking"
msgstr "فعّل الشبكات" msgstr "فعّل الشبكات"
#: ../js/ui/status/network.js:1616 #: ../js/ui/status/network.js:1627
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "واي فاي" msgstr "واي فاي"
#: ../js/ui/status/network.js:1635 #: ../js/ui/status/network.js:1646
msgid "Network Settings" msgid "Network Settings"
msgstr "إعدادات الشّبكة" msgstr "إعدادات الشّبكة"
#: ../js/ui/status/network.js:1679 #: ../js/ui/status/network.js:1692
msgid "Network Manager" msgid "Network Manager"
msgstr "مدير الشبكة" msgstr "مدير الشبكة"
#: ../js/ui/status/network.js:1761 #: ../js/ui/status/network.js:1774
msgid "Connection failed" msgid "Connection failed"
msgstr "فشل الاتصال" msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:1762 #: ../js/ui/status/network.js:1775
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "فشل تفعيل اتصال الشبكة" msgstr "فشل تفعيل اتصال الشبكة"
#: ../js/ui/status/network.js:2079 #: ../js/ui/status/network.js:2092
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "عُطّلت الشبكات" msgstr "عُطّلت الشبكات"
@ -1681,11 +1675,11 @@ msgid "Unknown"
msgstr "غير معروف" msgstr "غير معروف"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:50 ../js/ui/status/volume.js:251 #: ../js/ui/status/volume.js:247 ../js/ui/status/volume.js:295
msgid "Volume" msgid "Volume"
msgstr "شدة الصوت" msgstr "شدة الصوت"
#: ../js/ui/status/volume.js:62 #: ../js/ui/status/volume.js:256
msgid "Microphone" msgid "Microphone"
msgstr "ميكروفون" msgstr "ميكروفون"
@ -1721,31 +1715,31 @@ msgstr "ساكن"
msgid "Offline" msgid "Offline"
msgstr "غير متصل" msgstr "غير متصل"
#: ../js/ui/userMenu.js:754 #: ../js/ui/userMenu.js:755
msgid "Notifications" msgid "Notifications"
msgstr "التنبيهات" msgstr "التنبيهات"
#: ../js/ui/userMenu.js:762 #: ../js/ui/userMenu.js:763
msgid "Settings" msgid "Settings"
msgstr "الإعدادات" msgstr "الإعدادات"
#: ../js/ui/userMenu.js:770 #: ../js/ui/userMenu.js:771
msgid "Switch User" msgid "Switch User"
msgstr "بدّل المستخدم" msgstr "بدّل المستخدم"
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:776
msgid "Log Out" msgid "Log Out"
msgstr "اخرج" msgstr "اخرج"
#: ../js/ui/userMenu.js:795 #: ../js/ui/userMenu.js:796
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "ثبّت التحديثات وأعد التشغيل" msgstr "ثبّت التحديثات وأعد التشغيل"
#: ../js/ui/userMenu.js:813 #: ../js/ui/userMenu.js:814
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "ستُجعل حالة اتصالك ”مشغول“" msgstr "ستُجعل حالة اتصالك ”مشغول“"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:815
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."
@ -1753,15 +1747,15 @@ msgstr ""
"التنبيهات معطلة الآن، بما فيها رسائل المحادثة. حالة اتصالك تغيرت حتى يعلم " "التنبيهات معطلة الآن، بما فيها رسائل المحادثة. حالة اتصالك تغيرت حتى يعلم "
"الآخرون أنك قد لا ترى رسائلهم." "الآخرون أنك قد لا ترى رسائلهم."
#: ../js/ui/viewSelector.js:91 #: ../js/ui/viewSelector.js:85
msgid "Applications" msgid "Applications"
msgstr "التطبيقات" msgstr "التطبيقات"
#: ../js/ui/viewSelector.js:95 #: ../js/ui/viewSelector.js:89
msgid "Search" msgid "Search"
msgstr "ابحث" msgstr "ابحث"
#: ../js/ui/wanda.js:94 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1770,15 +1764,11 @@ msgstr ""
"عذرًا, لا حكمة لك اليوم:\n" "عذرًا, لا حكمة لك اليوم:\n"
"%s" "%s"
#: ../js/ui/wanda.js:98 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "يقول الحكيم %s" msgstr "يقول الحكيم %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr ""
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
@ -1788,6 +1778,36 @@ msgstr "'%s' جاهز"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "تقويم إيفُليوشِن" msgstr "تقويم إيفُليوشِن"
#. 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] "لا مخرَج"
msgstr[1] "مخرَج واحد"
msgstr[2] "مخرَجين"
msgstr[3] "%u مخارج"
msgstr[4] "%u مخرجا"
msgstr[5] "%u مخرج"
#. 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] "لا مدخل"
msgstr[1] "مدخل واحد"
msgstr[2] "مدخلين"
msgstr[3] "%u مداخل"
msgstr[4] "%u مدخلا"
msgstr[5] "%u مدخل"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "أصوات النظام"
#: ../src/main.c:332 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "اطبع الإصدارة" msgstr "اطبع الإصدارة"
@ -1829,6 +1849,12 @@ msgstr "المبدئي"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "أغلق المستخدم مربع الاستيثاق الحِواري" msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ msgid "APPLICATIONS"
#~ msgstr "التطبيقات"
#~ msgid "SETTINGS"
#~ msgstr "الإعدادات"
#~ msgid "Subscription request" #~ msgid "Subscription request"
#~ msgstr "طلب اشتراك" #~ msgstr "طلب اشتراك"
@ -1877,27 +1903,6 @@ msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ msgid "System Settings" #~ msgid "System Settings"
#~ msgstr "إعدادات النظام" #~ msgstr "إعدادات النظام"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "لا مخرَج"
#~ msgstr[1] "مخرَج واحد"
#~ msgstr[2] "مخرَجين"
#~ msgstr[3] "%u مخارج"
#~ msgstr[4] "%u مخرجا"
#~ msgstr[5] "%u مخرج"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "لا مدخل"
#~ msgstr[1] "مدخل واحد"
#~ msgstr[2] "مدخلين"
#~ msgstr[3] "%u مداخل"
#~ msgstr[4] "%u مدخلا"
#~ msgstr[5] "%u مدخل"
#~ msgid "System Sounds"
#~ msgstr "أصوات النظام"
#~ msgid "Failed to unmount '%s'" #~ msgid "Failed to unmount '%s'"
#~ msgstr "فشل فصْل '%s'" #~ msgstr "فشل فصْل '%s'"

820
po/de.po

File diff suppressed because it is too large Load Diff

283
po/es.po
View File

@ -10,15 +10,15 @@ 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-09 13:03+0000\n" "POT-Creation-Date: 2012-12-19 14:51+0000\n"
"PO-Revision-Date: 2012-12-16 20:37+0100\n" "PO-Revision-Date: 2012-12-26 11:38+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español; Castellano <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Generator: Gtranslator 2.91.5\n" "X-Generator: Gtranslator 2.91.5\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
@ -38,8 +38,6 @@ msgid "Show the message tray"
msgstr "Mostrar la bandeja de mensajes" msgstr "Mostrar la bandeja de mensajes"
#: ../data/50-gnome-shell-system.xml.in.h:3 #: ../data/50-gnome-shell-system.xml.in.h:3
#| msgid "%d new notification"
#| msgid_plural "%d new notifications"
msgid "Focus the active notification" msgid "Focus the active notification"
msgstr "Dar el foco a la notificación activa" msgstr "Dar el foco a la notificación activa"
@ -155,25 +153,31 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu." msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "" msgstr ""
"Mostrar siempre el elemento de menú «Cerrar sesión» en el menú del usuario."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "" msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-" "This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations." "user, single-session situations."
msgstr "" msgstr ""
"Esta clave sobreescribe la ocultación automática del elemento de menú «Cerrar "
"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" msgid "Show full name in the user menu"
msgstr "" msgstr "Mostrar el nombre completo en el menú del usuario"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not." msgid "Whether the users full name is shown in the user menu or not."
msgstr "" 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 #: ../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 "
"remotos o cifrados"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "" msgid ""
@ -182,6 +186,10 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default " "'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"La shell solicitará una contraseña cuando se monte un dispositivo cifrado o "
"un sistema de archivos remoto. Si la contraseña se puede guardar para usarla "
"en un futuro, se mostrará la casilla «Recordar contraseña». Esta clave "
"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:19
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@ -219,16 +227,14 @@ 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:27
#, fuzzy
#| msgid "Keybinding to open the application menu" #| 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 abrir el menú de la aplicación" 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:28
#, fuzzy
#| msgid "Keybinding to open the application menu." #| 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 abrir el menú de la aplicación." 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:29
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
@ -277,17 +283,16 @@ msgid ""
"used as a placeholder for a guess at the optimal thread count on the system." "used as a placeholder for a guess at the optimal thread count on the system."
msgstr "" msgstr ""
"Establece la tubería GStreamer usada para codificar grabaciones. Sigue la " "Establece la tubería GStreamer usada para codificar grabaciones. Sigue la "
"sintaxis usada para gst-launch. La tubería debería tener un sumidero " "sintaxis usada para gst-launch. La tubería debería tener un sumidero («sink») "
"(«sink») desconectado donde grabar el vídeo que se está grabando. " "desconectado donde grabar el vídeo que se está grabando. Generalmente tendrá "
"Generalmente tendrá un punto de origen desconectado; la salida de ese punto " "un punto de origen desconectado; la salida de ese punto se escribirá en el "
"se escribirá en el archivo de salida. Sin embargo, la tubería también puede " "archivo de salida. Sin embargo, la tubería también puede tomar parte en su "
"tomar parte en su propia salida; esto se puede usar para enviar la salida a " "propia salida; esto se puede usar para enviar la salida a un servidor "
"un servidor «icecast» a través de shout2send o similar. Cuando no está " "«icecast» a través de shout2send o similar. Cuando no está establecido o lo "
"establecido o lo está a un valor vacío, se usará la tubería predeterminada. " "está a un valor vacío, se usará la tubería predeterminada. Actualmente es "
"Actualmente es «'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " "«'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 "
"deadline=1000000 threads=%T ! queue ! webmmux» y graba en WEBM usando el " "threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
"códec VP8. Se usa %T como marcador de posición para el número de hilos " "como marcador de posición para el número de hilos óptimos en el sistema."
"óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
@ -304,9 +309,8 @@ msgstr ""
"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:40
#| msgid "Open the application menu"
msgid "The application icon mode." msgid "The application icon mode."
msgstr "" 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:41
msgid "" msgid ""
@ -314,37 +318,45 @@ msgid ""
"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 ""
"Configura cómo se muestran las ventanas en el selector. Los valore posibles "
"son «thumbnail-only» (muestra una miniatura de la ventana), «app-icon-"
"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:42
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "" 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:43
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."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44 #: ../data/org.gnome.shell.gschema.xml.in.in.h:44
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
msgstr "" 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:45
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 ""
"Esta clave sobreescribe la clave en org.gnome.desktop.wm.preferences al "
"ejecutar GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:46 #: ../data/org.gnome.shell.gschema.xml.in.in.h:46
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 "
"ventana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "" 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:48
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "" msgstr "Áreas de trabajo solo en la pantalla principal"
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
@ -389,7 +401,6 @@ msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:978
#| msgid "Next week"
msgid "Next" msgid "Next"
msgstr "Siguiente" msgstr "Siguiente"
@ -410,8 +421,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:674 ../js/ui/userMenu.js:678 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:790
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@ -419,8 +430,8 @@ msgstr "Suspender"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788 #: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
@ -455,27 +466,19 @@ msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:" msgstr "Falló la ejecución de «%s»:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:259 #: ../js/ui/appDisplay.js:258
msgid "All" msgid "All"
msgstr "Todas" msgstr "Todas"
#: ../js/ui/appDisplay.js:318 #: ../js/ui/appDisplay.js:666
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:679
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:683 #: ../js/ui/appDisplay.js:670
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
@ -492,19 +495,19 @@ msgstr "Se ha quitado %s de sus favoritos."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:61
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Todo el día" msgstr "Todo el día"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:67 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H:%M" msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:74 #: ../js/ui/calendar.js:73
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l:%M %p" msgstr "%l:%M %p"
@ -514,43 +517,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:104
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "D" msgstr "D"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:106
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:108
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:110
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "X" msgstr "X"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:122 #: ../js/ui/calendar.js:112
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "J" msgstr "J"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:124 #: ../js/ui/calendar.js:114
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "V" msgstr "V"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:126 #: ../js/ui/calendar.js:116
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
@ -561,77 +564,77 @@ msgstr "S"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:129
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Dom" msgstr "Dom"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:131
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "L" msgstr "L"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:133
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "M" msgstr "M"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:135
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "X" msgstr "X"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:147 #: ../js/ui/calendar.js:137
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "J" msgstr "J"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:149 #: ../js/ui/calendar.js:139
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "V" msgstr "V"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:151 #: ../js/ui/calendar.js:141
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:700 #: ../js/ui/calendar.js:674
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Nada programado" msgstr "Nada programado"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:716 #: ../js/ui/calendar.js:690
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:719 #: ../js/ui/calendar.js:693
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d de %B de %Y" msgstr "%A, %d de %B de %Y"
#: ../js/ui/calendar.js:729 #: ../js/ui/calendar.js:703
msgid "Today" msgid "Today"
msgstr "Hoy" msgstr "Hoy"
#: ../js/ui/calendar.js:733 #: ../js/ui/calendar.js:707
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Mañana" msgstr "Mañana"
#: ../js/ui/calendar.js:744 #: ../js/ui/calendar.js:718
msgid "This week" msgid "This week"
msgstr "Esta semana" msgstr "Esta semana"
#: ../js/ui/calendar.js:752 #: ../js/ui/calendar.js:726
msgid "Next week" msgid "Next week"
msgstr "La semana que viene" msgstr "La semana que viene"
@ -693,8 +696,8 @@ msgstr "La red inalámbrica requiere autenticación"
#: ../js/ui/components/networkAgent.js:310 #: ../js/ui/components/networkAgent.js:310
#, c-format #, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network '%"
"'%s'." "s'."
msgstr "" msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red " "Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»." "inalámbrica «%s»."
@ -795,14 +798,12 @@ msgstr "<b>Ayer</b>, <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30 #. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:937 #: ../js/ui/components/telepathyClient.js:937
#, no-c-format #, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgid "<b>%A</b>, <b>%H:%M</b>" msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "<b>%A</b>, <b>%H:%M</b>" 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
#, no-c-format #, no-c-format
#| msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%d</b> de <b>%B</b>, <b>%H:%M</b>" msgstr "<b>%d</b> de <b>%B</b>, <b>%H:%M</b>"
@ -995,7 +996,6 @@ msgid "Unable to connect to %s"
msgstr "No se pudo conectar a %s" msgstr "No se pudo conectar a %s"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1344
#| msgid "Edit account"
msgid "View account" msgid "View account"
msgstr "Ver cuenta" msgstr "Ver cuenta"
@ -1003,7 +1003,7 @@ msgstr "Ver cuenta"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón desconocida" msgstr "Razón desconocida"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
msgid "Windows" msgid "Windows"
msgstr "Ventanas" msgstr "Ventanas"
@ -1130,7 +1130,7 @@ msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
msgid "tray" msgid "tray"
msgstr "bandeja" msgstr "bandeja"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
@ -1189,16 +1189,15 @@ msgstr "Abrir"
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
#: ../js/ui/messageTray.js:1551 #: ../js/ui/messageTray.js:1552
#| msgid "Message Tray"
msgid "No Messages" msgid "No Messages"
msgstr "No hay mensajes" msgstr "No hay mensajes"
#: ../js/ui/messageTray.js:1568 #: ../js/ui/messageTray.js:1570
msgid "Message Tray" msgid "Message Tray"
msgstr "Bandeja de mensajes" msgstr "Bandeja de mensajes"
#: ../js/ui/messageTray.js:2635 #: ../js/ui/messageTray.js:2639
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -1207,11 +1206,11 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#: ../js/ui/overview.js:95 #: ../js/ui/overview.js:92
msgid "Undo" msgid "Undo"
msgstr "Deshacer" msgstr "Deshacer"
#: ../js/ui/overview.js:144 #: ../js/ui/overview.js:139
msgid "Overview" msgid "Overview"
msgstr "Vista general" msgstr "Vista general"
@ -1219,13 +1218,13 @@ msgstr "Vista general"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:221 #: ../js/ui/overview.js:218
msgid "Type to search..." msgid "Type to search..."
msgstr "Teclear para buscar…" msgstr "Teclear para buscar…"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:242 #: ../js/ui/overview.js:236
msgid "Dash" msgid "Dash"
msgstr "Tablero" msgstr "Tablero"
@ -1248,12 +1247,11 @@ 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:732 #: ../js/ui/popupMenu.js:711
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:205 #: ../js/ui/runDialog.js:205
#| msgid "Please enter a command:"
msgid "Enter a Command" msgid "Enter a Command"
msgstr "Introducir un comando" msgstr "Introducir un comando"
@ -1281,15 +1279,15 @@ 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:780 #: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:781
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
#: ../js/ui/searchDisplay.js:277 #: ../js/ui/searchDisplay.js:403
msgid "Searching..." msgid "Searching..."
msgstr "Buscando…" msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:325 #: ../js/ui/searchDisplay.js:451
msgid "No results." msgid "No results."
msgstr "No se encontraron resultados." msgstr "No se encontraron resultados."
@ -1405,7 +1403,7 @@ 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:442
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1464
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
@ -1461,8 +1459,7 @@ msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
#: ../js/ui/status/bluetooth.js:364 #: ../js/ui/status/bluetooth.js:364
#, c-format #, c-format
msgid "Please confirm whether the PIN '%06d' matches the one on the device." msgid "Please confirm whether the PIN '%06d' matches the one on the device."
msgstr "" msgstr "Confirme que el PIN mostrado en «%06d» coincide con el del dispositivo."
"Confirme que el PIN mostrado en «%06d» coincide con el del dispositivo."
#. Translators: this is the verb, not the noun #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:367 #: ../js/ui/status/bluetooth.js:367
@ -1486,11 +1483,11 @@ msgstr "Introduzca el PIN mencionado en el dispositivo."
msgid "OK" msgid "OK"
msgstr "Aceptar" msgstr "Aceptar"
#: ../js/ui/status/keyboard.js:228 #: ../js/ui/status/keyboard.js:363
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Mostrar la distribución del teclado" msgstr "Mostrar la distribución del teclado"
#: ../js/ui/status/keyboard.js:233 #: ../js/ui/status/keyboard.js:368
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"
@ -1514,7 +1511,7 @@ 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:1456 #: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
@ -1535,72 +1532,72 @@ msgstr "cable desconectado"
msgid "unavailable" msgid "unavailable"
msgstr "no disponible" msgstr "no disponible"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
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:1392 #: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1534 #: ../js/ui/status/network.js:1545
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:1322 #: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Conectada (privada)" msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:619 #: ../js/ui/status/network.js:641
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Ethernet automática" msgstr "Ethernet automática"
#: ../js/ui/status/network.js:677 #: ../js/ui/status/network.js:688
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Banda ancha automática" msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:680 #: ../js/ui/status/network.js:691
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:809 ../js/ui/status/network.js:1339 #: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s automática" msgstr "%s automática"
#: ../js/ui/status/network.js:811 #: ../js/ui/status/network.js:822
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth automático" msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1341 #: ../js/ui/status/network.js:1352
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Inalámbrica automática" msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1584 #: ../js/ui/status/network.js:1595
msgid "Enable networking" msgid "Enable networking"
msgstr "Activar red" msgstr "Activar red"
#: ../js/ui/status/network.js:1616 #: ../js/ui/status/network.js:1627
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1635 #: ../js/ui/status/network.js:1646
msgid "Network Settings" msgid "Network Settings"
msgstr "Configuración de la red" msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1679 #: ../js/ui/status/network.js:1692
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: ../js/ui/status/network.js:1761 #: ../js/ui/status/network.js:1774
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1762 #: ../js/ui/status/network.js:1775
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:2079 #: ../js/ui/status/network.js:2092
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "La red está desactivada" msgstr "La red está desactivada"
@ -1715,7 +1712,6 @@ 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:224
#| msgid "Login Window"
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Desbloquear ventana" msgstr "Desbloquear ventana"
@ -1743,32 +1739,31 @@ msgstr "Inactivo"
msgid "Offline" msgid "Offline"
msgstr "Desconectado" msgstr "Desconectado"
#: ../js/ui/userMenu.js:754 #: ../js/ui/userMenu.js:755
msgid "Notifications" msgid "Notifications"
msgstr "Notificaciones" msgstr "Notificaciones"
#: ../js/ui/userMenu.js:762 #: ../js/ui/userMenu.js:763
#| msgid "Mouse Settings"
msgid "Settings" msgid "Settings"
msgstr "Configuración" msgstr "Configuración"
#: ../js/ui/userMenu.js:770 #: ../js/ui/userMenu.js:771
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:776
msgid "Log Out" msgid "Log Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:795 #: ../js/ui/userMenu.js:796
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instalar actualizaciones y reiniciar" msgstr "Instalar actualizaciones y reiniciar"
#: ../js/ui/userMenu.js:813 #: ../js/ui/userMenu.js:814
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:814 #: ../js/ui/userMenu.js:815
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1777,15 +1772,15 @@ 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:91 #: ../js/ui/viewSelector.js:85
msgid "Applications" msgid "Applications"
msgstr "Aplicaciones" msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:95 #: ../js/ui/viewSelector.js:89
msgid "Search" msgid "Search"
msgstr "Buscar" msgstr "Buscar"
#: ../js/ui/wanda.js:94 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1794,15 +1789,11 @@ msgstr ""
"Hoy no tiene ningún mensaje:\n" "Hoy no tiene ningún mensaje:\n"
"%s" "%s"
#: ../js/ui/wanda.js:98 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s el oráculo dice" msgstr "%s el oráculo dice"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Su mensaje oculto favorito"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
@ -1855,6 +1846,15 @@ 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 "APPLICATIONS"
#~ msgstr "APLICACIONES"
#~ msgid "SETTINGS"
#~ msgstr "CONFIGURACIÓN"
#~ msgid "Your favorite Easter Egg"
#~ msgstr "Su mensaje oculto favorito"
#~ msgid "Subscription request" #~ msgid "Subscription request"
#~ msgstr "Solicitud de suscripción" #~ msgstr "Solicitud de suscripción"
@ -2285,8 +2285,8 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds " #~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time." #~ "in time."
#~ msgstr "" #~ msgstr ""
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los " #~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos "
#~ "segundos en la hora." #~ "en la hora."
#~ msgid "" #~ msgid ""
#~ "This key specifies the format used by the panel clock when the format key " #~ "This key specifies the format used by the panel clock when the format key "
@ -2303,19 +2303,18 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "" #~ msgid ""
#~ "This key specifies the hour format used by the panel clock. Possible " #~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to " #~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. " #~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "1970-01-01. If set to \"custom\", the clock will display time according " #~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "to the format specified in the custom_format key. Note that if set to " #~ "format specified in the custom_format key. Note that if set to either "
#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are " #~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ "ignored."
#~ msgstr "" #~ msgstr ""
#~ "Esta clave especifica el formato de la hora especificado por el reloj del " #~ "Esta clave especifica el formato de la hora especificado por el reloj del "
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 " #~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 horas), "
#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el " #~ "«unix» y «custom» (personalizado).Si se establece a «unix» el reloj mostrará "
#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). " #~ "la hora en segundos desde la época (1 de enero de 1970). Si se establece "
#~ "Si se establece a «custom» el reloj mostrará la hora según el formato " #~ "a «custom» el reloj mostrará la hora según el formato especificado en la "
#~ "especificado en la clave «custom_format». Note que si se establece a " #~ "clave «custom_format». Note que si se establece a «unix» o «custom» se "
#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»." #~ "ignoran las claves «show_date» y «show_seconds»."
#~ msgid "Clock Format" #~ msgid "Clock Format"
#~ msgstr "Formato del reloj" #~ msgstr "Formato del reloj"

View File

@ -14,7 +14,7 @@ msgstr ""
"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-09 13:03+0000\n" "POT-Creation-Date: 2012-12-09 13:03+0000\n"
"PO-Revision-Date: 2012-12-18 17:13+0300\n" "PO-Revision-Date: 2012-12-19 16:47+0300\n"
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n" "Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
"Language-Team: Estonian <>\n" "Language-Team: Estonian <>\n"
"Language: et\n" "Language: et\n"
@ -153,8 +153,8 @@ msgid ""
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"Shell küsib parooli, kui haagitakse krüpteeritud seade või kaugfailisüsteem. " "Shell küsib parooli, kui haagitakse krüpteeritud seade või kaugfailisüsteem. "
"Kui parooli on võimalik salvestada järgmise kasutuse jaoks, näidatakse " "Kui parooli on võimalik salvestada edaspidiseks kasutuseks, näidatakse "
"\"Jäta parool meelde\" märkeruutu. See võti määrab märkeruudu vaikimisi " "'Salvesta parool' märkeruutu. See võti määrab selle märkeruudu vaikimisi "
"oleku." "oleku."
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@ -257,9 +257,9 @@ msgid ""
"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 ""
"Seadistab, kuidas aknaid akendevahetajas kuvatakse. Sobivad väärtused on " "Seadistab, kuidas aknaid aknavahetajas kuvatakse. Sobivad väärtused on "
"'thumbnail-only' (näidatakse ainult pisipilti), 'app-icon-only' (näidatakse " "'thumbnail-only' (näidatakse ainult pisipilti aknast), 'app-icon-"
"ainult rakenduse ikooni) või 'both' (näidatakse mõlemaid)." "only' (näidatakse ainult akna ikooni) või 'both' (mõlemad)."
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
msgstr "Modaaldialoog kuulub vanemakna juurde" msgstr "Modaaldialoog kuulub vanemakna juurde"

620
po/gl.po

File diff suppressed because it is too large Load Diff

526
po/he.po

File diff suppressed because it is too large Load Diff

871
po/hu.po

File diff suppressed because it is too large Load Diff

1830
po/kk.po

File diff suppressed because it is too large Load Diff

960
po/lt.po

File diff suppressed because it is too large Load Diff

308
po/nb.po
View File

@ -2,14 +2,14 @@
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER # Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
# 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.
# #
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2012. # Kjartan Maraas <kmaraas@gnome.org>, 2009-2013.
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010. # Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
msgid "" 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: 2012-12-09 14:01+0100\n" "POT-Creation-Date: 2013-01-14 11:20+0100\n"
"PO-Revision-Date: 2012-12-09 14:02+0100\n" "PO-Revision-Date: 2013-01-14 11:21+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"
@ -311,11 +311,11 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:47 #: ../data/org.gnome.shell.gschema.xml.in.in.h:47
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "" 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:48
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "" msgstr "Arbeidsområder vises kun på hovedskjerm"
#: ../js/extensionPrefs/main.js:124 #: ../js/extensionPrefs/main.js:124
#, c-format #, c-format
@ -330,11 +330,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:565 #: ../js/gdm/loginDialog.js:566
msgid "Session..." msgid "Session..."
msgstr "Økt …" msgstr "Økt …"
#: ../js/gdm/loginDialog.js:722 #: ../js/gdm/loginDialog.js:723
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
@ -342,35 +342,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:786 #: ../js/gdm/loginDialog.js:787
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../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 "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
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: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 "Brukernavn: " msgstr "Brukernavn: "
#: ../js/gdm/loginDialog.js:1382 #: ../js/gdm/loginDialog.js:1383
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
@ -379,8 +379,8 @@ msgstr "Innloggingsvindu"
msgid "Power" msgid "Power"
msgstr "Strøm" msgstr "Strøm"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:790
msgid "Suspend" msgid "Suspend"
msgstr "Hvilemodus" msgstr "Hvilemodus"
@ -388,8 +388,8 @@ msgstr "Hvilemodus"
msgid "Restart" msgid "Restart"
msgstr "Start på nytt" msgstr "Start på nytt"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788 #: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
msgid "Power Off" msgid "Power Off"
msgstr "Slå av" msgstr "Slå av"
@ -424,27 +424,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:259 #: ../js/ui/appDisplay.js:258
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: ../js/ui/appDisplay.js:318 #: ../js/ui/appDisplay.js:666
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "INNSTILLINGER"
#: ../js/ui/appDisplay.js:679
msgid "New Window" msgid "New Window"
msgstr "Nytt vindu" msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:669 ../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:683 #: ../js/ui/appDisplay.js:670
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Legg til i favoritter" msgstr "Legg til i favoritter"
@ -461,19 +453,19 @@ msgstr "%s ble fjernet fra dine favoritter."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:61
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Hele dagen" msgstr "Hele dagen"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:67 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H.%M" msgstr "%H.%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:74 #: ../js/ui/calendar.js:73
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l.%M %p" msgstr "%l.%M %p"
@ -483,43 +475,43 @@ msgstr "%l.%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:104
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "S" msgstr "S"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:106
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:108
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "T" msgstr "T"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:110
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "O" msgstr "O"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:122 #: ../js/ui/calendar.js:112
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "T" msgstr "T"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:124 #: ../js/ui/calendar.js:114
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "F" msgstr "F"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:126 #: ../js/ui/calendar.js:116
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "L" msgstr "L"
@ -530,77 +522,77 @@ msgstr "L"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:129
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Sø" msgstr "Sø"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:131
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "Ma" msgstr "Ma"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:133
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "Ti" msgstr "Ti"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:135
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "On" msgstr "On"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:147 #: ../js/ui/calendar.js:137
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "To" msgstr "To"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:149 #: ../js/ui/calendar.js:139
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "Fr" msgstr "Fr"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:151 #: ../js/ui/calendar.js:141
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "Lø" msgstr "Lø"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:700 #: ../js/ui/calendar.js:674
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ingenting planlagt" msgstr "Ingenting planlagt"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:716 #: ../js/ui/calendar.js:690
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A %B %d" msgstr "%A %B %d"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:719 #: ../js/ui/calendar.js:693
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %B %d, %Y" msgstr "%A %B %d, %Y"
#: ../js/ui/calendar.js:729 #: ../js/ui/calendar.js:703
msgid "Today" msgid "Today"
msgstr "I dag" msgstr "I dag"
#: ../js/ui/calendar.js:733 #: ../js/ui/calendar.js:707
msgid "Tomorrow" msgid "Tomorrow"
msgstr "I morgen" msgstr "I morgen"
#: ../js/ui/calendar.js:744 #: ../js/ui/calendar.js:718
msgid "This week" msgid "This week"
msgstr "Denne uken" msgstr "Denne uken"
#: ../js/ui/calendar.js:752 #: ../js/ui/calendar.js:726
msgid "Next week" msgid "Next week"
msgstr "Neste uke" msgstr "Neste uke"
@ -617,11 +609,11 @@ msgstr "Åpne med %s"
msgid "Eject" msgid "Eject"
msgstr "Løs ut" msgstr "Løs ut"
#: ../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 "Passord:" msgstr "Passord:"
#: ../js/ui/components/keyring.js:105 #: ../js/ui/components/keyring.js:101
msgid "Type again:" msgid "Type again:"
msgstr "Skriv på nytt:" msgstr "Skriv på nytt:"
@ -709,7 +701,7 @@ msgstr "Autentisering kreves"
msgid "Administrator" msgid "Administrator"
msgstr "Administrator" msgstr "Administrator"
#: ../js/ui/components/polkitAgent.js:166 #: ../js/ui/components/polkitAgent.js:165
msgid "Authenticate" msgid "Authenticate"
msgstr "Autentiser" msgstr "Autentiser"
@ -717,7 +709,7 @@ msgstr "Autentiser"
#. * 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 "Beklager, det virket ikke. Vennligst prøv igjen." msgstr "Beklager, det virket ikke. Vennligst prøv igjen."
@ -962,11 +954,11 @@ msgstr "Kan ikke koble til %s"
msgid "View account" msgid "View account"
msgstr "Vis konto" msgstr "Vis konto"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1383
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Ukjent årsak" msgstr "Ukjent årsak"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
msgid "Windows" msgid "Windows"
msgstr "Vinduer" msgstr "Vinduer"
@ -974,18 +966,18 @@ msgstr "Vinduer"
msgid "Show Applications" msgid "Show Applications"
msgstr "Vis programmer" msgstr "Vis programmer"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:87
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett" msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:111 #: ../js/ui/dateMenu.js:112
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Åpne kalender" msgstr "Åpne kalender"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:201 #: ../js/ui/dateMenu.js:191
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@ -1090,78 +1082,80 @@ 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:308 #: ../js/ui/keyboard.js:291
msgid "tray" msgid "tray"
msgstr "varslingsområde" msgstr "varslingsområde"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195 #: ../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 "Ingen utvidelser installert" msgstr "Ingen utvidelser installert"
#. 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 har ikke avgitt noen feil." msgstr "%s har ikke avgitt noen feil."
#: ../js/ui/lookingGlass.js:751 #: ../js/ui/lookingGlass.js:752
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Skjul feil" msgstr "Skjul feil"
#: ../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 "Vis feil" msgstr "Vis feil"
#: ../js/ui/lookingGlass.js:764 #: ../js/ui/lookingGlass.js:765
msgid "Enabled" msgid "Enabled"
msgstr "Aktivert" msgstr "Aktivert"
#: ../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 "Deaktivert" msgstr "Deaktivert"
#: ../js/ui/lookingGlass.js:769 #: ../js/ui/lookingGlass.js:770
msgid "Error" msgid "Error"
msgstr "Feil" msgstr "Feil"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:772
msgid "Out of date" msgid "Out of date"
msgstr "Utdatert" msgstr "Utdatert"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:774
msgid "Downloading" msgid "Downloading"
msgstr "Laster ned" msgstr "Laster ned"
#: ../js/ui/lookingGlass.js:797 #: ../js/ui/lookingGlass.js:798
msgid "View Source" msgid "View Source"
msgstr "Vis kildekode" msgstr "Vis kildekode"
#: ../js/ui/lookingGlass.js:806 #: ../js/ui/lookingGlass.js:807
msgid "Web Page" msgid "Web Page"
msgstr "Nettside" msgstr "Nettside"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1090
msgid "Open" msgid "Open"
msgstr "Åpne" msgstr "Åpne"
#: ../js/ui/messageTray.js:1095 #: ../js/ui/messageTray.js:1097
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
#: ../js/ui/messageTray.js:1551 #: ../js/ui/messageTray.js:1554
msgid "No Messages" msgid "No Messages"
msgstr "Ingen meldinger" msgstr "Ingen meldinger"
#: ../js/ui/messageTray.js:1568 #: ../js/ui/messageTray.js:1572
msgid "Message Tray" msgid "Message Tray"
msgstr "Meldingstrau" msgstr "Meldingstrau"
#: ../js/ui/messageTray.js:2635 #: ../js/ui/messageTray.js:2641
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
@ -1170,11 +1164,11 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#: ../js/ui/overview.js:95 #: ../js/ui/overview.js:92
msgid "Undo" msgid "Undo"
msgstr "Angre" msgstr "Angre"
#: ../js/ui/overview.js:144 #: ../js/ui/overview.js:139
msgid "Overview" msgid "Overview"
msgstr "Oversikt" msgstr "Oversikt"
@ -1182,27 +1176,27 @@ msgstr "Oversikt"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:221 #: ../js/ui/overview.js:218
msgid "Type to search..." msgid "Type to search..."
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:242 #: ../js/ui/overview.js:236
msgid "Dash" msgid "Dash"
msgstr "Favoritter" msgstr "Favoritter"
#: ../js/ui/panel.js:608 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Avslutt" msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:637 #: ../js/ui/panel.js:642
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:980 #: ../js/ui/panel.js:976
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -1211,7 +1205,7 @@ msgstr "Topp-panel"
#. "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:732 #: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1225,33 +1219,33 @@ msgstr "Lukk"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:112 #: ../js/ui/screenShield.js:113
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#: ../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 ny melding" msgstr[0] "%d ny melding"
msgstr[1] "%d nye meldinger" msgstr[1] "%d nye meldinger"
#: ../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 ny varsling" msgstr[0] "%d ny varsling"
msgstr[1] "%d nye varslinger" msgstr[1] "%d nye varslinger"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
msgid "Lock" msgid "Lock"
msgstr "Lås" msgstr "Lås"
#: ../js/ui/searchDisplay.js:277 #: ../js/ui/searchDisplay.js:403
msgid "Searching..." msgid "Searching..."
msgstr "Søker …" msgstr "Søker …"
#: ../js/ui/searchDisplay.js:325 #: ../js/ui/searchDisplay.js:451
msgid "No results." msgid "No results."
msgstr "Ingen resultater." msgstr "Ingen resultater."
@ -1367,7 +1361,7 @@ 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:442
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1464
msgid "connecting..." msgid "connecting..."
msgstr "kobler til …" msgstr "kobler til …"
@ -1383,7 +1377,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:270 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Innstillinger for lyd" msgstr "Innstillinger for lyd"
@ -1447,15 +1441,15 @@ msgstr "Vennligst oppgi PIN som oppgitt på enheten."
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
#: ../js/ui/status/keyboard.js:228 #: ../js/ui/status/keyboard.js:363
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Vis tastaturutforming" msgstr "Vis tastaturutforming"
#: ../js/ui/status/keyboard.js:233 #: ../js/ui/status/keyboard.js:368
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "Innstillinger for region og språk" msgstr "Innstillinger for region og språk"
#: ../js/ui/status/lockScreenMenu.js:18 #: ../js/ui/status/lockScreenMenu.js:43
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Volum, nettverk, batteri" msgstr "Volum, nettverk, batteri"
@ -1475,7 +1469,7 @@ 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:1456 #: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
msgid "authentication required" msgid "authentication required"
msgstr "autentisering kreves" msgstr "autentisering kreves"
@ -1496,72 +1490,72 @@ msgstr "kabel koblet fra"
msgid "unavailable" msgid "unavailable"
msgstr "ikke tilgjengelig" msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
msgid "connection failed" msgid "connection failed"
msgstr "tilkobling feilet" msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392 #: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1534 #: ../js/ui/status/network.js:1545
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:1322 #: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Tilkoblet (privat)" msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:619 #: ../js/ui/status/network.js:641
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Automatisk Ethernet" msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:677 #: ../js/ui/status/network.js:688
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Automatisk bredbånd" msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:680 #: ../js/ui/status/network.js:691
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:809 ../js/ui/status/network.js:1339 #: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Automatisk %s" msgstr "Automatisk %s"
#: ../js/ui/status/network.js:811 #: ../js/ui/status/network.js:822
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth" msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1341 #: ../js/ui/status/network.js:1352
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Automatisk trådløst" msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1584 #: ../js/ui/status/network.js:1595
msgid "Enable networking" msgid "Enable networking"
msgstr "Slå på nettverk" msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1616 #: ../js/ui/status/network.js:1627
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1635 #: ../js/ui/status/network.js:1646
msgid "Network Settings" msgid "Network Settings"
msgstr "Innstillinger for nettverk" msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1679 #: ../js/ui/status/network.js:1692
msgid "Network Manager" msgid "Network Manager"
msgstr "Nettverkshåndtering" msgstr "Nettverkshåndtering"
#: ../js/ui/status/network.js:1761 #: ../js/ui/status/network.js:1774
msgid "Connection failed" msgid "Connection failed"
msgstr "Tilkobling feilet" msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1762 #: ../js/ui/status/network.js:1775
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:2079 #: ../js/ui/status/network.js:2092
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"
@ -1617,65 +1611,65 @@ 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 "Strømadapter" msgstr "Strømadapter"
#: ../js/ui/status/power.js:197 #: ../js/ui/status/power.js:198
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Batteri på bærbar" msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:199 #: ../js/ui/status/power.js:200
msgid "UPS" msgid "UPS"
msgstr "UPS" msgstr "UPS"
#: ../js/ui/status/power.js:201 #: ../js/ui/status/power.js:202
msgid "Monitor" msgid "Monitor"
msgstr "Skjerm" msgstr "Skjerm"
#: ../js/ui/status/power.js:203 #: ../js/ui/status/power.js:204
msgid "Mouse" msgid "Mouse"
msgstr "Mus" msgstr "Mus"
#: ../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 "Medieavspiller" msgstr "Medieavspiller"
#: ../js/ui/status/power.js:213 #: ../js/ui/status/power.js:214
msgid "Tablet" msgid "Tablet"
msgstr "Nettbrett" msgstr "Nettbrett"
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:216
msgid "Computer" msgid "Computer"
msgstr "Datamaskin" msgstr "Datamaskin"
#: ../js/ui/status/power.js:217 #: ../js/ui/status/power.js:218
msgctxt "device" msgctxt "device"
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
#. 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:247 ../js/ui/status/volume.js:295
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
#: ../js/ui/status/volume.js:62 #: ../js/ui/status/volume.js:256
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 "Logg inn som en annen bruker" msgstr "Logg inn som en annen bruker"
#: ../js/ui/unlockDialog.js:224 #: ../js/ui/unlockDialog.js:229
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Lås opp vindu" msgstr "Lås opp vindu"
@ -1703,31 +1697,31 @@ msgstr "Ledig"
msgid "Offline" msgid "Offline"
msgstr "Frakoblet" msgstr "Frakoblet"
#: ../js/ui/userMenu.js:754 #: ../js/ui/userMenu.js:755
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/userMenu.js:762 #: ../js/ui/userMenu.js:763
msgid "Settings" msgid "Settings"
msgstr "Innstillinger" msgstr "Innstillinger"
#: ../js/ui/userMenu.js:770 #: ../js/ui/userMenu.js:771
msgid "Switch User" msgid "Switch User"
msgstr "Bytt bruker" msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:776
msgid "Log Out" msgid "Log Out"
msgstr "Logg ut" msgstr "Logg ut"
#: ../js/ui/userMenu.js:795 #: ../js/ui/userMenu.js:796
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:813 #: ../js/ui/userMenu.js:814
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:814 #: ../js/ui/userMenu.js:815
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."
@ -1736,15 +1730,15 @@ msgstr ""
"tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser " "tilkoblingsstatus er justert for å la andre vite at du kanskje ikke ser "
"deres meldinger." "deres meldinger."
#: ../js/ui/viewSelector.js:91 #: ../js/ui/viewSelector.js:85
msgid "Applications" msgid "Applications"
msgstr "Programmer" msgstr "Programmer"
#: ../js/ui/viewSelector.js:95 #: ../js/ui/viewSelector.js:89
msgid "Search" msgid "Search"
msgstr "Søk" msgstr "Søk"
#: ../js/ui/wanda.js:94 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1753,15 +1747,11 @@ msgstr ""
"Beklager, ingen visdom til deg i dag:\n" "Beklager, ingen visdom til deg i dag:\n"
"%s" "%s"
#: ../js/ui/wanda.js:98 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Orakelet sier %s" msgstr "Orakelet sier %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Favorittpåskeegget ditt"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
@ -1771,6 +1761,28 @@ msgstr "«%s» er klar"
msgid "Evolution Calendar" msgid "Evolution Calendar"
msgstr "Evolution kalender" msgstr "Evolution kalender"
#. 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 utgang"
msgstr[1] "%u utganger"
#. 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 inngang"
msgstr[1] "%u innganger"
#: ../src/gvc/gvc-mixer-control.c:2371
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/main.c:332 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Skriv ut versjon" msgstr "Skriv ut versjon"

724
po/pl.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

344
po/sk.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-12-09 02:53+0000\n" "POT-Creation-Date: 2013-01-08 18:17+0000\n"
"PO-Revision-Date: 2012-11-19 22:23+0100\n" "PO-Revision-Date: 2013-01-01 17:50+0100\n"
"Last-Translator: Dušan Kazik <prescott66@gmail.com>\n" "Last-Translator: Dušan Kazik <prescott66@gmail.com>\n"
"Language-Team: Slovak <gnome-sk-list@gnome.org>\n" "Language-Team: Slovak <gnome-sk-list@gnome.org>\n"
"Language: sk\n" "Language: sk\n"
@ -40,7 +40,7 @@ msgstr "Zobrazí lištu správ"
#: ../data/50-gnome-shell-system.xml.in.h:3 #: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Focus the active notification" msgid "Focus the active notification"
msgstr "Zamerať na aktívne oznámenia" msgstr "Zamerať aktívne oznámenie"
# tooltip # tooltip
#: ../data/50-gnome-shell-system.xml.in.h:4 #: ../data/50-gnome-shell-system.xml.in.h:4
@ -166,20 +166,23 @@ msgstr ""
"s jedným používateľom alebo jednou reláciou." "s jedným používateľom alebo jednou reláciou."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
#, fuzzy
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Show full name in the user menu" msgid "Show full name in the user menu"
msgstr "Vždy zobraziť položku „Odhlásiť sa“ v ponuke používateľa" msgstr "Zobraziť celé meno v ponuke používateľa"
# description
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Whether the users full name is shown in the user menu or not." msgid "Whether the users full name is shown in the user menu or not."
msgstr "" msgstr "Určuje, či bude alebo nebude zobrazené celé meno v ponuke používateľa."
# summary
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../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 ""
"Určiť, či bude zapamätané heslo pre pripojenie zašifrovaných alebo "
"prenosných súborových systémov"
# description
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
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 "
@ -187,6 +190,10 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default " "'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"Shell bude po pripojení zašifrovaného alebo prenosného súborového systému "
"požadovať heslo. Ak bude možné toto heslo uložiť pre neskoršie použitie, "
"zobrazí sa zaškrtávacie pole „Zapamätať heslo“. Tento kľúč nastaví "
"predvolený stav zaškrtávacieho poľa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
@ -309,11 +316,11 @@ msgstr ""
"základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného " "základe aktuálneho dátumu a použije túto príponu. Pri nahrávaní do iného "
"formátu kontajneru by mala byť zmenená." "formátu kontajneru by mala byť zmenená."
# PM: tento preklad podľa mňa nezodpovedá nasledujúcemu dlhému popisu nastavenia. Ide skor o režim tvorby ikon (z) aplikácií
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40 #: ../data/org.gnome.shell.gschema.xml.in.in.h:40
#, fuzzy #, fuzzy
#| msgid "Open the application menu"
msgid "The application icon mode." msgid "The application icon mode."
msgstr "Otvorí ponuku aplikácií" msgstr "Režim aplikácií s ikonami."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41 #: ../data/org.gnome.shell.gschema.xml.in.in.h:41
msgid "" msgid ""
@ -321,6 +328,9 @@ msgid ""
"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 ""
"Konfiguruje, ako sa majú zobraziť okná v prepínači. Platné možnosti sú "
"„thumbnail-only“ (zobrazí miniatúru okna), „app-icon-only“ (zobrazí iba "
"ikonu aplikácie) alebo „both“ (zobrazí oboje)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42 #: ../data/org.gnome.shell.gschema.xml.in.in.h:42
msgid "Attach modal dialog to the parent window" msgid "Attach modal dialog to the parent window"
@ -368,11 +378,11 @@ msgstr "Rozšírenie"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Použitím ponuky vyberte rozšírenie na nastavenie" msgstr "Použitím ponuky vyberte rozšírenie na nastavenie"
#: ../js/gdm/loginDialog.js:565 #: ../js/gdm/loginDialog.js:566
msgid "Session..." msgid "Session..."
msgstr "Relácia…" msgstr "Relácia…"
#: ../js/gdm/loginDialog.js:722 #: ../js/gdm/loginDialog.js:723
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prihlásenie" msgstr "Prihlásenie"
@ -381,35 +391,35 @@ msgstr "Prihlásenie"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:786 #: ../js/gdm/loginDialog.js:787
msgid "Not listed?" msgid "Not listed?"
msgstr "Nie ste v zozname?" msgstr "Nie ste v zozname?"
#: ../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 "Zrušiť" msgstr "Zrušiť"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prihlásiť sa" msgstr "Prihlásiť sa"
#: ../js/gdm/loginDialog.js:978 #: ../js/gdm/loginDialog.js:979
msgid "Next" msgid "Next"
msgstr "Ďalej" msgstr "Ďalej"
#. 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 "Používateľské meno: " msgstr "Používateľské meno: "
#: ../js/gdm/loginDialog.js:1382 #: ../js/gdm/loginDialog.js:1383
msgid "Login Window" msgid "Login Window"
msgstr "Prihlasovacie okno" msgstr "Prihlasovacie okno"
@ -418,8 +428,8 @@ msgstr "Prihlasovacie okno"
msgid "Power" msgid "Power"
msgstr "Napájanie" msgstr "Napájanie"
#: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:674 ../js/ui/userMenu.js:678 #: ../js/gdm/powerMenu.js:93 ../js/ui/userMenu.js:675 ../js/ui/userMenu.js:679
#: ../js/ui/userMenu.js:789 #: ../js/ui/userMenu.js:790
msgid "Suspend" msgid "Suspend"
msgstr "Uspať" msgstr "Uspať"
@ -427,8 +437,8 @@ msgstr "Uspať"
msgid "Restart" msgid "Restart"
msgstr "Reštartovať" msgstr "Reštartovať"
#: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:676 #: ../js/gdm/powerMenu.js:103 ../js/ui/userMenu.js:677
#: ../js/ui/userMenu.js:678 ../js/ui/userMenu.js:788 #: ../js/ui/userMenu.js:679 ../js/ui/userMenu.js:789
msgid "Power Off" msgid "Power Off"
msgstr "Vypnúť" msgstr "Vypnúť"
@ -463,27 +473,19 @@ msgid "Execution of '%s' failed:"
msgstr "Spustenie „%s“ zlyhalo:" msgstr "Spustenie „%s“ zlyhalo:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:259 #: ../js/ui/appDisplay.js:258
msgid "All" msgid "All"
msgstr "Všetky" msgstr "Všetky"
#: ../js/ui/appDisplay.js:318 #: ../js/ui/appDisplay.js:666
msgid "APPLICATIONS"
msgstr "APLIKÁCIE"
#: ../js/ui/appDisplay.js:375
msgid "SETTINGS"
msgstr "NASTAVENIA"
#: ../js/ui/appDisplay.js:679
msgid "New Window" msgid "New Window"
msgstr "Nové okno" msgstr "Nové okno"
#: ../js/ui/appDisplay.js:682 ../js/ui/dash.js:289 #: ../js/ui/appDisplay.js:669 ../js/ui/dash.js:289
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstrániť z obľúbených" msgstr "Odstrániť z obľúbených"
#: ../js/ui/appDisplay.js:683 #: ../js/ui/appDisplay.js:670
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Pridať do obľúbených" msgstr "Pridať do obľúbených"
@ -500,19 +502,19 @@ msgstr "Program %s bol odstránený z obľúbených."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:61
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Celý deň" msgstr "Celý deň"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:67 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H:%M" msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:74 #: ../js/ui/calendar.js:73
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l:%M %p" msgstr "%l:%M %p"
@ -522,43 +524,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:104
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "Ne" msgstr "Ne"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:106
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "Po" msgstr "Po"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:108
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "Ut" msgstr "Ut"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:110
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "St" msgstr "St"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:122 #: ../js/ui/calendar.js:112
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "Št" msgstr "Št"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:124 #: ../js/ui/calendar.js:114
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "Pi" msgstr "Pi"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:126 #: ../js/ui/calendar.js:116
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "So" msgstr "So"
@ -569,77 +571,77 @@ msgstr "So"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:129
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Ne" msgstr "Ne"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:131
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "Po" msgstr "Po"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:133
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "Ut" msgstr "Ut"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:135
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "St" msgstr "St"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:147 #: ../js/ui/calendar.js:137
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "Št" msgstr "Št"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:149 #: ../js/ui/calendar.js:139
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "Pi" msgstr "Pi"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:151 #: ../js/ui/calendar.js:141
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "So" msgstr "So"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:700 #: ../js/ui/calendar.js:674
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Žiadne naplánované udalosti" msgstr "Žiadne naplánované udalosti"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:716 #: ../js/ui/calendar.js:690
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:719 #: ../js/ui/calendar.js:693
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %e. %B %Y" msgstr "%A, %e. %B %Y"
#: ../js/ui/calendar.js:729 #: ../js/ui/calendar.js:703
msgid "Today" msgid "Today"
msgstr "Dnes" msgstr "Dnes"
#: ../js/ui/calendar.js:733 #: ../js/ui/calendar.js:707
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Zajtra" msgstr "Zajtra"
#: ../js/ui/calendar.js:744 #: ../js/ui/calendar.js:718
msgid "This week" msgid "This week"
msgstr "Tento týždeň" msgstr "Tento týždeň"
#: ../js/ui/calendar.js:752 #: ../js/ui/calendar.js:726
msgid "Next week" msgid "Next week"
msgstr "Ďalší týždeň" msgstr "Ďalší týždeň"
@ -657,11 +659,11 @@ msgstr "Otvoriť pomocou programu %s"
msgid "Eject" msgid "Eject"
msgstr "Vysunúť" msgstr "Vysunúť"
#: ../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 "Heslo:" msgstr "Heslo:"
#: ../js/ui/components/keyring.js:105 #: ../js/ui/components/keyring.js:101
msgid "Type again:" msgid "Type again:"
msgstr "Zadajte znovu:" msgstr "Zadajte znovu:"
@ -750,7 +752,7 @@ msgstr "Požaduje sa overenie totožnosti"
msgid "Administrator" msgid "Administrator"
msgstr "Správca" msgstr "Správca"
#: ../js/ui/components/polkitAgent.js:166 #: ../js/ui/components/polkitAgent.js:165
msgid "Authenticate" msgid "Authenticate"
msgstr "Overiť totožnosť" msgstr "Overiť totožnosť"
@ -758,7 +760,7 @@ msgstr "Overiť totožnosť"
#. * 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 "Prepáčte, ale nezabralo to. Skúste to, prosím, znova." msgstr "Prepáčte, ale nezabralo to. Skúste to, prosím, znova."
@ -787,7 +789,7 @@ msgstr "Prenos súborov"
#: ../js/ui/components/telepathyClient.js:417 #: ../js/ui/components/telepathyClient.js:417
msgid "Chat" msgid "Chat"
msgstr "" msgstr "Rozhovor"
#: ../js/ui/components/telepathyClient.js:477 #: ../js/ui/components/telepathyClient.js:477
msgid "Unmute" msgid "Unmute"
@ -801,28 +803,25 @@ msgstr "Stlmiť"
#: ../js/ui/components/telepathyClient.js:931 #: ../js/ui/components/telepathyClient.js:931
#, no-c-format #, no-c-format
msgid "<b>Yesterday</b>, <b>%H:%M</b>" msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgstr "" msgstr "<b>Včera</b> o <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30 #. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:937 #: ../js/ui/components/telepathyClient.js:937
#, fuzzy, no-c-format #, no-c-format
#| msgid "<b>%H:%M</b> on <b>%A</b>"
msgid "<b>%A</b>, <b>%H:%M</b>" msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>" msgstr "v <b>%A</b> o <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>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>" msgstr "<b>%e.</b> <b>%B</b> o <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>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
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 "v <b>%A</b> o <b>%H:%M</b>, <b>%e.</b> <b>%B</b>" msgstr "<b>%e.</b> <b>%B</b> <b>%Y</b> o <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.
@ -1001,19 +1000,17 @@ msgstr "Vnútorná chyba"
#: ../js/ui/components/telepathyClient.js:1339 #: ../js/ui/components/telepathyClient.js:1339
#, c-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "" msgstr "Nepodarilo sa pripojiť účet %s"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1344
#, fuzzy
#| msgid "Edit account"
msgid "View account" msgid "View account"
msgstr "Upraviť účet" msgstr "Zobraziť účet"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1384
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznámy dôvod" msgstr "Neznámy dôvod"
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:87 #: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:81
msgid "Windows" msgid "Windows"
msgstr "Okná" msgstr "Okná"
@ -1022,18 +1019,18 @@ msgstr "Okná"
msgid "Show Applications" msgid "Show Applications"
msgstr "Zobrazí aplikácie" msgstr "Zobrazí aplikácie"
#: ../js/ui/dateMenu.js:86 #: ../js/ui/dateMenu.js:87
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Nastavenia dátumu a času" msgstr "Nastavenia dátumu a času"
#: ../js/ui/dateMenu.js:111 #: ../js/ui/dateMenu.js:112
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otvoriť kalendár" msgstr "Otvoriť kalendár"
#. 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:191
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %B %Y" msgstr "%A, %e. %B %Y"
@ -1142,85 +1139,81 @@ msgstr "Inštalovať"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Stiahnuť a nainštalovať „%s“ z extensions.gnome.org?" msgstr "Stiahnuť a nainštalovať „%s“ z extensions.gnome.org?"
#: ../js/ui/keyboard.js:308 #: ../js/ui/keyboard.js:291
msgid "tray" msgid "tray"
msgstr "lišta" msgstr "lišta"
#: ../js/ui/keyboard.js:555 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:636 ../js/ui/status/keyboard.js:309
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Klávesnica" msgstr "Klávesnica"
#: ../js/ui/lookingGlass.js:691 #: ../js/ui/lookingGlass.js:692
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Žiadne nainštalované rozšírenia" msgstr "Žiadne nainštalované rozšírenia"
#. 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 nevyslal žiadnu chybu." msgstr "%s nevyslal žiadnu chybu."
#: ../js/ui/lookingGlass.js:751 #: ../js/ui/lookingGlass.js:752
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Skryť chyby" msgstr "Skryť chyby"
#: ../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 "Zobraziť chyby" msgstr "Zobraziť chyby"
#: ../js/ui/lookingGlass.js:764 #: ../js/ui/lookingGlass.js:765
msgid "Enabled" msgid "Enabled"
msgstr "Povolené" msgstr "Povolené"
#: ../js/ui/lookingGlass.js:767 #: ../js/ui/lookingGlass.js:768
msgid "Disabled" msgid "Disabled"
msgstr "Zakázané" msgstr "Zakázané"
#: ../js/ui/lookingGlass.js:769 #: ../js/ui/lookingGlass.js:770
msgid "Error" msgid "Error"
msgstr "Chyba" msgstr "Chyba"
#: ../js/ui/lookingGlass.js:771 #: ../js/ui/lookingGlass.js:772
msgid "Out of date" msgid "Out of date"
msgstr "Neaktuálne" msgstr "Neaktuálne"
#: ../js/ui/lookingGlass.js:773 #: ../js/ui/lookingGlass.js:774
msgid "Downloading" msgid "Downloading"
msgstr "Sťahuje sa" msgstr "Sťahuje sa"
# PK: ide tu o zdrojovy kod? # PK: ide tu o zdrojovy kod?
#: ../js/ui/lookingGlass.js:797 #: ../js/ui/lookingGlass.js:798
msgid "View Source" msgid "View Source"
msgstr "Zobraziť zdroj" msgstr "Zobraziť zdroj"
#: ../js/ui/lookingGlass.js:806 #: ../js/ui/lookingGlass.js:807
msgid "Web Page" msgid "Web Page"
msgstr "Webová stránka" msgstr "Webová stránka"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1090
msgid "Open" msgid "Open"
msgstr "Otvoriť" msgstr "Otvoriť"
#: ../js/ui/messageTray.js:1095 #: ../js/ui/messageTray.js:1097
msgid "Remove" msgid "Remove"
msgstr "Odstrániť" msgstr "Odstrániť"
# DK: zvazoval som pouzit "Panel správ" #: ../js/ui/messageTray.js:1554
# neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1551
#, fuzzy
#| msgid "Message Tray"
msgid "No Messages" msgid "No Messages"
msgstr "Lišta správ" msgstr "Žiadne správy"
# DK: zvazoval som pouzit "Panel správ" # DK: zvazoval som pouzit "Panel správ"
# neviem co bude vhodnejsie ako preklad "tray" # neviem co bude vhodnejsie ako preklad "tray"
#: ../js/ui/messageTray.js:1568 #: ../js/ui/messageTray.js:1572
msgid "Message Tray" msgid "Message Tray"
msgstr "Lišta správ" msgstr "Lišta správ"
#: ../js/ui/messageTray.js:2635 #: ../js/ui/messageTray.js:2641
msgid "System Information" msgid "System Information"
msgstr "Informácie o systéme" msgstr "Informácie o systéme"
@ -1229,11 +1222,11 @@ msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznámy" msgstr "Neznámy"
#: ../js/ui/overview.js:95 #: ../js/ui/overview.js:92
msgid "Undo" msgid "Undo"
msgstr "Vrátiť" msgstr "Vrátiť"
#: ../js/ui/overview.js:144 #: ../js/ui/overview.js:139
msgid "Overview" msgid "Overview"
msgstr "Prehľad" msgstr "Prehľad"
@ -1241,27 +1234,27 @@ msgstr "Prehľad"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/overview.js:221 #: ../js/ui/overview.js:218
msgid "Type to search..." msgid "Type to search..."
msgstr "Vyhľadávanie…" msgstr "Vyhľadávanie…"
#. Translators: this is the name of the dock/favorites area on #. Translators: this is the name of the dock/favorites area on
#. the left of the overview #. the left of the overview
#: ../js/ui/overview.js:242 #: ../js/ui/overview.js:236
msgid "Dash" msgid "Dash"
msgstr "Dok" msgstr "Dok"
#: ../js/ui/panel.js:608 #: ../js/ui/panel.js:613
msgid "Quit" msgid "Quit"
msgstr "Ukončiť" msgstr "Ukončiť"
#. 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 "Aktivity" msgstr "Aktivity"
#: ../js/ui/panel.js:980 #: ../js/ui/panel.js:976
msgid "Top Bar" msgid "Top Bar"
msgstr "Horná lišta" msgstr "Horná lišta"
@ -1270,7 +1263,7 @@ msgstr "Horná lišta"
#. "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:732 #: ../js/ui/popupMenu.js:727
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1287,11 +1280,11 @@ msgstr "Zavrieť"
# v ostatnych retazcoch je pouzite %e, tak to bude asi OK # v ostatnych retazcoch je pouzite %e, tak to bude asi OK
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:112 #: ../js/ui/screenShield.js:113
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %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"
@ -1299,7 +1292,7 @@ msgstr[0] "%d nových správ"
msgstr[1] "%d nová správa" msgstr[1] "%d nová správa"
msgstr[2] "%d nové správy" msgstr[2] "%d nové správy"
#: ../js/ui/screenShield.js: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"
@ -1307,15 +1300,15 @@ msgstr[0] "%d nových oznámení"
msgstr[1] "%d nové oznámenie" msgstr[1] "%d nové oznámenie"
msgstr[2] "%d nové oznámenia" msgstr[2] "%d nové oznámenia"
#: ../js/ui/screenShield.js:402 ../js/ui/userMenu.js:780 #: ../js/ui/screenShield.js:403 ../js/ui/userMenu.js:781
msgid "Lock" msgid "Lock"
msgstr "Uzamknúť" msgstr "Uzamknúť"
#: ../js/ui/searchDisplay.js:277 #: ../js/ui/searchDisplay.js:403
msgid "Searching..." msgid "Searching..."
msgstr "Hľadá sa…" msgstr "Hľadá sa…"
#: ../js/ui/searchDisplay.js:325 #: ../js/ui/searchDisplay.js:451
msgid "No results." msgid "No results."
msgstr "Žiadne výsledky." msgstr "Žiadne výsledky."
@ -1434,7 +1427,7 @@ msgid "disconnecting..."
msgstr "odpája sa…" msgstr "odpája sa…"
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442 #: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:442
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1464
msgid "connecting..." msgid "connecting..."
msgstr "pripája sa…" msgstr "pripája sa…"
@ -1450,7 +1443,7 @@ msgstr "Nastavenia klávesnice"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Nastavenia myši" msgstr "Nastavenia myši"
#: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:270 #: ../js/ui/status/bluetooth.js:253 ../js/ui/status/volume.js:314
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Nastavenia zvuku" msgstr "Nastavenia zvuku"
@ -1514,15 +1507,15 @@ msgstr "Zadajte PIN, ktoré je uvedené na zariadení."
msgid "OK" msgid "OK"
msgstr "Ok" msgstr "Ok"
#: ../js/ui/status/keyboard.js:228 #: ../js/ui/status/keyboard.js:363
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Zobraziť rozloženie klávesnice" msgstr "Zobraziť rozloženie klávesnice"
#: ../js/ui/status/keyboard.js:233 #: ../js/ui/status/keyboard.js:368
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "Miestne a jazykové nastavenia" msgstr "Miestne a jazykové nastavenia"
#: ../js/ui/status/lockScreenMenu.js:18 #: ../js/ui/status/lockScreenMenu.js:43
msgid "Volume, network, battery" msgid "Volume, network, battery"
msgstr "Hlasitosť, sieť, batéria" msgstr "Hlasitosť, sieť, batéria"
@ -1543,7 +1536,7 @@ msgid "unmanaged"
msgstr "nespravované" msgstr "nespravované"
#. 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:1456 #: ../js/ui/status/network.js:445 ../js/ui/status/network.js:1467
msgid "authentication required" msgid "authentication required"
msgstr "požaduje sa overenie totožnosti" msgstr "požaduje sa overenie totožnosti"
@ -1564,72 +1557,72 @@ msgstr "kábel odpojený"
msgid "unavailable" msgid "unavailable"
msgstr "nedostupné" msgstr "nedostupné"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1458 #: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1469
msgid "connection failed" msgid "connection failed"
msgstr "pripojenie zlyhalo" msgstr "pripojenie zlyhalo"
#: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1392 #: ../js/ui/status/network.js:525 ../js/ui/status/network.js:1403
#: ../js/ui/status/network.js:1534 #: ../js/ui/status/network.js:1545
msgid "More..." msgid "More..."
msgstr "Viac…" msgstr "Viac…"
#. 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:1322 #: ../js/ui/status/network.js:561 ../js/ui/status/network.js:1333
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Pripojené (súkromne)" msgstr "Pripojené (súkromne)"
#: ../js/ui/status/network.js:619 #: ../js/ui/status/network.js:641
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Automatický ethernet" msgstr "Automatický ethernet"
#: ../js/ui/status/network.js:677 #: ../js/ui/status/network.js:688
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Automatické širokopásmové pripojenie" msgstr "Automatické širokopásmové pripojenie"
#: ../js/ui/status/network.js:680 #: ../js/ui/status/network.js:691
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Automatické vytáčané pripojenie" msgstr "Automatické vytáčané pripojenie"
#. 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:809 ../js/ui/status/network.js:1339 #: ../js/ui/status/network.js:820 ../js/ui/status/network.js:1350
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Automatické pripojenie %s" msgstr "Automatické pripojenie %s"
#: ../js/ui/status/network.js:811 #: ../js/ui/status/network.js:822
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Automatický bluetooth" msgstr "Automatický bluetooth"
#: ../js/ui/status/network.js:1341 #: ../js/ui/status/network.js:1352
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Automatická bezdrôtová sieť" msgstr "Automatická bezdrôtová sieť"
#: ../js/ui/status/network.js:1584 #: ../js/ui/status/network.js:1595
msgid "Enable networking" msgid "Enable networking"
msgstr "Povoliť sieť" msgstr "Povoliť sieť"
#: ../js/ui/status/network.js:1616 #: ../js/ui/status/network.js:1627
msgid "Wi-Fi" msgid "Wi-Fi"
msgstr "Wi-Fi" msgstr "Wi-Fi"
#: ../js/ui/status/network.js:1635 #: ../js/ui/status/network.js:1646
msgid "Network Settings" msgid "Network Settings"
msgstr "Nastavenia siete" msgstr "Nastavenia siete"
#: ../js/ui/status/network.js:1679 #: ../js/ui/status/network.js:1692
msgid "Network Manager" msgid "Network Manager"
msgstr "Správca siete" msgstr "Správca siete"
#: ../js/ui/status/network.js:1761 #: ../js/ui/status/network.js:1774
msgid "Connection failed" msgid "Connection failed"
msgstr "Pripojenie zlyhalo" msgstr "Pripojenie zlyhalo"
#: ../js/ui/status/network.js:1762 #: ../js/ui/status/network.js:1775
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivácia pripojenia k sieti zlyhala" msgstr "Aktivácia pripojenia k sieti zlyhala"
#: ../js/ui/status/network.js:2079 #: ../js/ui/status/network.js:2092
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Sieť je zakázaná" msgstr "Sieť je zakázaná"
@ -1735,19 +1728,19 @@ msgid "Unknown"
msgstr "Neznáme" msgstr "Neznáme"
#. 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:247 ../js/ui/status/volume.js:295
msgid "Volume" msgid "Volume"
msgstr "Hlasitosť" msgstr "Hlasitosť"
#: ../js/ui/status/volume.js:62 #: ../js/ui/status/volume.js:256
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofón" msgstr "Mikrofón"
#: ../js/ui/unlockDialog.js:201 #: ../js/ui/unlockDialog.js:203
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Prihlásiť ako iný používateľ" msgstr "Prihlásiť ako iný používateľ"
#: ../js/ui/unlockDialog.js:224 #: ../js/ui/unlockDialog.js:229
msgid "Unlock Window" msgid "Unlock Window"
msgstr "Odomykacie okno" msgstr "Odomykacie okno"
@ -1775,31 +1768,31 @@ msgstr "Nečinný"
msgid "Offline" msgid "Offline"
msgstr "Odhlásený" msgstr "Odhlásený"
#: ../js/ui/userMenu.js:754 #: ../js/ui/userMenu.js:755
msgid "Notifications" msgid "Notifications"
msgstr "Upozornenia" msgstr "Upozornenia"
#: ../js/ui/userMenu.js:762 #: ../js/ui/userMenu.js:763
msgid "Settings" msgid "Settings"
msgstr "Nastavenia" msgstr "Nastavenia"
#: ../js/ui/userMenu.js:770 #: ../js/ui/userMenu.js:771
msgid "Switch User" msgid "Switch User"
msgstr "Prepnúť používateľa" msgstr "Prepnúť používateľa"
#: ../js/ui/userMenu.js:775 #: ../js/ui/userMenu.js:776
msgid "Log Out" msgid "Log Out"
msgstr "Odhlásiť sa" msgstr "Odhlásiť sa"
#: ../js/ui/userMenu.js:795 #: ../js/ui/userMenu.js:796
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Nainštalovať aktualizácie a reštartovať" msgstr "Nainštalovať aktualizácie a reštartovať"
#: ../js/ui/userMenu.js:813 #: ../js/ui/userMenu.js:814
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Váš stav bude nastavený na zaneprázdnený" msgstr "Váš stav bude nastavený na zaneprázdnený"
#: ../js/ui/userMenu.js:814 #: ../js/ui/userMenu.js:815
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."
@ -1807,15 +1800,15 @@ msgstr ""
"Oznámenia, vrátane správ rozhovoru, sú teraz zakázané. Váš stav online bol " "Oznámenia, vrátane správ rozhovoru, sú teraz zakázané. Váš stav online bol "
"nastavený tak, aby ostatní vedeli, že nemusíte vidieť ich správy." "nastavený tak, aby ostatní vedeli, že nemusíte vidieť ich správy."
#: ../js/ui/viewSelector.js:91 #: ../js/ui/viewSelector.js:85
msgid "Applications" msgid "Applications"
msgstr "Aplikácie" msgstr "Aplikácie"
#: ../js/ui/viewSelector.js:95 #: ../js/ui/viewSelector.js:89
msgid "Search" msgid "Search"
msgstr "Hľadať" msgstr "Hľadať"
#: ../js/ui/wanda.js:94 #: ../js/ui/wanda.js:92
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1824,15 +1817,11 @@ msgstr ""
"Prepáčte, dnes nie je pre vás pripravená žiadna múdrosť:\n" "Prepáčte, dnes nie je pre vás pripravená žiadna múdrosť:\n"
"%s" "%s"
#: ../js/ui/wanda.js:98 #: ../js/ui/wanda.js:96
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Veštec hovorí %s" msgstr "Veštec hovorí %s"
#: ../js/ui/wanda.js:139
msgid "Your favorite Easter Egg"
msgstr "Vaše obľúbené veľkonočné vajce"
# %s je totiž titulok okna # %s je totiž titulok okna
# informacna bublina # informacna bublina
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
@ -1887,6 +1876,30 @@ msgstr "Predvolený"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom" msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "APPLICATIONS"
#~ msgstr "APLIKÁCIE"
#~ msgid "SETTINGS"
#~ msgstr "NASTAVENIA"
#~ msgid "Your favorite Easter Egg"
#~ msgstr "Vaše obľúbené veľkonočné vajce"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u výstupov"
#~ msgstr[1] "%u výstup"
#~ msgstr[2] "%u výstupy"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u vstupov"
#~ msgstr[1] "%u vstup"
#~ msgstr[2] "%u vstupy"
#~ msgid "System Sounds"
#~ msgstr "Zvuky systému"
#~ msgid "Subscription request" #~ msgid "Subscription request"
#~ msgstr "Žiadosť o potvrdenie prístupu" #~ msgstr "Žiadosť o potvrdenie prístupu"
@ -1904,18 +1917,3 @@ msgstr "Dialógové okno overenia totožnosti bolo zatvorené používateľom"
#~ msgid "Reconnect" #~ msgid "Reconnect"
#~ msgstr "Znovu sa pripojiť" #~ msgstr "Znovu sa pripojiť"
#~ msgid "%u Output"
#~ msgid_plural "%u Outputs"
#~ msgstr[0] "%u výstupov"
#~ msgstr[1] "%u výstup"
#~ msgstr[2] "%u výstupy"
#~ msgid "%u Input"
#~ msgid_plural "%u Inputs"
#~ msgstr[0] "%u vstupov"
#~ msgstr[1] "%u vstup"
#~ msgstr[2] "%u vstupy"
#~ msgid "System Sounds"
#~ msgstr "Zvuky systému"

1081
po/sl.po

File diff suppressed because it is too large Load Diff

2119
po/ug.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -75,9 +75,8 @@ def start_shell():
if 'GI_TYPELIB_PATH' in os.environ: if 'GI_TYPELIB_PATH' in os.environ:
typelib_dir += ':%s' % (os.environ['GI_TYPELIB_PATH'],) typelib_dir += ':%s' % (os.environ['GI_TYPELIB_PATH'],)
env.update({'GNOME_SHELL_JS' : os.path.join(top_dir, "js"), env.update({'GI_TYPELIB_PATH' : typelib_dir,
'GNOME_SHELL_BINDIR' : self_dir, 'GNOME_SHELL_JS' : os.path.join(top_dir, "js"),
'GI_TYPELIB_PATH' : typelib_dir,
'GNOME_SHELL_DATADIR' : os.path.join(top_dir, "data"), 'GNOME_SHELL_DATADIR' : os.path.join(top_dir, "data"),
'GSETTINGS_SCHEMA_DIR' : os.path.join(top_dir, "data") }) 'GSETTINGS_SCHEMA_DIR' : os.path.join(top_dir, "data") })

View File

@ -284,12 +284,44 @@ gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin)
_shell_wm_kill_switch_workspace (get_shell_wm()); _shell_wm_kill_switch_workspace (get_shell_wm());
} }
static gboolean
ignore_crossing_event (MetaPlugin *plugin,
XIEnterEvent *enter_event)
{
MetaScreen *screen = meta_plugin_get_screen (plugin);
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen));
if (enter_event->event == clutter_x11_get_stage_window (stage))
{
/* If the pointer enters a child of the stage window (eg, a
* trayicon), we want to consider it to still be in the stage,
* so don't let Clutter see the event.
*/
if (enter_event->detail == XINotifyInferior)
return TRUE;
/* If the pointer is grabbed by a window it is not currently in,
* filter that out as well. In particular, if a trayicon grabs
* the pointer after a click on its label, we don't want to hide
* the message tray. Filtering out this event will leave Clutter
* out of sync, but that happens fairly often with grabs, and we
* can work around it. (Eg, shell_global_sync_pointer().)
*/
if (enter_event->mode == XINotifyGrab &&
(enter_event->detail == XINotifyNonlinear ||
enter_event->detail == XINotifyNonlinearVirtual))
return TRUE;
}
return FALSE;
}
static gboolean static gboolean
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin, gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
XEvent *xev) XEvent *xev)
{ {
MetaScreen *screen = meta_plugin_get_screen (plugin); MetaScreen *screen = meta_plugin_get_screen (plugin);
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_screen (screen)); MetaDisplay *display = meta_screen_get_display (screen);
GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin); GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
#ifdef GLX_INTEL_swap_event #ifdef GLX_INTEL_swap_event
@ -309,26 +341,15 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
} }
#endif #endif
if ((xev->xany.type == EnterNotify || xev->xany.type == LeaveNotify) /* Make sure that Clutter doesn't see certain focus change events,
&& xev->xcrossing.window == clutter_x11_get_stage_window (stage)) * so that when we're moving into something like a tray icon, we
* don't unfocus the container. */
if (xev->type == GenericEvent &&
xev->xcookie.extension == meta_display_get_xinput_opcode (display))
{ {
/* If the pointer enters a child of the stage window (eg, a XIEvent *input_event = (XIEvent *) xev->xcookie.data;
* trayicon), we want to consider it to still be in the stage, if ((input_event->evtype == XI_Enter || input_event->evtype == XI_Leave) &&
* so don't let Clutter see the event. ignore_crossing_event (plugin, (XIEnterEvent *) input_event))
*/
if (xev->xcrossing.detail == NotifyInferior)
return TRUE;
/* If the pointer is grabbed by a window it is not currently in,
* filter that out as well. In particular, if a trayicon grabs
* the pointer after a click on its label, we don't want to hide
* the message tray. Filtering out this event will leave Clutter
* out of sync, but that happens fairly often with grabs, and we
* can work around it. (Eg, shell_global_sync_pointer().)
*/
if (xev->xcrossing.mode == NotifyGrab &&
(xev->xcrossing.detail == NotifyNonlinear ||
xev->xcrossing.detail == NotifyNonlinearVirtual))
return TRUE; return TRUE;
} }

View File

@ -616,6 +616,9 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_POINTING_HAND: case SHELL_CURSOR_POINTING_HAND:
name = "hand"; name = "hand";
break; break;
case SHELL_CURSOR_CROSSHAIR:
name = "crosshair";
break;
default: default:
g_return_if_reached (); g_return_if_reached ();
} }
@ -638,6 +641,9 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_POINTING_HAND: case SHELL_CURSOR_POINTING_HAND:
cursor_type = GDK_HAND2; cursor_type = GDK_HAND2;
break; break;
case SHELL_CURSOR_CROSSHAIR:
cursor_type = GDK_CROSSHAIR;
break;
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET: case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
cursor_type = GDK_X_CURSOR; cursor_type = GDK_X_CURSOR;
break; break;
@ -1404,7 +1410,6 @@ guint32
shell_global_get_current_time (ShellGlobal *global) shell_global_get_current_time (ShellGlobal *global)
{ {
guint32 time; guint32 time;
const ClutterEvent *clutter_event;
/* In case we have a xdnd timestamp use it */ /* In case we have a xdnd timestamp use it */
if (global->xdnd_timestamp != 0) if (global->xdnd_timestamp != 0)
@ -1415,7 +1420,7 @@ shell_global_get_current_time (ShellGlobal *global)
from some Clutter event callbacks. from some Clutter event callbacks.
clutter_get_current_event_time() will return the correct time clutter_get_current_event_time() will return the correct time
from a Clutter event callback, but may return an out-of-date from a Clutter event callback, but may return CLUTTER_CURRENT_TIME
timestamp if called at other times. timestamp if called at other times.
So we try meta_display_get_current_time() first, since we So we try meta_display_get_current_time() first, since we
@ -1426,16 +1431,8 @@ shell_global_get_current_time (ShellGlobal *global)
time = meta_display_get_current_time (global->meta_display); time = meta_display_get_current_time (global->meta_display);
if (time != CLUTTER_CURRENT_TIME) if (time != CLUTTER_CURRENT_TIME)
return time; return time;
/*
* We don't use clutter_get_current_event_time as it can give us a
* too old timestamp if there is no current event.
*/
clutter_event = clutter_get_current_event ();
if (clutter_event != NULL) return clutter_get_current_event_time ();
return clutter_event_get_time (clutter_event);
else
return CLUTTER_CURRENT_TIME;
} }
/** /**

View File

@ -63,7 +63,8 @@ typedef enum {
SHELL_CURSOR_DND_UNSUPPORTED_TARGET, SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
SHELL_CURSOR_DND_MOVE, SHELL_CURSOR_DND_MOVE,
SHELL_CURSOR_DND_COPY, SHELL_CURSOR_DND_COPY,
SHELL_CURSOR_POINTING_HAND SHELL_CURSOR_POINTING_HAND,
SHELL_CURSOR_CROSSHAIR
} ShellCursor; } ShellCursor;
void shell_global_set_cursor (ShellGlobal *global, void shell_global_set_cursor (ShellGlobal *global,

View File

@ -32,6 +32,7 @@ typedef struct _screenshot_data {
ShellScreenshot *screenshot; ShellScreenshot *screenshot;
char *filename; char *filename;
char *filename_used;
cairo_surface_t *image; cairo_surface_t *image;
cairo_rectangle_int_t screenshot_area; cairo_rectangle_int_t screenshot_area;
@ -64,25 +65,140 @@ on_screenshot_written (GObject *source,
if (screenshot_data->callback) if (screenshot_data->callback)
screenshot_data->callback (screenshot_data->screenshot, screenshot_data->callback (screenshot_data->screenshot,
g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)), g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)),
&screenshot_data->screenshot_area); &screenshot_data->screenshot_area,
screenshot_data->filename_used);
cairo_surface_destroy (screenshot_data->image); cairo_surface_destroy (screenshot_data->image);
g_object_unref (screenshot_data->screenshot); g_object_unref (screenshot_data->screenshot);
g_free (screenshot_data->filename); g_free (screenshot_data->filename);
g_free (screenshot_data->filename_used);
g_free (screenshot_data); g_free (screenshot_data);
} }
/* called in an I/O thread */
static GOutputStream *
get_stream_for_unique_path (const gchar *path,
const gchar *filename,
gchar **filename_used)
{
GOutputStream *stream;
GFile *file;
gchar *real_path, *real_filename, *name, *ptr;
gint idx;
ptr = g_strrstr (filename, ".png");
if (ptr != NULL)
real_filename = g_strndup (filename, ptr - filename);
else
real_filename = g_strdup (filename);
idx = 0;
real_path = NULL;
do
{
if (idx == 0)
name = g_strdup_printf ("%s.png", real_filename);
else
name = g_strdup_printf ("%s - %d.png", real_filename, idx);
real_path = g_build_filename (path, name, NULL);
g_free (name);
file = g_file_new_for_path (real_path);
stream = G_OUTPUT_STREAM (g_file_create (file, G_FILE_CREATE_NONE, NULL, NULL));
g_object_unref (file);
if (stream != NULL)
*filename_used = real_path;
else
g_free (real_path);
idx++;
}
while (stream == NULL);
g_free (real_filename);
return stream;
}
/* called in an I/O thread */
static GOutputStream *
get_stream_for_filename (const gchar *filename,
gchar **filename_used)
{
const gchar *path;
path = g_get_user_special_dir (G_USER_DIRECTORY_PICTURES);
if (!g_file_test (path, G_FILE_TEST_EXISTS))
{
path = g_get_home_dir ();
if (!g_file_test (path, G_FILE_TEST_EXISTS))
return NULL;
}
return get_stream_for_unique_path (path, filename, filename_used);
}
static GOutputStream *
prepare_write_stream (const gchar *filename,
gchar **filename_used)
{
GOutputStream *stream;
GFile *file;
if (g_path_is_absolute (filename))
{
file = g_file_new_for_path (filename);
*filename_used = g_strdup (filename);
stream = G_OUTPUT_STREAM (g_file_replace (file, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL));
g_object_unref (file);
}
else
{
stream = get_stream_for_filename (filename, filename_used);
}
return stream;
}
static cairo_status_t
do_write_to_stream (void *closure,
const guchar *data,
guint length)
{
GOutputStream *stream = closure;
gboolean res;
res = g_output_stream_write_all (stream, data, length, NULL, NULL, NULL);
return res ? CAIRO_STATUS_SUCCESS : CAIRO_STATUS_WRITE_ERROR;
}
static void static void
write_screenshot_thread (GSimpleAsyncResult *result, write_screenshot_thread (GSimpleAsyncResult *result,
GObject *object, GObject *object,
GCancellable *cancellable) GCancellable *cancellable)
{ {
cairo_status_t status; cairo_status_t status;
GOutputStream *stream;
_screenshot_data *screenshot_data = g_async_result_get_user_data (G_ASYNC_RESULT (result)); _screenshot_data *screenshot_data = g_async_result_get_user_data (G_ASYNC_RESULT (result));
g_assert (screenshot_data != NULL); g_assert (screenshot_data != NULL);
status = cairo_surface_write_to_png (screenshot_data->image, screenshot_data->filename); stream = prepare_write_stream (screenshot_data->filename,
&screenshot_data->filename_used);
if (stream == NULL)
status = CAIRO_STATUS_FILE_NOT_FOUND;
else
status = cairo_surface_write_to_png_stream (screenshot_data->image, do_write_to_stream, stream);
g_simple_async_result_set_op_res_gboolean (result, status == CAIRO_STATUS_SUCCESS); g_simple_async_result_set_op_res_gboolean (result, status == CAIRO_STATUS_SUCCESS);
g_clear_object (&stream);
} }
static void static void

View File

@ -27,7 +27,8 @@ ShellScreenshot *shell_screenshot_new (void);
typedef void (*ShellScreenshotCallback) (ShellScreenshot *screenshot, typedef void (*ShellScreenshotCallback) (ShellScreenshot *screenshot,
gboolean success, gboolean success,
cairo_rectangle_int_t *screenshot_area); cairo_rectangle_int_t *screenshot_area,
const gchar *filename_used);
void shell_screenshot_screenshot_area (ShellScreenshot *screenshot, void shell_screenshot_screenshot_area (ShellScreenshot *screenshot,
int x, int x,

View File

@ -32,6 +32,7 @@
#include <glib-object.h> #include <glib-object.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <math.h>
#include "st-adjustment.h" #include "st-adjustment.h"
#include "st-private.h" #include "st-private.h"
@ -566,3 +567,31 @@ st_adjustment_get_values (StAdjustment *adjustment,
*page_size = priv->page_size; *page_size = priv->page_size;
} }
/**
* st_adjustment_adjust_for_scroll_event:
* @adjustment: An #StAdjustment
* @delta: A delta, retrieved directly from clutter_event_get_scroll_delta()
* or similar.
*
* Adjusts the adjustment using delta values from a scroll event.
* You should use this instead of using st_adjustment_set_value()
* as this method will tweak the values directly using the same
* math as GTK+, to ensure that scrolling is consistent across
* the environment.
*/
void
st_adjustment_adjust_for_scroll_event (StAdjustment *adjustment,
gdouble delta)
{
StAdjustmentPrivate *priv;
gdouble new_value, scroll_unit;
g_return_if_fail (ST_IS_ADJUSTMENT (adjustment));
priv = adjustment->priv;
scroll_unit = pow (priv->page_size, 2.0 / 3.0);
new_value = priv->value + delta * scroll_unit;
st_adjustment_set_value (adjustment, new_value);
}

View File

@ -99,6 +99,10 @@ void st_adjustment_get_values (StAdjustment *adjustment,
gdouble *step_increment, gdouble *step_increment,
gdouble *page_increment, gdouble *page_increment,
gdouble *page_size); gdouble *page_size);
void st_adjustment_adjust_for_scroll_event (StAdjustment *adjustment,
gdouble delta);
G_END_DECLS G_END_DECLS
#endif /* __ST_ADJUSTMENT_H__ */ #endif /* __ST_ADJUSTMENT_H__ */

View File

@ -152,7 +152,7 @@ st_drawing_area_paint (ClutterActor *self)
cogl_set_source (priv->material); cogl_set_source (priv->material);
cogl_rectangle_with_texture_coords (content_box.x1, content_box.y1, cogl_rectangle_with_texture_coords (content_box.x1, content_box.y1,
width, height, content_box.x2, content_box.y2,
0.0f, 0.0f, 1.0f, 1.0f); 0.0f, 0.0f, 1.0f, 1.0f);
} }
} }

View File

@ -433,42 +433,57 @@ st_scroll_bar_constructor (GType type,
return obj; return obj;
} }
static void
adjust_with_direction (StAdjustment *adj,
ClutterScrollDirection direction)
{
gdouble delta;
switch (direction)
{
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
delta = -1.0;
break;
case CLUTTER_SCROLL_RIGHT:
case CLUTTER_SCROLL_DOWN:
delta = 1.0;
break;
case CLUTTER_SCROLL_SMOOTH:
g_assert_not_reached ();
break;
}
st_adjustment_adjust_for_scroll_event (adj, delta);
}
static gboolean static gboolean
st_scroll_bar_scroll_event (ClutterActor *actor, st_scroll_bar_scroll_event (ClutterActor *actor,
ClutterScrollEvent *event) ClutterScrollEvent *event)
{ {
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv; StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
gdouble step, value, delta_x, delta_y;
if (priv->adjustment) if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
{ return TRUE;
g_object_get (priv->adjustment,
"step-increment", &step,
"value", &value,
NULL);
}
else
{
return FALSE;
}
switch (event->direction) switch (event->direction)
{ {
case CLUTTER_SCROLL_SMOOTH: case CLUTTER_SCROLL_SMOOTH:
clutter_event_get_scroll_delta ((ClutterEvent *)event, {
&delta_x, &delta_y); gdouble delta_x, delta_y;
if (fabs (delta_x) > fabs (delta_y)) clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
st_adjustment_set_value (priv->adjustment, value + delta_x);
if (priv->vertical)
st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_y);
else else
st_adjustment_set_value (priv->adjustment, value + delta_y); st_adjustment_adjust_for_scroll_event (priv->adjustment, delta_x);
}
break; break;
case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
st_adjustment_set_value (priv->adjustment, value - step);
break;
case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_DOWN:
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT: case CLUTTER_SCROLL_RIGHT:
st_adjustment_set_value (priv->adjustment, value + step); adjust_with_direction (priv->adjustment, event->direction);
break; break;
} }

View File

@ -665,6 +665,31 @@ st_scroll_view_allocate (ClutterActor *actor,
} }
static void
adjust_with_direction (StAdjustment *adj,
ClutterScrollDirection direction)
{
gdouble delta;
switch (direction)
{
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_LEFT:
delta = -1.0;
break;
case CLUTTER_SCROLL_RIGHT:
case CLUTTER_SCROLL_DOWN:
delta = 1.0;
break;
case CLUTTER_SCROLL_SMOOTH:
default:
g_assert_not_reached ();
break;
}
st_adjustment_adjust_for_scroll_event (adj, delta);
}
static void static void
st_scroll_view_style_changed (StWidget *widget) st_scroll_view_style_changed (StWidget *widget)
{ {
@ -687,57 +712,31 @@ st_scroll_view_scroll_event (ClutterActor *self,
ClutterScrollEvent *event) ClutterScrollEvent *event)
{ {
StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv; StScrollViewPrivate *priv = ST_SCROLL_VIEW (self)->priv;
gdouble value, step, hvalue, vvalue, delta_x, delta_y;
/* don't handle scroll events if requested not to */ /* don't handle scroll events if requested not to */
if (!priv->mouse_scroll) if (!priv->mouse_scroll)
return FALSE; return FALSE;
switch (event->direction) if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
{ return TRUE;
case CLUTTER_SCROLL_SMOOTH:
clutter_event_get_scroll_delta ((ClutterEvent *)event,
&delta_x, &delta_y);
g_object_get (priv->hadjustment,
"value", &hvalue,
NULL);
g_object_get (priv->vadjustment,
"value", &vvalue,
NULL);
break;
case CLUTTER_SCROLL_UP:
case CLUTTER_SCROLL_DOWN:
g_object_get (priv->vadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
case CLUTTER_SCROLL_LEFT:
case CLUTTER_SCROLL_RIGHT:
g_object_get (priv->hadjustment,
"step-increment", &step,
"value", &value,
NULL);
break;
}
switch (event->direction) switch (event->direction)
{ {
case CLUTTER_SCROLL_SMOOTH: case CLUTTER_SCROLL_SMOOTH:
st_adjustment_set_value (priv->hadjustment, hvalue + delta_x); {
st_adjustment_set_value (priv->vadjustment, vvalue + delta_y); gdouble delta_x, delta_y;
clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
st_adjustment_adjust_for_scroll_event (priv->hadjustment, delta_x);
st_adjustment_adjust_for_scroll_event (priv->vadjustment, delta_y);
}
break; break;
case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_UP:
st_adjustment_set_value (priv->vadjustment, value - step);
break;
case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_DOWN:
st_adjustment_set_value (priv->vadjustment, value + step); adjust_with_direction (priv->vadjustment, event->direction);
break; break;
case CLUTTER_SCROLL_LEFT: case CLUTTER_SCROLL_LEFT:
st_adjustment_set_value (priv->hadjustment, value - step);
break;
case CLUTTER_SCROLL_RIGHT: case CLUTTER_SCROLL_RIGHT:
st_adjustment_set_value (priv->hadjustment, value + step); adjust_with_direction (priv->hadjustment, event->direction);
break; break;
} }

View File

@ -30,8 +30,6 @@
#define CACHE_PREFIX_ICON "icon:" #define CACHE_PREFIX_ICON "icon:"
#define CACHE_PREFIX_URI "uri:" #define CACHE_PREFIX_URI "uri:"
#define CACHE_PREFIX_URI_FOR_CAIRO "uri-for-cairo:" #define CACHE_PREFIX_URI_FOR_CAIRO "uri-for-cairo:"
#define CACHE_PREFIX_RAW_CHECKSUM "raw-checksum:"
#define CACHE_PREFIX_COMPRESSED_CHECKSUM "compressed-checksum:"
struct _StTextureCachePrivate struct _StTextureCachePrivate
{ {
@ -1414,63 +1412,6 @@ st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache,
return surface; return surface;
} }
/**
* st_texture_cache_load_from_raw:
* @cache: a #StTextureCache
* @data: (array length=len): raw pixel data
* @len: the length of @data
* @has_alpha: whether @data includes an alpha channel
* @width: width in pixels of @data
* @height: width in pixels of @data
* @rowstride: rowstride of @data
* @size: size of icon to return
*
* Creates (or retrieves from cache) an icon based on raw pixel data.
*
* Return value: (transfer none): a new #ClutterActor displaying a
* pixbuf created from @data and the other parameters.
**/
ClutterActor *
st_texture_cache_load_from_raw (StTextureCache *cache,
const guchar *data,
gsize len,
gboolean has_alpha,
int width,
int height,
int rowstride,
int size,
GError **error)
{
ClutterTexture *texture;
CoglHandle texdata;
char *key;
char *checksum;
texture = create_default_texture ();
clutter_actor_set_size (CLUTTER_ACTOR (texture), size, size);
/* In theory, two images of with different width and height could have the same
* pixel data and thus hash the same. (Say, a 16x16 and a 8x32 blank image.)
* We ignore this for now. If anybody hits this problem they should use
* GChecksum directly to compute a checksum including the width and height.
*/
checksum = g_compute_checksum_for_data (G_CHECKSUM_SHA1, data, len);
key = g_strdup_printf (CACHE_PREFIX_RAW_CHECKSUM "checksum=%s", checksum);
g_free (checksum);
texdata = g_hash_table_lookup (cache->priv->keyed_cache, key);
if (texdata == NULL)
{
texdata = data_to_cogl_handle (data, has_alpha, width, height, rowstride, TRUE);
g_hash_table_insert (cache->priv->keyed_cache, g_strdup (key), texdata);
}
g_free (key);
set_texture_cogl_texture (texture, texdata);
return CLUTTER_ACTOR (texture);
}
static StTextureCache *instance = NULL; static StTextureCache *instance = NULL;
/** /**

View File

@ -96,16 +96,6 @@ CoglHandle st_texture_cache_load_file_to_cogl_texture (StTextureCache *cache,
cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache, cairo_surface_t *st_texture_cache_load_file_to_cairo_surface (StTextureCache *cache,
const gchar *file_path); const gchar *file_path);
ClutterActor *st_texture_cache_load_from_raw (StTextureCache *cache,
const guchar *data,
gsize len,
gboolean has_alpha,
int width,
int height,
int rowstride,
int size,
GError **error);
/** /**
* StTextureCacheLoader: (skip) * StTextureCacheLoader: (skip)
* @cache: a #StTextureCache * @cache: a #StTextureCache

View File

@ -770,6 +770,72 @@ st_theme_node_lookup_double (StThemeNode *node,
return result; return result;
} }
/**
* st_theme_node_lookup_time:
* @node: a #StThemeNode
* @property_name: The name of the time property
* @inherit: if %TRUE, if a value is not found for the property on the
* node, then it will be looked up on the parent node, and then on the
* parent's parent, and so forth. Note that if the property has a
* value of 'inherit' it will be inherited even if %FALSE is passed
* in for @inherit; this only affects the default behavior for inheritance.
* @value: (out): location to store the value that was determined.
* If the property is not found, the value in this location
* will not be changed.
*
* Generically looks up a property containing a single time value,
* which is converted to milliseconds.
*
* Return value: %TRUE if the property was found in the properties for this
* theme node (or in the properties of parent nodes when inheriting.)
*/
gboolean
st_theme_node_lookup_time (StThemeNode *node,
const char *property_name,
gboolean inherit,
double *value)
{
gboolean result = FALSE;
int i;
ensure_properties (node);
for (i = node->n_properties - 1; i >= 0; i--)
{
CRDeclaration *decl = node->properties[i];
if (strcmp (decl->property->stryng->str, property_name) == 0)
{
CRTerm *term = decl->value;
if (term->type != TERM_NUMBER)
continue;
switch (term->content.num->type)
{
case NUM_TIME_S:
*value = 1000 * term->content.num->val;
result = TRUE;
break;
case NUM_TIME_MS:
*value = term->content.num->val;
result = TRUE;
break;
default:
;
}
if (result)
break;
}
}
if (!result && inherit && node->parent_node)
result = st_theme_node_lookup_time (node->parent_node, property_name, inherit, value);
return result;
}
/** /**
* st_theme_node_get_double: * st_theme_node_get_double:
* @node: a #StThemeNode * @node: a #StThemeNode
@ -2063,7 +2129,7 @@ st_theme_node_get_transition_duration (StThemeNode *node)
if (node->transition_duration > -1) if (node->transition_duration > -1)
return st_slow_down_factor * node->transition_duration; return st_slow_down_factor * node->transition_duration;
st_theme_node_lookup_double (node, "transition-duration", FALSE, &value); st_theme_node_lookup_time (node, "transition-duration", FALSE, &value);
node->transition_duration = (int)value; node->transition_duration = (int)value;

View File

@ -134,6 +134,10 @@ gboolean st_theme_node_lookup_length (StThemeNode *node,
const char *property_name, const char *property_name,
gboolean inherit, gboolean inherit,
gdouble *length); gdouble *length);
gboolean st_theme_node_lookup_time (StThemeNode *node,
const char *property_name,
gboolean inherit,
gdouble *value);
gboolean st_theme_node_lookup_shadow (StThemeNode *node, gboolean st_theme_node_lookup_shadow (StThemeNode *node,
const char *property_name, const char *property_name,
gboolean inherit, gboolean inherit,

View File

@ -30,13 +30,15 @@ builddir=`cd $builddir && pwd`
srcdir=$builddir/@srcdir@ srcdir=$builddir/@srcdir@
srcdir=`cd $srcdir && pwd` srcdir=`cd $srcdir && pwd`
GI_TYPELIB_PATH="$GI_TYPELIB_PATH${GI_TYPELIB_PATH:+:}@MUTTER_TYPELIB_DIR@:$builddir/../src" GI_TYPELIB_PATH="$GI_TYPELIB_PATH${GI_TYPELIB_PATH:+:}@MUTTER_TYPELIB_DIR@:$builddir/../src:$builddir/../src/gvc"
GJS_PATH="$srcdir:$srcdir/../js" GJS_PATH="$srcdir:$srcdir/../js"
GJS_DEBUG_OUTPUT=stderr GJS_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG" $verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
GNOME_SHELL_TESTSDIR="$srcdir/" GNOME_SHELL_TESTSDIR="$srcdir/"
GNOME_SHELL_JS="$srcdir/../js"
GNOME_SHELL_DATADIR="$srcdir/../data"
export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_TESTSDIR GNOME_SHELL_JS GNOME_SHELL_DATADIR LD_PRELOAD
for test in $tests ; do for test in $tests ; do
$debug $builddir/../src/run-js-test $test || exit $? $debug $builddir/../src/run-js-test $test || exit $?

View File

@ -98,7 +98,7 @@ stage {
background-color: #333; background-color: #333;
border: 2px solid black; border: 2px solid black;
border-radius: 8px; border-radius: 8px;
transition-duration: 1000; /* One second */ transition-duration: 1s;
} }
#transition-container:hover .transition-label { #transition-container:hover .transition-label {