Compare commits

...

81 Commits
3.3.4 ... 3.3.5

Author SHA1 Message Date
ab29ce872a Bump version to 3.3.5
Updated NEWS
Require Mutter 3.3.5
2012-02-07 18:31:29 -05:00
57beb0ade1 data/Makefile.am: fix typo in EXTRA_DIST 2012-02-07 18:31:29 -05:00
e3d0b6f90f Add -Wno-error=deprecated declarations
Even with --enable-compile-warnings=error, avoid erroring out on deprecations
for the moment, since we are hitting many Clutter deprecations and some are
hard to fix.
2012-02-07 18:21:56 -05:00
e2aa954cb5 st: Fix typo in doc comment 2012-02-08 00:01:12 +01:00
05c285a945 st: Shut up a compiler warning
Remove an unused variable to make GCC happy.
2012-02-08 00:01:12 +01:00
27b34992c6 iconGrid: Don't enter an infinite loop
If both spacing and -shell-grid-item-size are 0, as they would be with nothing
setting them, we enter an infinite loop where we try to compute the layout.
Avoid the situation entirely by defaulting -shell-grid-item-size to a sane
value instead of 0.

https://bugzilla.gnome.org/show_bug.cgi?id=662747
2012-02-07 17:40:22 -05:00
4886238761 Updated POTFILES.in 2012-02-07 23:14:34 +01:00
42d46aed90 po: Add extensionPrefs/main.js to the localized file set 2012-02-07 16:49:19 -05:00
a622aba7eb extensionUtils: Create and allow access to a new "extension" object
The "extension" object is what I previously called the "helper" object.
It contains the extension importer object as well as the metadata object.
Things that were previously added on to the metadata (state, path, dir, etc.)
are now part of this new "extension" object.

With the new importer changes brought on by the extension prefs tool,
extensions are left without a way to import submodules at the global scope,
which would make them rely on techniques like:

  var MySubModule;

  function init(meta) {
      MySubModule = meta.importer.mySubModule;
  }

That is, there's now a lot more meaningless boilerplate that nobody wants
to write and nobody wants to reivew.

Let's solve this with a few clever hacks.
Allow extensions to get their current extension object with:

  let extension = imports.misc.extensionUtils.getCurrentExtension();

As such, extensions can now get their own extension object before the
'init' method is called, so they can import submodules or do other things
at the module scope:

  const MySubModule = extension.imports.mySubModule;
  const dataPath = GLib.build_filenamev([extension.path, 'awesome-data.json']);

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
831099cca5 browser-plugin: Provide new APIs for launching extension preferences
Add two new APIs, "launchExtensionPrefs" to let SweetTooth let the user
launch the extension preferences tool directly from the browser. To allow
SweetTooth to check if an extension can be configured, add a new key to
the 'metadata', 'hasPrefs', which is returned by the GetExtensionInfo/
ListExtensions DBus methods.

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
b8a54faf94 Add a new tool, 'gnome-shell-extension-prefs', which can configure extensions
A new tool, 'gnome-shell-extension-prefs' can load a new entry point from
extensions, 'prefs.js', which has an entry point to return a GTK+ widget.
This allows extensions to have their own preferences dialog, without each
extension needing to ship its own Python script and .desktop file.

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
80ff6ff797 Move a lot of miscellaneous code related to extensions into a new module
ExtensionUtils is a new module that has a lot of miscellaneous things related
to loading extensions and the extension system put into a place that does not
depend on Shell or St.

Note that this will break extensions that have with multiple files by replacing
the old uuid-based importer with an object directly on the meta object.

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
2f27b94757 extensionSystem: Fix an error related to extension importing
If an extension fails to import, we will pass the error object
to logExtensionError, which fails to pass it onto DBus as an
error object is not a string. To fix, convert the error object
to a string before passing it to logExtensionError.

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
b2f33e2895 Split off the extension importing stuff into a new library, 'ShellJS'
This allows us to create a separate utility to import things from
shell extensions that does not have the entire Shell stack built up

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:37 -05:00
d1d4142052 Makefile.am: Use global substitutions
This allows us to make more than one of the same replacement in a .in file

https://bugzilla.gnome.org/show_bug.cgi?id=668429
2012-02-07 16:00:36 -05:00
46caf6d673 ShellApp: Fix warning with call to g_strv_length()
There is no implicit cast from const char * const * to char **.
2012-02-07 13:06:24 -05:00
2864c360bc theme: Fix highlight of panel buttons
More fallout from the background-size change ...
2012-02-07 18:58:59 +01:00
e5dfc6323a Updated Galician translations 2012-02-07 11:54:19 +01:00
5bc042ba6f Remove override of map/unmap
Clutter, since version 1.8, does The Right Thing™ inside the default
implementation of ClutterActor::map and ClutterActor::unmap, even for
non-container actors: it will iterate over the list of children and
map, or unmap, each one of them, respectively.

This means that the requirement to override map and unmap for composite
actors to map and unmap the internal children has been dropped.

https://bugzilla.gnome.org/show_bug.cgi?id=669239
2012-02-06 23:36:43 +00:00
c63fe5ee24 workspaceThumbnail: avoid bouncing of the drop placeholder above the first workspace
https://bugzilla.gnome.org/show_bug.cgi?id=664622
2012-02-06 11:16:28 -05:00
ee6bc33cea PopupSwitchMenuItem: allow toggling without closing the menu
Similar to what Gtk does, now toggling with Space does not close
the menu.

https://bugzilla.gnome.org/show_bug.cgi?id=664416
2012-02-06 16:49:15 +01:00
5c730dc53d st-theme-node-drawing: Remove possible subtexturing
Since our implementation of background-size is now CSS-compliant, we
do not need this subtexture hack that clips a "leak". The comment here
is also incorrect.

https://bugzilla.gnome.org/show_bug.cgi?id=633462
2012-02-06 08:01:33 -05:00
5a3de8d663 st-theme-node-drawing: Fix implementation of background-size
It seems that accidentally, two variables were swapped in one code path
of the background-size implementation, causing interesting but wrong
images for some elements.

https://bugzilla.gnome.org/show_bug.cgi?id=633462
2012-02-06 08:01:33 -05:00
fad88dd517 theme: More fallout from background-size
The app filter arrows and scroll handles should be at 100%, not
mapped to their container

https://bugzilla.gnome.org/show_bug.cgi?id=633462
2012-02-06 08:01:33 -05:00
39dd24310d Updated Galician translations 2012-02-06 02:52:16 +01:00
b13809d0c7 Updated Dutch translation 2012-02-04 17:13:10 +01:00
87559414a3 screenGrabber: Pass correct coordinates to glReadPixels
Pass x and y to glReadPixels rather then always 0, 0.

https://bugzilla.gnome.org/show_bug.cgi?id=669366
2012-02-04 17:08:28 +01:00
b5b5759829 Updated Dutch translation 2012-02-04 15:59:58 +01:00
d254e2e1f2 shell-global: Correct screenshot_window() after mutter changes
Recent mutter changes made MetaShapedTexture not a ClutterTexture,
but instead a special ClutterActor subclass that implemented the texture-y
bits itself. Use recently introduced API in MetaShapedTexture so that we can
get the raw texture data and spit it out as a PNG.

Use the new meta_shaped_texture_get_image() to get a window's texture data.
meta_shaped_texture_get_image() flattens the image against any mask it may
have, so a screenshot of it should look exactly as it does on the display.

https://bugzilla.gnome.org/show_bug.cgi?id=662486
2012-02-03 19:58:39 -05:00
458b0b22fc shell-util: Remove shell_breakpoint
A near identical function appears in gjs, in the "system" module:

    const System = imports.system;
    System.breakpoint();
2012-02-03 14:21:57 -05:00
cd30128af8 placeDisplay: Fix accidental swap of parameters
https://bugzilla.gnome.org/show_bug.cgi?id=669236
2012-02-02 15:31:46 -05:00
d61cdd8cea Updated Slovenian translation 2012-02-02 20:58:35 +01:00
0d0e545979 configure: fix help string for jhbuild-wrapper-script option 2012-02-02 08:26:44 -05:00
6c5e96c33a added Sinhala language to LINGUAS file 2012-02-01 15:53:10 +05:30
bae2359b54 added Sinhala translation 2012-02-01 15:46:43 +05:30
8cbbb456f0 mount-operation: set a max-width for the question subject label
Since the string can be arbitrairly long.

https://bugzilla.gnome.org/show_bug.cgi?id=665322
2012-02-01 00:57:19 -05:00
dfd39461cf Updated Spanish translation 2012-01-31 17:49:13 +01:00
60d8683ae7 ShellRecorder: drop frames to approximate the target framerate
Instead of adding every rendered frame into the recording, drop frames
and only buffer and record enough frames to match the target framerate.

Increase the default frame rate from 15 to 30, since now that we're
actually enforcing framerate, it's noticeable that 15fps is not smooth.

https://bugzilla.gnome.org/show_bug.cgi?id=669066
2012-01-31 10:47:19 -05:00
f2cc5cf152 ShellRecorder: drop frames to keep from running the user out of memory.
Once we're buffering more than 3/4's of the "half of memory" target
for total buffer usage, start dropping frames.

https://bugzilla.gnome.org/show_bug.cgi?id=669066
2012-01-31 10:47:19 -05:00
d4a26fbf4b ShellRecorder: improve the default pipeline
The default pipeline was fairly aggressive about quality, and could
be too expensive for some computers. Decrease the quality setting for
the vp8 codec from 10 to 8, and increase the speed setting from 2 to 6.

(Basically, quality affects the visual fidelity of the end result, while
speed affects how much CPU the encoder uses to get a high compression
ratio at that quality level.)

Remove videorate from the pipeline, since the GStreamer VP8 encoder can
handle variable-framerate streams. This means that we won't spend CPU
encoding duplicate frames added by videorate.

https://bugzilla.gnome.org/show_bug.cgi?id=669066
2012-01-31 10:47:19 -05:00
025784fd83 ShellRecorderSrc: Set as GST_FORMAT_TIME
We need to indicate that our GStreamer source produces timestamped
frames, instead of the default, which is to produce a stream of bytes.
This is needed for correctness, and to avoid warnings for some
pipelines.

https://bugzilla.gnome.org/show_bug.cgi?id=669066
2012-01-31 10:47:19 -05:00
4e89a5edde ShellScreenGrabber: grab the screen using pixel buffers
For the Intel drivers, using glReadPixels() to read into client-memory
directly from the frame buffer is much slower than creating a pixel
buffer, copying into that, and then mapping that for reading. On other
drivers, the two approaches are likely to be similar in speed. Create
a ShellScreenGrabber abstraction that uses pixel buffers if available.
Use that for screenshots and screen recording.

https://bugzilla.gnome.org/show_bug.cgi?id=669065
2012-01-31 10:47:19 -05:00
b3936ecadf user-menu: Don't change HIDDEN to EXTENDED_AWAY
When the session status changes to IDLE, we automatically adjust
the IM presence; however, we should treat HIDDEN the same as OFFLINE
and not change the presence.

https://bugzilla.gnome.org/show_bug.cgi?id=642408
2012-01-31 10:22:53 +01:00
2c9e6bb589 browser-plugin: Fix the browser plugin
commit 26991988cb broke the browser plugin
by trying to reference a uninitialized pointer and making the NPAPI retain
a NULL object.

https://bugzilla.gnome.org/show_bug.cgi?id=668517
2012-01-30 19:26:50 -05:00
73261a4a66 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2012-01-30 19:30:53 +08:00
3d0dd38045 automountManager: Make sure sessionActive is initialized
Since the port to GDBus, sessionActive is only set on DBus name
owner changes; this means that it may end up not being initialized
at all, and therefore always evaluate to false.
Make sure that the property is always initialized on startup.

https://bugzilla.gnome.org/show_bug.cgi?id=668020
2012-01-30 00:09:56 +01:00
8bcbf3030f power: Fix icon updates
gnome-settings-daemon commit 07b1ed63016 removed the custom 'Changed'
DBus signal in favor of the standard 'PropertiesChanged' signal, so
use that instead to update the icon.

https://bugzilla.gnome.org/show_bug.cgi?id=667371
2012-01-29 23:21:01 +01:00
1bc7edc5d8 Updated Slovenian translation 2012-01-28 19:52:48 +01:00
0673720db9 Updated Norwegian bokmål translation 2012-01-28 15:53:43 +01:00
730a0d4c5a Updated Hebrew translation. 2012-01-28 11:25:20 +02:00
9147dee0de screenshot: use the correct offsets when calculating the window area
Use the correct clip offsets when taking the screenshot of a window, to
exclude possible invisible borders and to include the case where the
window doesn't have any frame itself.
2012-01-27 17:15:03 -05:00
12746a1949 modemManager: Fix fallout from GDBus port
We need to listen to DBus signals with the 'connectSignal' method, not
the Signals 'connect' method.
2012-01-27 14:59:32 -05:00
bdd65fe755 AppMenuButton: bind "can-focus" to "reactive"
When changing to an empty workspace we make the AppMenuButton invisible but
the user could still get to the menu using keyboard navigation.

https://bugzilla.gnome.org/show_bug.cgi?id=643867
2012-01-27 18:01:22 +00:00
21e2280825 AppMenuButton: only show the button if the target app is on the current ws
When the last window on a workspace is closed the focus goes to some other
window in another workspace which would cause us to show the AppMenuButton for
an application that isn't visible on the current empty workspace.

https://bugzilla.gnome.org/show_bug.cgi?id=643867
2012-01-27 16:34:52 +00:00
e9d2a429eb message-tray: Allow to switch between left/right click directly
Currently it is not possible to trigger the context menu while the
summary notification is opened (and vice versa). To actually trigger
the desired item, the user has to click again, which is annoying
without a good justification, so allow switching directly between
left/right click items.

https://bugzilla.gnome.org/show_bug.cgi?id=666197
2012-01-27 14:27:41 +01:00
b67dfb9edf Updated Spanish translation 2012-01-27 13:40:06 +01:00
55308917f9 popup-menu: Do not open empty menus
There is little point in showing an empty menu, so return early from
open() if the menu does not contain any items.

https://bugzilla.gnome.org/show_bug.cgi?id=643867
2012-01-27 13:32:43 +01:00
1b64b09532 a11y: StLabelAccessible needs to notify accessible-name change
https://bugzilla.gnome.org/show_bug.cgi?id=667376
2012-01-27 12:29:57 +01:00
74dd298891 a11y: Setting a name/label_actor for several items on the panel
https://bugzilla.gnome.org/show_bug.cgi?id=667376
2012-01-27 12:29:52 +01:00
5a85fc0e55 magnifier: Handle screen size changes
Update everything that depends on the screen size whenever it changes.

https://bugzilla.gnome.org/show_bug.cgi?id=667860
2012-01-26 15:14:48 +00:00
26991988cb browser-plugin: Refactor plugin_object_set_property, and fix a bug
If the user did "obj.onchanged = 1;" or passed another sort of invalid type,
then we would clear the old listener as well as throw an exception.

https://bugzilla.gnome.org/show_bug.cgi?id=668517
2012-01-26 05:13:21 -05:00
15563444cf browser-plugin: Fix callback for "onchange"
In the case that calling the listener fails, "result" may be uninitialized.
Sending NPAPI uninitialized memory is never a good idea.

https://bugzilla.gnome.org/show_bug.cgi?id=668517
2012-01-26 05:13:21 -05:00
3bcdba6e1d browser-plugin: Add a new "onshellrestart" API
This function is something the client sets and is called whenever the Shell's
DBus name is acquired.

https://bugzilla.gnome.org/show_bug.cgi?id=668517
2012-01-26 05:13:21 -05:00
ef56a78544 shell-dbus: factor screenshot callback into a separate function
Share the screenshot methods callback into a factored out function.

https://bugzilla.gnome.org/show_bug.cgi?id=668618
2012-01-25 19:20:09 -05:00
049a561466 screenshot: add a 'flash' boolean flag to screenshot methods
Add a flag to these methods that allows flashing the area of the
screenshot directly from the compositor.

https://bugzilla.gnome.org/show_bug.cgi?id=668618
2012-01-25 19:20:09 -05:00
b40b19997a shell: Use generic marshaller
https://bugzilla.gnome.org/show_bug.cgi?id=662152
2012-01-25 19:03:48 -05:00
46505a8314 etc: Use generic marshaller
https://bugzilla.gnome.org/show_bug.cgi?id=662152
2012-01-25 19:03:13 -05:00
78fb102002 st: Use generic marshaller
https://bugzilla.gnome.org/show_bug.cgi?id=662152
2012-01-25 19:03:01 -05:00
c6e924f788 browser-plugin: Fix leak in plugin_enable_extension
https://bugzilla.gnome.org/show_bug.cgi?id=668541
2012-01-25 19:02:08 -05:00
f6508b51a2 st-im-text: Guard against multiple dispose
This could cause warnings like "invalid (NULL) pointer instance"

https://bugzilla.gnome.org/show_bug.cgi?id=665000
2012-01-25 19:01:33 -05:00
b0ae596de8 contact-display: Don't show non-IM contacts as "offline"
Currently we display IM status information for every contact, falling
back to "offline" if the contact does not have an associated IM
account. Instead, don't show IM presence in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=662685
2012-01-25 21:14:40 +01:00
1d311e7916 shell-app: Make use of Keywords in search
.desktop files have been designed for browsing, so the existing
fields often produce insufficient results when used for search.
gnome-control-center used X-GNOME-Keywords for that purpose, which
has now been standardized as Keywords. It makes sense for us to
support it in gnome-shell as well (and encourage its use outside
of settings panels).

https://bugzilla.gnome.org/show_bug.cgi?id=609702
2012-01-25 20:29:37 +01:00
0c19f71c96 telepathyClient: Fix fallout from Lang.Class port
this.parent was ported from calling the parent class's method like
MessageTray.Notification.prototype._init.call(this, ...);. When
porting to Lang.Class, the 'this' parameter is now passed automatically, but
removing it was forgot in a few places. Fix these places.

https://bugzilla.gnome.org/show_bug.cgi?id=665017
2012-01-25 02:13:37 -05:00
8d6ab32b9a shell-app-system: Add Debian to the vendor prefixes
It seems that Debian has their own prefixes in something like
debian-xterm.desktop. To properly do application matching in these cases,
we need to strip the debian- prefix.

https://bugzilla.gnome.org/show_bug.cgi?id=665647
2012-01-25 02:11:11 -05:00
6c1a2d531f Updated Irish translation 2012-01-24 16:40:55 -07:00
c6e9f9742b dash: Use the correct theme node for spacing/padding
We consider spacing and padding in _adjustIconSize, but as we use
the theme node from an actor which is not exposed to the CSS, we
miss the "real" values - correct this.

https://bugzilla.gnome.org/show_bug.cgi?id=662213
2012-01-24 22:53:22 +01:00
d23aaf3cea Updated Finnish translation. 2012-01-24 15:37:21 +02:00
017fde91ad Updated Galician translations 2012-01-23 04:05:43 +01:00
31ffc5a85d theme: Fix some more fallout from background-size addition
The workspace-switcher-popup background should be at 100%, not upscaled
to contain the entire popup.

https://bugzilla.gnome.org/show_bug.cgi?id=668430
2012-01-22 06:09:01 -05:00
62b65a25d8 workspace: fix dragging of window thumbnails
Clear the ClutterClickAction state before starting the drag,
otherwise it will eat the first button event after the drag,
preventing a new drag from being started.

https://bugzilla.gnome.org/show_bug.cgi?id=662386
2012-01-22 06:06:35 -05:00
882fe48d80 Screenshot: Move filesystem I/O to a thread
Writting the screenshot to a file can take a relativly long time
in which we block the compositor, so do that part in a separate
thread to avoid the hang.

https://bugzilla.gnome.org/show_bug.cgi?id=652952
2012-01-22 11:47:56 +01:00
100 changed files with 5938 additions and 3221 deletions

3
.gitignore vendored
View File

@ -18,6 +18,8 @@ config
configure configure
data/gnome-shell.desktop data/gnome-shell.desktop
data/gnome-shell.desktop.in data/gnome-shell.desktop.in
data/gnome-shell-extension-prefs.desktop
data/gnome-shell-extension-prefs.desktop.in
data/gschemas.compiled data/gschemas.compiled
data/org.gnome.shell.gschema.xml data/org.gnome.shell.gschema.xml
data/org.gnome.shell.gschema.valid data/org.gnome.shell.gschema.valid
@ -62,6 +64,7 @@ src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell src/gnome-shell
src/gnome-shell-calendar-server src/gnome-shell-calendar-server
src/gnome-shell-extension-tool src/gnome-shell-extension-tool
src/gnome-shell-extension-prefs
src/gnome-shell-hotplug-sniffer src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild src/gnome-shell-jhbuild
src/gnome-shell-perf-helper src/gnome-shell-perf-helper

49
NEWS
View File

@ -1,3 +1,52 @@
3.3.5
=====
* Extension system: [Jasper; #668429]
http://blog.mecheye.net/2012/02/more-extension-api-breaks/
- Add a 'gnome-shell-extension-prefs' application for displaying extension
preferences as provided by the extension in a prefs.js file.
- Allow launching gnome-shell-extension-prefs from extensions.gnome.org
throuhg the browser plugin.
- Add ExtensionUtils.getCurrentExtension() for an extension to get a
handle to an extension object, to get local imports or paths.
- Add an onshellrestart callback to the browser plugin [Jasper; #668517]
* Screenshots:
- Move the screenshot "flash" to the shell [Cosimo; #668618]
- Move saving screenshots to a thread [Adel Gadllah; #652952]
- Correctly screenshot rounded decorations [Jasper; #662486]
* Screen recorder:
- Change the default pipeline to favor speed over quality [Owen; #669066]
- Drop frames to keep from running the user out of memory [Owen; #669066]
* Work around a slow implementation of glReadPixels() in the Intel drivers,
improving performance for screenshots and the screen recorder.
[Owen; #669065]
* Use Keywords: field in desktop files when search for applications
[Florian; #609702]
* Strip debian- when matching desktop file names [Jasper; #665647]
* Fix up various problems from CSS background size-addition
[Florian, Jasper; #668430, #633462]
* UI tweaks and behavior fixes
[Florian, Giovanni, Stefano; #643867, #666197, #664622]
* Some improvements to exported accessibility information [Alejando; #667376]
* Don't show contacts without IM information as offline [Florian; #662685]
* Don't change status from hidden to extended_away when going idle
[Florian; #642408]
* Cleanups [Emmanuele, Jasper; #662152, #669239]
* Misc bug fixes [Cosimo, Dan, Florian, Jasper, Rui, Stefano;
#633462, #643867, #662213, #662386, #662747, #665000, #665017, #665322,
#667371, #667860, #668020, #668517, #668541, #669236]
Contributors:
Emmanuele Bassi, Giovanni Campagna, Cosimo Cecchi, Stefano Facchini,
Rui Matos, Florian Müllner, Alejandro Piñeiro, Jasper St. Pierre,
Owen Taylor, Dan Winship
Translations:
Daniel Mustieles [es], Timo Jyrinki [fi], Seán de Búrca [ga],
Fran Diéguez [gl], Kjartan Maraas [nb], Wouter Bolsterlee [nl],
Danishka Navin [si], Yaron Shahrabani [he], Matej Urbančič [sl],
Chao-Hsiung Liao [zh_HK, zh_TW]
3.3.4 3.3.4
===== =====
* https://live.gnome.org/EveryDetailMatters * https://live.gnome.org/EveryDetailMatters

View File

@ -41,7 +41,7 @@
"It can be used only by extensions.gnome.org" "It can be used only by extensions.gnome.org"
#define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type"; #define PLUGIN_MIME_STRING "application/x-gnome-shell-integration::Gnome Shell Integration Dummy Content-Type";
#define PLUGIN_API_VERSION 1 #define PLUGIN_API_VERSION 3
typedef struct { typedef struct {
GDBusProxy *proxy; GDBusProxy *proxy;
@ -262,11 +262,13 @@ NPP_Destroy(NPP instance,
/* =================== scripting interface =================== */ /* =================== scripting interface =================== */
typedef struct { typedef struct {
NPObject parent; NPObject parent;
NPP instance; NPP instance;
GDBusProxy *proxy; GDBusProxy *proxy;
NPObject *listener; NPObject *listener;
gint signal_id; NPObject *restart_listener;
gint signal_id;
guint watch_name_id;
} PluginObject; } PluginObject;
static void static void
@ -284,7 +286,7 @@ on_shell_signal (GDBusProxy *proxy,
gint32 status; gint32 status;
gchar *error; gchar *error;
NPVariant args[3]; NPVariant args[3];
NPVariant result; NPVariant result = { NPVariantType_Void };
g_variant_get (parameters, "(sis)", &uuid, &status, &error); g_variant_get (parameters, "(sis)", &uuid, &status, &error);
STRINGZ_TO_NPVARIANT (uuid, args[0]); STRINGZ_TO_NPVARIANT (uuid, args[0]);
@ -300,6 +302,25 @@ on_shell_signal (GDBusProxy *proxy,
} }
} }
static void
on_shell_appeared (GDBusConnection *connection,
const gchar *name,
const gchar *name_owner,
gpointer user_data)
{
PluginObject *obj = (PluginObject*) user_data;
if (obj->restart_listener)
{
NPVariant result = { NPVariantType_Void };
funcs.invokeDefault (obj->instance, obj->restart_listener,
NULL, 0, &result);
funcs.releasevariantvalue (&result);
}
}
static NPObject * static NPObject *
plugin_object_allocate (NPP instance, plugin_object_allocate (NPP instance,
NPClass *klass) NPClass *klass)
@ -312,6 +333,14 @@ plugin_object_allocate (NPP instance,
obj->signal_id = g_signal_connect (obj->proxy, "g-signal", obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
G_CALLBACK (on_shell_signal), obj); G_CALLBACK (on_shell_signal), obj);
obj->watch_name_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
"org.gnome.Shell",
G_BUS_NAME_WATCHER_FLAGS_NONE,
on_shell_appeared,
NULL,
obj,
NULL);
g_debug ("plugin object created"); g_debug ("plugin object created");
return (NPObject*)obj; return (NPObject*)obj;
@ -328,6 +357,9 @@ plugin_object_deallocate (NPObject *npobj)
if (obj->listener) if (obj->listener)
funcs.releaseobject (obj->listener); funcs.releaseobject (obj->listener);
if (obj->watch_name_id)
g_bus_unwatch_name (obj->watch_name_id);
g_debug ("plugin object destroyed"); g_debug ("plugin object destroyed");
g_slice_free (PluginObject, obj); g_slice_free (PluginObject, obj);
@ -341,7 +373,9 @@ static NPIdentifier enable_extension_id;
static NPIdentifier install_extension_id; static NPIdentifier install_extension_id;
static NPIdentifier uninstall_extension_id; static NPIdentifier uninstall_extension_id;
static NPIdentifier onextension_changed_id; static NPIdentifier onextension_changed_id;
static NPIdentifier onrestart_id;
static NPIdentifier get_errors_id; static NPIdentifier get_errors_id;
static NPIdentifier launch_extension_prefs_id;
static bool static bool
plugin_object_has_method (NPObject *npobj, plugin_object_has_method (NPObject *npobj,
@ -352,7 +386,8 @@ plugin_object_has_method (NPObject *npobj,
name == enable_extension_id || name == enable_extension_id ||
name == install_extension_id || name == install_extension_id ||
name == uninstall_extension_id || name == uninstall_extension_id ||
name == get_errors_id); name == get_errors_id ||
name == launch_extension_prefs_id);
} }
static inline gboolean static inline gboolean
@ -457,7 +492,10 @@ plugin_enable_extension (PluginObject *obj,
{ {
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length); gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
if (!uuid_is_valid (uuid_str)) if (!uuid_is_valid (uuid_str))
return FALSE; {
g_free (uuid_str);
return FALSE;
}
g_dbus_proxy_call (obj->proxy, g_dbus_proxy_call (obj->proxy,
(enabled ? "EnableExtension" : "DisableExtension"), (enabled ? "EnableExtension" : "DisableExtension"),
@ -616,6 +654,33 @@ plugin_get_errors (PluginObject *obj,
return jsonify_variant (res, result); return jsonify_variant (res, result);
} }
static gboolean
plugin_launch_extension_prefs (PluginObject *obj,
NPString uuid,
NPVariant *result)
{
gchar *uuid_str;
uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
if (!uuid_is_valid (uuid_str))
{
g_free (uuid_str);
return FALSE;
}
g_dbus_proxy_call (obj->proxy,
"LaunchExtensionPrefs",
g_variant_new ("(s)", uuid_str),
G_DBUS_CALL_FLAGS_NONE,
-1, /* timeout */
NULL, /* cancellable */
NULL, /* callback */
NULL /* user_data */);
g_free (uuid_str);
return TRUE;
}
static int static int
plugin_get_api_version (PluginObject *obj, plugin_get_api_version (PluginObject *obj,
NPVariant *result) NPVariant *result)
@ -726,6 +791,14 @@ plugin_object_invoke (NPObject *npobj,
NPVARIANT_TO_STRING(args[0]), NPVARIANT_TO_STRING(args[0]),
result); result);
} }
else if (name == launch_extension_prefs_id)
{
if (!NPVARIANT_IS_STRING(args[0])) return FALSE;
return plugin_launch_extension_prefs (obj,
NPVARIANT_TO_STRING(args[0]),
result);
}
return TRUE; return TRUE;
} }
@ -735,6 +808,7 @@ plugin_object_has_property (NPObject *npobj,
NPIdentifier name) NPIdentifier name)
{ {
return (name == onextension_changed_id || return (name == onextension_changed_id ||
name == onrestart_id ||
name == api_version_id || name == api_version_id ||
name == shell_version_id); name == shell_version_id);
} }
@ -761,6 +835,33 @@ plugin_object_get_property (NPObject *npobj,
else else
NULL_TO_NPVARIANT (*result); NULL_TO_NPVARIANT (*result);
} }
else if (name == onrestart_id)
{
if (obj->restart_listener)
OBJECT_TO_NPVARIANT (obj->restart_listener, *result);
else
NULL_TO_NPVARIANT (*result);
}
return TRUE;
}
static bool
plugin_object_set_callback (NPObject **listener,
const NPVariant *value)
{
if (!NPVARIANT_IS_OBJECT (*value) && !NPVARIANT_IS_NULL (*value))
return FALSE;
if (*listener)
funcs.releaseobject (*listener);
*listener = NULL;
if (NPVARIANT_IS_OBJECT (*value))
{
*listener = NPVARIANT_TO_OBJECT (*value);
funcs.retainobject (*listener);
}
return TRUE; return TRUE;
} }
@ -772,25 +873,13 @@ plugin_object_set_property (NPObject *npobj,
{ {
PluginObject *obj; PluginObject *obj;
if (!plugin_object_has_property (npobj, name)) obj = (PluginObject *)npobj;
return FALSE;
if (name == onextension_changed_id) if (name == onextension_changed_id)
{ return plugin_object_set_callback (&obj->listener, value);
obj = (PluginObject*) npobj;
if (obj->listener)
funcs.releaseobject (obj->listener);
obj->listener = NULL; if (name == onrestart_id)
if (NPVARIANT_IS_OBJECT (*value)) return plugin_object_set_callback (&obj->restart_listener, value);
{
obj->listener = NPVARIANT_TO_OBJECT (*value);
funcs.retainobject (obj->listener);
return TRUE;
}
else if (NPVARIANT_IS_NULL (*value))
return TRUE;
}
return FALSE; return FALSE;
} }
@ -824,7 +913,9 @@ init_methods_and_properties (void)
install_extension_id = funcs.getstringidentifier ("installExtension"); install_extension_id = funcs.getstringidentifier ("installExtension");
uninstall_extension_id = funcs.getstringidentifier ("uninstallExtension"); uninstall_extension_id = funcs.getstringidentifier ("uninstallExtension");
get_errors_id = funcs.getstringidentifier ("getExtensionErrors"); get_errors_id = funcs.getstringidentifier ("getExtensionErrors");
launch_extension_prefs_id = funcs.getstringidentifier ("launchExtensionPrefs");
onrestart_id = funcs.getstringidentifier ("onshellrestart");
onextension_changed_id = funcs.getstringidentifier ("onchange"); onextension_changed_id = funcs.getstringidentifier ("onchange");
} }

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.3.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.3.5],[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])
@ -53,7 +53,7 @@ if $PKG_CONFIG --exists gstreamer-0.10 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
build_recorder=true build_recorder=true
recorder_modules="gstreamer-0.10 gstreamer-base-0.10 x11" recorder_modules="gstreamer-0.10 gstreamer-base-0.10 x11"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes) PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi fi
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.7.5 CLUTTER_MIN_VERSION=1.7.5
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.29.18 GJS_MIN_VERSION=1.29.18
MUTTER_MIN_VERSION=3.3.3 MUTTER_MIN_VERSION=3.3.5
FOLKS_MIN_VERSION=0.5.2 FOLKS_MIN_VERSION=0.5.2
GTK_MIN_VERSION=3.3.9 GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.31.6 GIO_MIN_VERSION=2.31.6
@ -117,6 +117,7 @@ AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS LIBS=$saved_LIBS
PKG_CHECK_MODULES(GNOME_SHELL_JS, glib-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 gnome-desktop-3.0 >= 2.90.0 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
@ -198,7 +199,7 @@ if test "$enable_compile_warnings" != no ; then
if test "$enable_compile_warnings" = error ; then if test "$enable_compile_warnings" = error ; then
case " $CFLAGS " in case " $CFLAGS " in
*[\ \ ]-Werror[\ \ ]*) ;; *[\ \ ]-Werror[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Werror" ;; *) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
esac esac
fi fi
fi fi
@ -206,7 +207,7 @@ fi
changequote([,])dnl changequote([,])dnl
AC_ARG_ENABLE(jhbuild-wrapper-script, AC_ARG_ENABLE(jhbuild-wrapper-script,
AS_HELP_STRING([--jhbuild-wrapper-script=yes],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no) AS_HELP_STRING([--enable-jhbuild-wrapper-script],[Make "gnome-shell" script work for jhbuild]),,enable_jhbuild_wrapper_script=no)
AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes) AM_CONDITIONAL(USE_JHBUILD_WRAPPER_SCRIPT, test "x$enable_jhbuild_wrapper_script" = xyes)
AC_MSG_CHECKING([location of system Certificate Authority list]) AC_MSG_CHECKING([location of system Certificate Authority list])

View File

@ -1,5 +1,5 @@
desktopdir=$(datadir)/applications desktopdir=$(datadir)/applications
desktop_DATA = gnome-shell.desktop desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
# We substitute in bindir so it works as an autostart # We substitute in bindir so it works as an autostart
# file when built in a non-system prefix # file when built in a non-system prefix
@ -69,6 +69,7 @@ shaders_DATA = \
EXTRA_DIST = \ EXTRA_DIST = \
gnome-shell.desktop.in.in \ gnome-shell.desktop.in.in \
gnome-shell-extension-prefs.desktop.in.in \
$(menu_DATA) \ $(menu_DATA) \
$(shaders_DATA) \ $(shaders_DATA) \
$(convert_DATA) \ $(convert_DATA) \
@ -76,6 +77,7 @@ EXTRA_DIST = \
CLEANFILES = \ CLEANFILES = \
gnome-shell.desktop.in \ gnome-shell.desktop.in \
gnome-shell-extension-prefs.in \
$(desktop_DATA) \ $(desktop_DATA) \
$(gsettings_SCHEMAS) \ $(gsettings_SCHEMAS) \
gschemas.compiled gschemas.compiled

View File

@ -0,0 +1,12 @@
[Desktop Entry]
Type=Application
_Name=GNOME Shell Extension Preferences
_Comment=Configure GNOME Shell Extensions
Exec=@bindir@/gnome-shell-extension-prefs %u
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-shell
X-GNOME-Bugzilla-Component=extensions
X-GNOME-Bugzilla-Version=@VERSION@
Categories=GNOME;GTK;
OnlyShowIn=GNOME;
NoDisplay=true

View File

@ -108,7 +108,7 @@
<schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/" <schema id="org.gnome.shell.recorder" path="/org/gnome/shell/recorder/"
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key name="framerate" type="i"> <key name="framerate" type="i">
<default>15</default> <default>30</default>
<_summary>Framerate used for recording screencasts.</_summary> <_summary>Framerate used for recording screencasts.</_summary>
<_description> <_description>
The framerate of the resulting screencast recordered The framerate of the resulting screencast recordered
@ -127,7 +127,7 @@
take care of its own output - this might be used to send the output take care of its own output - this might be used to send the output
to an icecast server via shout2send or similar. When unset or set to an icecast server via shout2send or similar. When unset or set
to an empty value, the default pipeline will be used. This is currently to an empty value, the default pipeline will be used. This is currently
'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux'
and records to WEBM using the VP8 codec. %T is used as a placeholder and records to WEBM using the VP8 codec. %T is used as a placeholder
for a guess at the optimal thread count on the system. for a guess at the optimal thread count on the system.
</_description> </_description>

View File

@ -60,7 +60,6 @@ StScrollBar StBin#trough {
StScrollBar StButton#vhandle StScrollBar StButton#vhandle
{ {
background-image: url("scroll-vhandle.svg"); background-image: url("scroll-vhandle.svg");
background-size: contain;
background-color: #252525; background-color: #252525;
border: 1px solid #080808; border: 1px solid #080808;
border-radius: 8px; border-radius: 8px;
@ -69,7 +68,6 @@ StScrollBar StButton#vhandle
StScrollBar StButton#hhandle StScrollBar StButton#hhandle
{ {
background-image: url("scroll-hhandle.svg"); background-image: url("scroll-hhandle.svg");
background-size: contain;
background-color: #252525; background-color: #252525;
border: 1px solid #080808; border: 1px solid #080808;
border-radius: 8px; border-radius: 8px;
@ -362,7 +360,6 @@ StTooltip StLabel {
.panel-button:focus { .panel-button:focus {
border-image: url("panel-button-border.svg") 10 10 0 2; border-image: url("panel-button-border.svg") 10 10 0 2;
background-image: url("panel-button-highlight-wide.svg"); background-image: url("panel-button-highlight-wide.svg");
background-size: contain;
color: white; color: white;
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
} }
@ -371,7 +368,6 @@ StTooltip StLabel {
.panel-status-button:checked, .panel-status-button:checked,
.panel-status-button:focus { .panel-status-button:focus {
background-image: url("panel-button-highlight-narrow.svg"); background-image: url("panel-button-highlight-narrow.svg");
background-size: contain;
} }
.panel-button:active > .system-status-icon, .panel-button:active > .system-status-icon,
@ -707,13 +703,11 @@ StTooltip StLabel {
.app-filter:selected { .app-filter:selected {
color: #ffffff; color: #ffffff;
background-image: url("filter-selected-ltr.svg"); background-image: url("filter-selected-ltr.svg");
background-size: contain;
background-position: 190px 10px; background-position: 190px 10px;
} }
.app-filter:selected:rtl { .app-filter:selected:rtl {
background-image: url("filter-selected-rtl.svg"); background-image: url("filter-selected-rtl.svg");
background-size: contain;
background-position: 10px 10px; background-position: 10px 10px;
} }
@ -1624,7 +1618,6 @@ StTooltip StLabel {
border: 0px; border: 0px;
background: rgba(255,255,255,0.5); background: rgba(255,255,255,0.5);
background-image: url("ws-switch-arrow-up.svg"); background-image: url("ws-switch-arrow-up.svg");
background-size: contain;
border-radius: 8px; border-radius: 8px;
} }
@ -1633,7 +1626,6 @@ StTooltip StLabel {
border: 0px; border: 0px;
background: rgba(255,255,255,0.5); background: rgba(255,255,255,0.5);
background-image: url("ws-switch-arrow-down.svg"); background-image: url("ws-switch-arrow-down.svg");
background-size: contain;
border-radius: 8px; border-radius: 8px;
} }
@ -1718,6 +1710,10 @@ StTooltip StLabel {
background-color: rgba(0, 0, 0, 0.4); background-color: rgba(0, 0, 0, 0.4);
} }
.flashspot {
background-color: white;
}
/* End Session Dialog */ /* End Session Dialog */
.end-session-dialog { .end-session-dialog {
spacing: 42px; spacing: 42px;
@ -1830,6 +1826,10 @@ StTooltip StLabel {
padding-bottom: 6px; padding-bottom: 6px;
} }
.mount-question-dialog-subject {
max-width: 500px;
}
.show-processes-dialog-subject:rtl, .show-processes-dialog-subject:rtl,
.mount-question-dialog-subject:rtl { .mount-question-dialog-subject:rtl {
padding-left: 0px; padding-left: 0px;

View File

@ -7,8 +7,10 @@ nobase_dist_js_DATA = \
gdm/fingerprint.js \ gdm/fingerprint.js \
gdm/loginDialog.js \ gdm/loginDialog.js \
gdm/powerMenu.js \ gdm/powerMenu.js \
extensionPrefs/main.js \
misc/config.js \ misc/config.js \
misc/docInfo.js \ misc/docInfo.js \
misc/extensionUtils.js \
misc/fileUtils.js \ misc/fileUtils.js \
misc/format.js \ misc/format.js \
misc/gnomeSession.js \ misc/gnomeSession.js \
@ -35,6 +37,7 @@ nobase_dist_js_DATA = \
ui/endSessionDialog.js \ ui/endSessionDialog.js \
ui/environment.js \ ui/environment.js \
ui/extensionSystem.js \ ui/extensionSystem.js \
ui/flashspot.js \
ui/iconGrid.js \ ui/iconGrid.js \
ui/keyboard.js \ ui/keyboard.js \
ui/layout.js \ ui/layout.js \

279
js/extensionPrefs/main.js Normal file
View File

@ -0,0 +1,279 @@
const Lang = imports.lang;
const Gettext = imports.gettext;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Pango = imports.gi.Pango;
const _ = Gettext.gettext;
const Config = imports.misc.config;
const Format = imports.misc.format;
const ExtensionUtils = imports.misc.extensionUtils;
const GnomeShellIface = <interface name="org.gnome.Shell">
<signal name="ExtensionStatusChanged">
<arg type="s" name="uuid"/>
<arg type="i" name="state"/>
<arg type="s" name="error"/>
</signal>
</interface>;
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
function stripPrefix(string, prefix) {
if (string.slice(0, prefix.length) == prefix)
return string.slice(prefix.length);
return string;
}
const Application = new Lang.Class({
Name: 'Application',
_init: function() {
GLib.set_prgname('gnome-shell-extension-prefs');
this.application = new Gtk.Application({
application_id: 'org.gnome.shell.ExtensionPrefs',
flags: Gio.ApplicationFlags.HANDLES_COMMAND_LINE
});
this.application.connect('activate', Lang.bind(this, this._onActivate));
this.application.connect('command-line', Lang.bind(this, this._onCommandLine));
this.application.connect('startup', Lang.bind(this, this._onStartup));
this._extensionPrefsModules = {};
this._extensionIters = {};
},
_buildModel: function() {
this._model = new Gtk.ListStore();
this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
},
_extensionAvailable: function(uuid) {
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
if (ExtensionUtils.isOutOfDate(extension))
return false;
if (!extension.dir.get_child('prefs.js').query_exists(null))
return false;
return true;
},
_setExtensionInsensitive: function(layout, cell, model, iter, data) {
let uuid = model.get_value(iter, 0);
if (!this._extensionAvailable(uuid))
cell.set_sensitive(false);
},
_getExtensionPrefsModule: function(extension) {
let uuid = extension.metadata.uuid;
if (this._extensionPrefsModules.hasOwnProperty(uuid))
return this._extensionPrefsModules[uuid];
ExtensionUtils.installImporter(extension);
let prefsModule = extension.imports.prefs;
prefsModule.init(extension.metadata);
this._extensionPrefsModules[uuid] = prefsModule;
return prefsModule;
},
_selectExtension: function(uuid) {
if (!this._extensionAvailable(uuid))
return;
let extension = ExtensionUtils.extensions[uuid];
let widget;
try {
let prefsModule = this._getExtensionPrefsModule(extension);
widget = prefsModule.buildPrefsWidget();
} catch (e) {
widget = this._buildErrorUI(extension, e);
}
// Destroy the current prefs widget, if it exists
if (this._extensionPrefsBin.get_child())
this._extensionPrefsBin.get_child().destroy();
this._extensionPrefsBin.add(widget);
this._extensionSelector.set_active_iter(this._extensionIters[uuid]);
},
_extensionSelected: function() {
let [success, iter] = this._extensionSelector.get_active_iter();
if (!success)
return;
let uuid = this._model.get_value(iter, 0);
this._selectExtension(uuid);
},
_buildErrorUI: function(extension, exc) {
let box = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
let label = new Gtk.Label({
label: _("There was an error loading the preferences dialog for %s:").format(extension.metadata.name)
});
box.add(label);
let errortext = '';
errortext += exc;
errortext += '\n\n';
errortext += 'Stack trace:\n';
// Indent stack trace.
errortext += exc.stack.split('\n').map(function(line) {
return ' ' + line;
}).join('\n');
let scroll = new Gtk.ScrolledWindow({ vexpand: true });
let buffer = new Gtk.TextBuffer({ text: errortext });
let textview = new Gtk.TextView({ buffer: buffer });
textview.override_font(Pango.font_description_from_string('monospace'));
scroll.add(textview);
box.add(scroll);
box.show_all();
return box;
},
_buildUI: function(app) {
this._window = new Gtk.ApplicationWindow({ application: app,
window_position: Gtk.WindowPosition.CENTER,
title: _("GNOME Shell Extension Preferences") });
this._window.set_size_request(600, 400);
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
this._window.add(vbox);
let toolbar = new Gtk.Toolbar();
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR);
vbox.add(toolbar);
let toolitem;
let label = new Gtk.Label({ label: _("<b>Extension</b>"),
use_markup: true });
toolitem = new Gtk.ToolItem({ child: label });
toolbar.add(toolitem);
this._extensionSelector = new Gtk.ComboBox({ model: this._model,
margin_left: 8,
hexpand: true });
this._extensionSelector.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
let renderer = new Gtk.CellRendererText();
this._extensionSelector.pack_start(renderer, true);
this._extensionSelector.add_attribute(renderer, 'text', 1);
this._extensionSelector.set_cell_data_func(renderer, Lang.bind(this, this._setExtensionInsensitive), null);
this._extensionSelector.connect('changed', Lang.bind(this, this._extensionSelected));
toolitem = new Gtk.ToolItem({ child: this._extensionSelector });
toolitem.set_expand(true);
toolbar.add(toolitem);
this._extensionPrefsBin = new Gtk.Frame();
vbox.add(this._extensionPrefsBin);
let label = new Gtk.Label({
label: _("Select an extension to configure using the combobox above."),
vexpand: true
});
this._extensionPrefsBin.add(label);
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
if (ExtensionUtils.extensions[uuid] !== undefined)
this._scanExtensions();
}));
this._window.show_all();
},
_scanExtensions: function() {
ExtensionUtils.scanExtensions(Lang.bind(this, function(uuid, dir, type) {
if (ExtensionUtils.extensions[uuid] !== undefined)
return;
let extension;
try {
extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch(e) {
global.logError('' + e);
return;
}
let iter = this._model.append();
this._model.set(iter, [0, 1], [uuid, extension.metadata.name]);
this._extensionIters[uuid] = iter;
}));
},
_onActivate: function() {
this._window.present();
},
_onStartup: function(app) {
this._buildModel();
this._buildUI(app);
this._scanExtensions();
},
_onCommandLine: function(app, commandLine) {
app.activate();
let args = commandLine.get_arguments();
if (args.length) {
let uuid = args[0];
// Strip off "extension:///" prefix which fakes a URI, if it exists
uuid = stripPrefix(uuid, "extension:///");
if (!this._extensionAvailable(uuid))
return 1;
this._selectExtension(uuid);
}
return 0;
}
});
function initEnvironment() {
// Monkey-patch in a "global" object that fakes some Shell utilities
// that ExtensionUtils depends on.
window.global = {
log: function() {
print([].join.call(arguments, ', '));
},
logError: function(s) {
global.log('ERROR: ' + s);
},
userdatadir: GLib.build_filenamev([GLib.get_user_data_dir(), 'gnome-shell'])
};
String.prototype.format = Format.format;
}
function main(argv) {
initEnvironment();
ExtensionUtils.init();
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
Gettext.textdomain(Config.GETTEXT_PACKAGE);
let app = new Application();
app.application.run(argv);
}

View File

@ -10,3 +10,7 @@ const GJS_VERSION = '@GJS_VERSION@';
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@; const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;
/* The system TLS CA list */ /* The system TLS CA list */
const SHELL_SYSTEM_CA_FILE = '@SHELL_SYSTEM_CA_FILE@'; const SHELL_SYSTEM_CA_FILE = '@SHELL_SYSTEM_CA_FILE@';
/* gettext package */
const GETTEXT_PACKAGE = '@GETTEXT_PACKAGE@';
/* locale dir */
const LOCALEDIR = '@datadir@/locale';

194
js/misc/extensionUtils.js Normal file
View File

@ -0,0 +1,194 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
// Common utils for the extension system and the extension
// preferences tool
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const ShellJS = imports.gi.ShellJS;
const Config = imports.misc.config;
const ExtensionType = {
SYSTEM: 1,
PER_USER: 2
};
// GFile for user extensions
var userExtensionsDir = null;
// Maps uuid -> metadata object
const extensions = {};
function getCurrentExtension() {
let stack = (new Error()).stack;
// Assuming we're importing this directly from an extension (and we shouldn't
// ever not be), its UUID should be directly in the path here.
let extensionStackLine = stack.split('\n')[1];
if (!extensionStackLine)
throw new Error('Could not find current extension');
// The stack line is like:
// init([object Object])@/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
//
// In the case that we're importing from
// module scope, the first field is blank:
// @/home/user/data/gnome-shell/extensions/u@u.id/prefs.js:8
let match = new RegExp('@(.+):\\d+').exec(extensionStackLine);
if (!match)
throw new Error('Could not find current extension');
let path = match[1];
let uuid = GLib.path_get_basename(GLib.path_get_dirname(path));
let extension = extensions[uuid];
if (extension === undefined)
throw new Error('Could not find current extension');
return extension;
}
/**
* versionCheck:
* @required: an array of versions we're compatible with
* @current: the version we have
*
* Check if a component is compatible for an extension.
* @required is an array, and at least one version must match.
* @current must be in the format <major>.<minor>.<point>.<micro>
* <micro> is always ignored
* <point> is ignored if <minor> is even (so you can target the
* whole stable release)
* <minor> and <major> must match
* Each target version must be at least <major> and <minor>
*/
function versionCheck(required, current) {
let currentArray = current.split('.');
let major = currentArray[0];
let minor = currentArray[1];
let point = currentArray[2];
for (let i = 0; i < required.length; i++) {
let requiredArray = required[i].split('.');
if (requiredArray[0] == major &&
requiredArray[1] == minor &&
(requiredArray[2] == point ||
(requiredArray[2] == undefined && parseInt(minor) % 2 == 0)))
return true;
}
return false;
}
function isOutOfDate(extension) {
if (!versionCheck(extension.metadata['shell-version'], Config.PACKAGE_VERSION))
return true;
if (extension.metadata['js-version'] && !versionCheck(extension.metadata['js-version'], Config.GJS_VERSION))
return true;
return false;
}
function createExtensionObject(uuid, dir, type) {
let info;
let metadataFile = dir.get_child('metadata.json');
if (!metadataFile.query_exists(null)) {
throw new Error('Missing metadata.json');
}
let metadataContents, success, tag;
try {
[success, metadataContents, tag] = metadataFile.load_contents(null);
} catch (e) {
throw new Error('Failed to load metadata.json: ' + e);
}
let meta;
try {
meta = JSON.parse(metadataContents);
} catch (e) {
throw new Error('Failed to parse metadata.json: ' + e);
}
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
for (let i = 0; i < requiredProperties.length; i++) {
let prop = requiredProperties[i];
if (!meta[prop]) {
throw new Error('missing "' + prop + '" property in metadata.json');
}
}
// Encourage people to add this
if (!meta.url) {
global.log('Warning: Missing "url" property in metadata.json');
}
if (uuid != meta.uuid) {
throw new Error('uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
}
let extension = {};
extension.metadata = meta;
extension.uuid = meta.uuid;
extension.type = type;
extension.dir = dir;
extension.path = dir.get_path();
extension.error = '';
extension.hasPrefs = dir.get_child('prefs.js').query_exists(null);
extensions[uuid] = extension;
return extension;
}
var _extension = null;
function installImporter(extension) {
_extension = extension;
ShellJS.add_extension_importer('imports.misc.extensionUtils._extension', 'imports', extension.path);
_extension = null;
}
function init() {
let userExtensionsPath = GLib.build_filenamev([global.userdatadir, 'extensions']);
userExtensionsDir = Gio.file_new_for_path(userExtensionsPath);
try {
if (!userExtensionsDir.query_exists(null))
userExtensionsDir.make_directory_with_parents(null);
} catch (e) {
global.logError('' + e);
}
}
function scanExtensionsInDirectory(callback, dir, type) {
let fileEnum;
let file, info;
try {
fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
} catch(e) {
global.logError('' + e);
return;
}
while ((info = fileEnum.next_file(null)) != null) {
let fileType = info.get_file_type();
if (fileType != Gio.FileType.DIRECTORY)
continue;
let uuid = info.get_name();
let extensionDir = dir.get_child(uuid);
callback(uuid, extensionDir, type);
}
fileEnum.close(null);
}
function scanExtensions(callback) {
let systemDataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < systemDataDirs.length; i++) {
let dirPath = GLib.build_filenamev([systemDataDirs[i], 'gnome-shell', 'extensions']);
let dir = Gio.file_new_for_path(dirPath);
if (dir.query_exists(null))
scanExtensionsInDirectory(callback, dir, ExtensionType.SYSTEM);
}
scanExtensionsInDirectory(callback, userExtensionsDir, ExtensionType.PER_USER);
}

View File

@ -165,7 +165,7 @@ const ModemCdma = new Lang.Class({
this.signal_quality = 0; this.signal_quality = 0;
this.operator_name = null; this.operator_name = null;
this._proxy.connect('SignalQuality', Lang.bind(this, function(proxy, sender, params) { this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) {
this.signal_quality = params[0]; this.signal_quality = params[0];
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');

View File

@ -43,7 +43,7 @@ function ConsoleKitManager() {
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START | g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
self.connect('notify::g-name-owner', function() { self._updateSessionActive = function() {
if (self.g_name_owner) { if (self.g_name_owner) {
self.GetCurrentSessionRemote(function([session]) { self.GetCurrentSessionRemote(function([session]) {
self._ckSession = new ConsoleKitSessionProxy(Gio.DBus.system, 'org.freedesktop.ConsoleKit', session); self._ckSession = new ConsoleKitSessionProxy(Gio.DBus.system, 'org.freedesktop.ConsoleKit', session);
@ -58,8 +58,11 @@ function ConsoleKitManager() {
} else { } else {
self.sessionActive = true; self.sessionActive = true;
} }
}); };
self.connect('notify::g-name-owner',
Lang.bind(self, self._updateSessionActive));
self._updateSessionActive();
self.init(null); self.init(null);
return self; return self;
} }

View File

@ -93,23 +93,30 @@ const Contact = new Lang.Class({
text = _("Busy"); text = _("Busy");
iconName = 'user-busy'; iconName = 'user-busy';
break; break;
default: case Folks.PresenceType.OFFLINE:
text = _("Offline"); text = _("Offline");
iconName = 'user-offline'; iconName = 'user-offline';
break;
default:
text = '';
iconName = null;
} }
let icon = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.FULLCOLOR,
icon_size: 16,
style_class: 'contact-details-status-icon' });
let label = new St.Label({ text: text });
let box = new St.BoxLayout({ vertical: false, let box = new St.BoxLayout({ vertical: false,
style_class: 'contact-details-status' }); style_class: 'contact-details-status' });
box.add(icon, { x_fill: true,
y_fill: false, if (iconName) {
x_align: St.Align.START, let icon = new St.Icon({ icon_name: iconName,
y_align: St.Align.START }); icon_type: St.IconType.FULLCOLOR,
icon_size: 16,
style_class: 'contact-details-status-icon' });
box.add(icon, { x_fill: true,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
}
let label = new St.Label({ text: text });
box.add(label, { x_fill: true, box.add(label, { x_fill: true,
y_fill: false, y_fill: false,

View File

@ -501,7 +501,7 @@ const Dash = new Lang.Class({
return; return;
let themeNode = this.actor.get_theme_node(); let themeNode = this._box.get_theme_node();
let maxAllocation = new Clutter.ActorBox({ x1: 0, y1: 0, let maxAllocation = new Clutter.ActorBox({ x1: 0, y1: 0,
x2: 42 /* whatever */, x2: 42 /* whatever */,
y2: this._maxHeight }); y2: this._maxHeight });

View File

@ -69,6 +69,7 @@ const DateMenuButton = new Lang.Class({
// Date // Date
this._date = new St.Label(); this._date = new St.Label();
this.actor.label_actor = this._date;
this._date.style_class = 'datemenu-date-label'; this._date.style_class = 'datemenu-date-label';
vbox.add(this._date); vbox.add(this._date);

View File

@ -11,6 +11,7 @@ const Shell = imports.gi.Shell;
const Soup = imports.gi.Soup; const Soup = imports.gi.Soup;
const Config = imports.misc.config; const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils; const FileUtils = imports.misc.fileUtils;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
@ -29,11 +30,6 @@ const ExtensionState = {
UNINSTALLED: 99 UNINSTALLED: 99
}; };
const ExtensionType = {
SYSTEM: 1,
PER_USER: 2
};
const REPOSITORY_URL_BASE = 'https://extensions.gnome.org'; const REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip'; const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/'; const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
@ -57,19 +53,10 @@ function _getCertFile() {
_httpSession.ssl_ca_file = _getCertFile(); _httpSession.ssl_ca_file = _getCertFile();
// Maps uuid -> metadata object
const extensionMeta = {};
// Maps uuid -> importer object (extension directory tree)
const extensions = {};
// Maps uuid -> extension state object (returned from init())
const extensionStateObjs = {};
// Contains the order that extensions were enabled in.
const extensionOrder = [];
// Arrays of uuids // Arrays of uuids
var enabledExtensions; var enabledExtensions;
// GFile for user extensions // Contains the order that extensions were enabled in.
var userExtensionsDir = null; const extensionOrder = [];
// We don't really have a class to add signals on. So, create // We don't really have a class to add signals on. So, create
// a simple dummy object, add the signal methods, and export those // a simple dummy object, add the signal methods, and export those
@ -80,41 +67,8 @@ Signals.addSignalMethods(_signals);
const connect = Lang.bind(_signals, _signals.connect); const connect = Lang.bind(_signals, _signals.connect);
const disconnect = Lang.bind(_signals, _signals.disconnect); const disconnect = Lang.bind(_signals, _signals.disconnect);
// UUID => Array of error messages
var errors = {};
const ENABLED_EXTENSIONS_KEY = 'enabled-extensions'; const ENABLED_EXTENSIONS_KEY = 'enabled-extensions';
/**
* versionCheck:
* @required: an array of versions we're compatible with
* @current: the version we have
*
* Check if a component is compatible for an extension.
* @required is an array, and at least one version must match.
* @current must be in the format <major>.<minor>.<point>.<micro>
* <micro> is always ignored
* <point> is ignored if <minor> is even (so you can target the
* whole stable release)
* <minor> and <major> must match
* Each target version must be at least <major> and <minor>
*/
function versionCheck(required, current) {
let currentArray = current.split('.');
let major = currentArray[0];
let minor = currentArray[1];
let point = currentArray[2];
for (let i = 0; i < required.length; i++) {
let requiredArray = required[i].split('.');
if (requiredArray[0] == major &&
requiredArray[1] == minor &&
(requiredArray[2] == point ||
(requiredArray[2] == undefined && parseInt(minor) % 2 == 0)))
return true;
}
return false;
}
function installExtensionFromUUID(uuid, version_tag) { function installExtensionFromUUID(uuid, version_tag) {
let params = { uuid: uuid, let params = { uuid: uuid,
version_tag: version_tag, version_tag: version_tag,
@ -132,8 +86,8 @@ function installExtensionFromUUID(uuid, version_tag) {
} }
function uninstallExtensionFromUUID(uuid) { function uninstallExtensionFromUUID(uuid) {
let meta = extensionMeta[uuid]; let extension = ExtensionUtils.extensions[uuid];
if (!meta) if (!extension)
return false; return false;
// Try to disable it -- if it's ERROR'd, we can't guarantee that, // Try to disable it -- if it's ERROR'd, we can't guarantee that,
@ -142,22 +96,17 @@ function uninstallExtensionFromUUID(uuid) {
disableExtension(uuid); disableExtension(uuid);
// Don't try to uninstall system extensions // Don't try to uninstall system extensions
if (meta.type != ExtensionType.PER_USER) if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
return false; return false;
meta.state = ExtensionState.UNINSTALLED; extension.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', meta); _signals.emit('extension-state-changed', extension);
delete extensionMeta[uuid];
// Importers are marked as PERMANENT, so we can't do this.
// delete extensions[uuid];
extensions[uuid] = undefined;
delete ExtensionUtils.extensions[uuid];
delete extensionStateObjs[uuid]; delete extensionStateObjs[uuid];
delete errors[uuid]; delete errors[uuid];
FileUtils.recursivelyDeleteDir(Gio.file_new_for_path(meta.path)); FileUtils.recursivelyDeleteDir(Gio.file_new_for_path(extension.path));
return true; return true;
} }
@ -178,7 +127,7 @@ function gotExtensionZipFile(session, message, uuid) {
} }
let stream = new Gio.UnixOutputStream({ fd: fd }); let stream = new Gio.UnixOutputStream({ fd: fd });
let dir = userExtensionsDir.get_child(uuid); let dir = ExtensionUtils.userExtensionsDir.get_child(uuid);
Shell.write_soup_message_to_stream(stream, message); Shell.write_soup_message_to_stream(stream, message);
stream.close(null); stream.close(null);
let [success, pid] = GLib.spawn_async(null, let [success, pid] = GLib.spawn_async(null,
@ -202,16 +151,16 @@ function gotExtensionZipFile(session, message, uuid) {
global.settings.set_strv(ENABLED_EXTENSIONS_KEY, enabledExtensions); global.settings.set_strv(ENABLED_EXTENSIONS_KEY, enabledExtensions);
} }
loadExtension(dir, ExtensionType.PER_USER, true); loadExtension(dir, ExtensionUtils.ExtensionType.PER_USER, true);
}); });
} }
function disableExtension(uuid) { function disableExtension(uuid) {
let meta = extensionMeta[uuid]; let extension = ExtensionUtils.extensions[uuid];
if (!meta) if (!extension)
return; return;
if (meta.state != ExtensionState.ENABLED) if (extension.state != ExtensionState.ENABLED)
return; return;
let extensionState = extensionStateObjs[uuid]; let extensionState = extensionStateObjs[uuid];
@ -255,41 +204,45 @@ function disableExtension(uuid) {
extensionOrder.splice(orderIdx, 1); extensionOrder.splice(orderIdx, 1);
meta.state = ExtensionState.DISABLED; extension.state = ExtensionState.DISABLED;
_signals.emit('extension-state-changed', meta); _signals.emit('extension-state-changed', extension);
} }
function enableExtension(uuid) { function enableExtension(uuid) {
let meta = extensionMeta[uuid]; let extension = ExtensionUtils.extensions[uuid];
if (!meta) if (!extension)
return; return;
if (meta.state == ExtensionState.INITIALIZED) { if (extension.state == ExtensionState.INITIALIZED) {
loadExtension(meta.dir, meta.type, true); loadExtension(extension.dir, extension.type, true);
return; return;
} }
if (meta.state != ExtensionState.DISABLED) if (extension.state != ExtensionState.DISABLED)
return; return;
let extensionState = extensionStateObjs[uuid];
extensionOrder.push(uuid); extensionOrder.push(uuid);
try { try {
extensionState.enable(); extension.stateObj.enable();
} catch(e) { } catch(e) {
logExtensionError(uuid, e.toString()); logExtensionError(uuid, e.toString());
return; return;
} }
meta.state = ExtensionState.ENABLED; extension.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', meta); _signals.emit('extension-state-changed', extension);
} }
function logExtensionError(uuid, message, state) { function logExtensionError(uuid, message, state) {
if (!errors[uuid]) errors[uuid] = []; let extension = ExtensionUtils.extensions[uuid];
errors[uuid].push(message); if (!extension)
return;
if (!extension.errors)
extension.errors = [];
extension.errors.push(message);
global.logError('Extension "%s" had error: %s'.format(uuid, message)); global.logError('Extension "%s" had error: %s'.format(uuid, message));
state = state || ExtensionState.ERROR; state = state || ExtensionState.ERROR;
_signals.emit('extension-state-changed', { uuid: uuid, _signals.emit('extension-state-changed', { uuid: uuid,
@ -298,72 +251,31 @@ function logExtensionError(uuid, message, state) {
} }
function loadExtension(dir, type, enabled) { function loadExtension(dir, type, enabled) {
let info;
let uuid = dir.get_basename(); let uuid = dir.get_basename();
let extension;
let metadataFile = dir.get_child('metadata.json'); if (ExtensionUtils.extensions[uuid] != undefined) {
if (!metadataFile.query_exists(null)) { throw new Error('extension already loaded');
logExtensionError(uuid, 'Missing metadata.json');
return;
} }
let metadataContents;
try { try {
metadataContents = Shell.get_file_contents_utf8_sync(metadataFile.get_path()); extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch (e) { } catch(e) {
logExtensionError(uuid, 'Failed to load metadata.json: ' + e); logExtensionError(uuid, e.message);
return; return;
} }
let meta;
try {
meta = JSON.parse(metadataContents);
} catch (e) {
logExtensionError(uuid, 'Failed to parse metadata.json: ' + e);
return;
}
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
for (let i = 0; i < requiredProperties.length; i++) {
let prop = requiredProperties[i];
if (!meta[prop]) {
logExtensionError(uuid, 'missing "' + prop + '" property in metadata.json');
return;
}
}
if (extensions[uuid] != undefined) {
logExtensionError(uuid, 'extension already loaded');
return;
}
// Encourage people to add this
if (!meta['url']) {
global.log('Warning: Missing "url" property in metadata.json');
}
if (uuid != meta.uuid) {
logExtensionError(uuid, 'uuid "' + meta.uuid + '" from metadata.json does not match directory name "' + uuid + '"');
return;
}
extensionMeta[uuid] = meta;
meta.type = type;
meta.dir = dir;
meta.path = dir.get_path();
meta.error = '';
// Default to error, we set success as the last step // Default to error, we set success as the last step
meta.state = ExtensionState.ERROR; extension.state = ExtensionState.ERROR;
if (!versionCheck(meta['shell-version'], Config.PACKAGE_VERSION) || if (ExtensionUtils.isOutOfDate(extension)) {
(meta['js-version'] && !versionCheck(meta['js-version'], Config.GJS_VERSION))) {
logExtensionError(uuid, 'extension is not compatible with current GNOME Shell and/or GJS version', ExtensionState.OUT_OF_DATE); logExtensionError(uuid, 'extension is not compatible with current GNOME Shell and/or GJS version', ExtensionState.OUT_OF_DATE);
meta.state = ExtensionState.OUT_OF_DATE; extension.state = ExtensionState.OUT_OF_DATE;
return; return;
} }
if (!enabled) { if (!enabled) {
meta.state = ExtensionState.INITIALIZED; extension.state = ExtensionState.INITIALIZED;
return; return;
} }
@ -388,12 +300,12 @@ function loadExtension(dir, type, enabled) {
let extensionModule; let extensionModule;
let extensionState = null; let extensionState = null;
try { try {
global.add_extension_importer('imports.ui.extensionSystem.extensions', meta.uuid, dir.get_path()); ExtensionUtils.installImporter(extension);
extensionModule = extensions[meta.uuid].extension; extensionModule = extension.imports.extension;
} catch (e) { } catch (e) {
if (stylesheetPath != null) if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath); theme.unload_stylesheet(stylesheetPath);
logExtensionError(uuid, e); logExtensionError(uuid, '' + e);
return; return;
} }
@ -403,7 +315,7 @@ function loadExtension(dir, type, enabled) {
} }
try { try {
extensionState = extensionModule.init(meta); extensionState = extensionModule.init(extension);
} catch (e) { } catch (e) {
if (stylesheetPath != null) if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath); theme.unload_stylesheet(stylesheetPath);
@ -413,7 +325,7 @@ function loadExtension(dir, type, enabled) {
if (!extensionState) if (!extensionState)
extensionState = extensionModule; extensionState = extensionModule;
extensionStateObjs[uuid] = extensionState; extension.stateObj = extensionState;
if (!extensionState.enable) { if (!extensionState.enable) {
logExtensionError(uuid, 'missing \'enable\' function'); logExtensionError(uuid, 'missing \'enable\' function');
@ -424,13 +336,13 @@ function loadExtension(dir, type, enabled) {
return; return;
} }
meta.state = ExtensionState.DISABLED; extension.state = ExtensionState.DISABLED;
enableExtension(uuid); enableExtension(uuid);
_signals.emit('extension-loaded', meta.uuid); _signals.emit('extension-loaded', uuid);
_signals.emit('extension-state-changed', meta); _signals.emit('extension-state-changed', extension);
global.log('Loaded extension ' + meta.uuid); global.log('Loaded extension ' + uuid);
} }
function onEnabledExtensionsChanged() { function onEnabledExtensionsChanged() {
@ -456,50 +368,17 @@ function onEnabledExtensionsChanged() {
} }
function init() { function init() {
let userExtensionsPath = GLib.build_filenamev([global.userdatadir, 'extensions']); ExtensionUtils.init();
userExtensionsDir = Gio.file_new_for_path(userExtensionsPath);
try {
if (!userExtensionsDir.query_exists(null))
userExtensionsDir.make_directory_with_parents(null);
} catch (e) {
global.logError('' + e);
}
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged); global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY); enabledExtensions = global.settings.get_strv(ENABLED_EXTENSIONS_KEY);
} }
function _loadExtensionsIn(dir, type) {
let fileEnum;
let file, info;
try {
fileEnum = dir.enumerate_children('standard::*', Gio.FileQueryInfoFlags.NONE, null);
} catch (e) {
global.logError('' + e);
return;
}
while ((info = fileEnum.next_file(null)) != null) {
let fileType = info.get_file_type();
if (fileType != Gio.FileType.DIRECTORY)
continue;
let name = info.get_name();
let child = dir.get_child(name);
let enabled = enabledExtensions.indexOf(name) != -1;
loadExtension(child, type, enabled);
}
fileEnum.close(null);
}
function loadExtensions() { function loadExtensions() {
let systemDataDirs = GLib.get_system_data_dirs(); ExtensionUtils.scanExtensions(function(uuid, dir, type) {
for (let i = 0; i < systemDataDirs.length; i++) { let enabled = enabledExtensions.indexOf(uuid) != -1;
let dirPath = systemDataDirs[i] + '/gnome-shell/extensions'; loadExtension(dir, type, enabled);
let dir = Gio.file_new_for_path(dirPath); });
if (dir.query_exists(null))
_loadExtensionsIn(dir, ExtensionType.SYSTEM);
}
_loadExtensionsIn(userExtensionsDir, ExtensionType.PER_USER);
} }
const InstallExtensionDialog = new Lang.Class({ const InstallExtensionDialog = new Lang.Class({
@ -545,13 +424,13 @@ const InstallExtensionDialog = new Lang.Class({
}, },
_onInstallButtonPressed: function(button, event) { _onInstallButtonPressed: function(button, event) {
let meta = { uuid: this._uuid, let extension = { uuid: this._uuid,
state: ExtensionState.DOWNLOADING, state: ExtensionState.DOWNLOADING,
error: '' }; error: '' };
extensionMeta[this._uuid] = meta; ExtensionUtils.extensions[this._uuid] = extension;
_signals.emit('extension-state-changed', meta); _signals.emit('extension-state-changed', extension);
let params = { version_tag: this._version_tag, let params = { version_tag: this._version_tag,
shell_version: Config.PACKAGE_VERSION, shell_version: Config.PACKAGE_VERSION,

45
js/ui/flashspot.js Normal file
View File

@ -0,0 +1,45 @@
// -*- 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

@ -305,7 +305,7 @@ const IconGrid = new Lang.Class({
_onStyleChanged: function() { _onStyleChanged: function() {
let themeNode = this.actor.get_theme_node(); let themeNode = this.actor.get_theme_node();
this._spacing = themeNode.get_length('spacing'); this._spacing = themeNode.get_length('spacing');
this._item_size = themeNode.get_length('-shell-grid-item-size'); this._item_size = themeNode.get_length('-shell-grid-item-size') || ICON_SIZE;
this._grid.queue_relayout(); this._grid.queue_relayout();
}, },

View File

@ -15,6 +15,7 @@ const Mainloop = imports.mainloop;
const History = imports.misc.history; const History = imports.misc.history;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionUtils = imports.misc.extensionUtils;
const Link = imports.ui.link; const Link = imports.ui.link;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
@ -728,7 +729,7 @@ const Extensions = new Lang.Class({
this._extensionsList.add(this._noExtensions); this._extensionsList.add(this._noExtensions);
this.actor.add(this._extensionsList); this.actor.add(this._extensionsList);
for (let uuid in ExtensionSystem.extensionMeta) for (let uuid in ExtensionUtils.extensions)
this._loadExtension(null, uuid); this._loadExtension(null, uuid);
ExtensionSystem.connect('extension-loaded', ExtensionSystem.connect('extension-loaded',
@ -736,10 +737,10 @@ const Extensions = new Lang.Class({
}, },
_loadExtension: function(o, uuid) { _loadExtension: function(o, uuid) {
let extension = ExtensionSystem.extensionMeta[uuid]; let extension = ExtensionUtils.extensions[uuid];
// There can be cases where we create dummy extension metadata // There can be cases where we create dummy extension metadata
// that's not really a proper extension. Don't bother with these. // that's not really a proper extension. Don't bother with these.
if (!extension.name) if (!extension.metadata.name)
return; return;
let extensionDisplay = this._createExtensionDisplay(extension); let extensionDisplay = this._createExtensionDisplay(extension);
@ -751,25 +752,24 @@ const Extensions = new Lang.Class({
}, },
_onViewSource: function (actor) { _onViewSource: function (actor) {
let meta = actor._extensionMeta; let extension = actor._extension;
let file = Gio.file_new_for_path(meta.path); let uri = extension.dir.get_uri();
let uri = file.get_uri();
Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context()); Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context());
Main.lookingGlass.close(); Main.lookingGlass.close();
}, },
_onWebPage: function (actor) { _onWebPage: function (actor) {
let meta = actor._extensionMeta; let extension = actor._extension;
Gio.app_info_launch_default_for_uri(meta.url, global.create_app_launch_context()); Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context());
Main.lookingGlass.close(); Main.lookingGlass.close();
}, },
_onViewErrors: function (actor) { _onViewErrors: function (actor) {
let meta = actor._extensionMeta; let extension = actor._extension;
let shouldShow = !actor._isShowing; let shouldShow = !actor._isShowing;
if (shouldShow) { if (shouldShow) {
let errors = ExtensionSystem.errors[meta.uuid]; let errors = extension.errors;
let errorDisplay = new St.BoxLayout({ vertical: true }); let errorDisplay = new St.BoxLayout({ vertical: true });
if (errors && errors.length) { if (errors && errors.length) {
for (let i = 0; i < errors.length; i ++) for (let i = 0; i < errors.length; i ++)
@ -809,36 +809,36 @@ const Extensions = new Lang.Class({
return 'Unknown'; // Not translated, shouldn't appear return 'Unknown'; // Not translated, shouldn't appear
}, },
_createExtensionDisplay: function(meta) { _createExtensionDisplay: function(extension) {
let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true }); let box = new St.BoxLayout({ style_class: 'lg-extension', vertical: true });
let name = new St.Label({ style_class: 'lg-extension-name', let name = new St.Label({ style_class: 'lg-extension-name',
text: meta.name }); text: extension.metadata.name });
box.add(name, { expand: true }); box.add(name, { expand: true });
let description = new St.Label({ style_class: 'lg-extension-description', let description = new St.Label({ style_class: 'lg-extension-description',
text: meta.description || 'No description' }); text: extension.metadata.description || 'No description' });
box.add(description, { expand: true }); box.add(description, { expand: true });
let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' }); let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
box.add(metaBox); box.add(metaBox);
let stateString = this._stateToString(meta.state); let stateString = this._stateToString(extension.state);
let state = new St.Label({ style_class: 'lg-extension-state', let state = new St.Label({ style_class: 'lg-extension-state',
text: this._stateToString(meta.state) }); text: this._stateToString(extension.state) });
metaBox.add(state); metaBox.add(state);
let viewsource = new Link.Link({ label: _("View Source") }); let viewsource = new Link.Link({ label: _("View Source") });
viewsource.actor._extensionMeta = meta; viewsource.actor._extension = extension;
viewsource.actor.connect('clicked', Lang.bind(this, this._onViewSource)); viewsource.actor.connect('clicked', Lang.bind(this, this._onViewSource));
metaBox.add(viewsource.actor); metaBox.add(viewsource.actor);
if (meta.url) { if (extension.metadata.url) {
let webpage = new Link.Link({ label: _("Web Page") }); let webpage = new Link.Link({ label: _("Web Page") });
webpage.actor._extensionMeta = meta; webpage.actor._extension = extension;
webpage.actor.connect('clicked', Lang.bind(this, this._onWebPage)); webpage.actor.connect('clicked', Lang.bind(this, this._onWebPage));
metaBox.add(webpage.actor); metaBox.add(webpage.actor);
} }
let viewerrors = new Link.Link({ label: _("Show Errors") }); let viewerrors = new Link.Link({ label: _("Show Errors") });
viewerrors.actor._extensionMeta = meta; viewerrors.actor._extension = extension;
viewerrors.actor._parentBox = box; viewerrors.actor._parentBox = box;
viewerrors.actor._isShowing = false; viewerrors.actor._isShowing = false;
viewerrors.actor.connect('clicked', Lang.bind(this, this._onViewErrors)); viewerrors.actor.connect('clicked', Lang.bind(this, this._onViewErrors));

View File

@ -556,6 +556,7 @@ const ZoomRegion = new Lang.Class({
this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN; this._screenPosition = GDesktopEnums.MagnifierScreenPosition.FULL_SCREEN;
this._magView = null; this._magView = null;
this._background = null;
this._uiGroupClone = null; this._uiGroupClone = null;
this._mouseSourceActor = mouseSourceActor; this._mouseSourceActor = mouseSourceActor;
this._mouseActor = null; this._mouseActor = null;
@ -565,12 +566,15 @@ const ZoomRegion = new Lang.Class({
this._viewPortX = 0; this._viewPortX = 0;
this._viewPortY = 0; this._viewPortY = 0;
this._viewPortWidth = global.screen_width; this._viewPortWidth = global.screen_width;
this._viewPortWidth = global.screen_height; this._viewPortHeight = global.screen_height;
this._xCenter = this._viewPortWidth / 2; this._xCenter = this._viewPortWidth / 2;
this._yCenter = this._viewPortHeight / 2; this._yCenter = this._viewPortHeight / 2;
this._xMagFactor = 1; this._xMagFactor = 1;
this._yMagFactor = 1; this._yMagFactor = 1;
this._followingCursor = false; this._followingCursor = false;
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
}, },
/** /**
@ -891,15 +895,15 @@ const ZoomRegion = new Lang.Class({
// Add a background for when the magnified uiGroup is scrolled // Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through). // out of view (don't want to see desktop showing through).
let background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR }); this._background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
mainGroup.add_actor(background); mainGroup.add_actor(this._background);
// Clone the group that contains all of UI on the screen. This is the // Clone the group that contains all of UI on the screen. This is the
// chrome, the windows, etc. // chrome, the windows, etc.
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup }); this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
mainGroup.add_actor(this._uiGroupClone); mainGroup.add_actor(this._uiGroupClone);
Main.uiGroup.set_size(global.screen_width, global.screen_height); Main.uiGroup.set_size(global.screen_width, global.screen_height);
background.set_size(global.screen_width, global.screen_height); this._background.set_size(global.screen_width, global.screen_height);
// Add either the given mouseSourceActor to the ZoomRegion, or a clone of // Add either the given mouseSourceActor to the ZoomRegion, or a clone of
// it. // it.
@ -923,6 +927,7 @@ const ZoomRegion = new Lang.Class({
this._magView.destroy(); this._magView.destroy();
this._magView = null; this._magView = null;
this._background = null;
this._uiGroupClone = null; this._uiGroupClone = null;
this._mouseActor = null; this._mouseActor = null;
this._crossHairsActor = null; this._crossHairsActor = null;
@ -1145,6 +1150,22 @@ const ZoomRegion = new Lang.Class({
this._crossHairsActor.set_position(xMagMouse - groupWidth / 2, this._crossHairsActor.set_position(xMagMouse - groupWidth / 2,
yMagMouse - groupHeight / 2); yMagMouse - groupHeight / 2);
} }
},
_monitorsChanged: function() {
if (!this.isActive())
return;
Main.uiGroup.set_size(global.screen_width, global.screen_height);
this._background.set_size(global.screen_width, global.screen_height);
if (this._screenPosition == GDesktopEnums.MagnifierScreenPosition.NONE)
this._setViewPort({ x: this._viewPortX,
y: this._viewPortY,
width: this._viewPortWidth,
height: this._viewPortHeight });
else
this.setScreenPosition(this._screenPosition);
} }
}); });
@ -1175,6 +1196,14 @@ const Crosshairs = new Lang.Class({
this._clipSize = [0, 0]; this._clipSize = [0, 0];
this._clones = []; this._clones = [];
this.reCenter(); this.reCenter();
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged));
},
_monitorsChanged: function() {
this._actor.set_size(global.screen_width * 3, global.screen_height * 3);
this.reCenter();
}, },
/** /**

View File

@ -2048,8 +2048,11 @@ const MessageTray = new Lang.Class({
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer && !requestedNotificationStackIsEmpty) if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer && !requestedNotificationStackIsEmpty)
this._showSummaryBoxPointer(); this._showSummaryBoxPointer();
} else if (this._summaryBoxPointerState == State.SHOWN) { } else if (this._summaryBoxPointerState == State.SHOWN) {
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary) if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary) {
this._hideSummaryBoxPointer(); this._hideSummaryBoxPointer();
if (wrongSummaryBoxPointer)
this._showSummaryBoxPointer();
}
} }
// Tray itself // Tray itself
@ -2390,9 +2393,8 @@ const MessageTray = new Lang.Class({
} }
this._summaryBoxPointerState = State.HIDING; this._summaryBoxPointerState = State.HIDING;
// Unset this._clickedSummaryItem if we are no longer showing the summary or if // Unset this._clickedSummaryItem if we are no longer showing the summary
// this._clickedSummaryItem is still the item associated with the currently showing box pointer if (this._summaryState != State.SHOWN)
if (this._summaryState != State.SHOWN || this._summaryBoxPointerItem == this._clickedSummaryItem)
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
this._focusGrabber.ungrabFocus(); this._focusGrabber.ungrabFocus();

View File

@ -237,7 +237,7 @@ const AppMenuButton = new Lang.Class({
Extends: PanelMenu.Button, Extends: PanelMenu.Button,
_init: function(menuManager) { _init: function(menuManager) {
this.parent(0.0, true); this.parent(0.0, null, true);
this._startingApps = []; this._startingApps = [];
@ -249,6 +249,7 @@ const AppMenuButton = new Lang.Class({
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
this.actor.add_actor(bin); this.actor.add_actor(bin);
this.actor.bind_property("reactive", this.actor, "can-focus", 0);
this.actor.reactive = false; this.actor.reactive = false;
this._targetIsCurrent = false; this._targetIsCurrent = false;
@ -497,6 +498,9 @@ const AppMenuButton = new Lang.Class({
return; return;
} }
if (!targetApp.is_on_workspace(workspace))
return;
if (!this._targetIsCurrent) { if (!this._targetIsCurrent) {
this.actor.reactive = true; this.actor.reactive = true;
this._targetIsCurrent = true; this._targetIsCurrent = true;
@ -537,6 +541,7 @@ const AppMenuButton = new Lang.Class({
let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE); let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._label.setText(targetApp.get_name()); this._label.setText(targetApp.get_name());
this.setName(targetApp.get_name());
this._iconBox.set_child(icon); this._iconBox.set_child(icon);
this._iconBox.show(); this._iconBox.show();

View File

@ -96,7 +96,7 @@ const Button = new Lang.Class({
Name: 'PanelMenuButton', Name: 'PanelMenuButton',
Extends: ButtonBox, Extends: ButtonBox,
_init: function(menuAlignment, dontCreateMenu) { _init: function(menuAlignment, nameText, dontCreateMenu) {
this.parent({ reactive: true, this.parent({ reactive: true,
can_focus: true, can_focus: true,
track_hover: true }); track_hover: true });
@ -108,6 +108,24 @@ const Button = new Lang.Class({
this.menu = null; this.menu = null;
else else
this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0)); this.setMenu(new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0));
this.setName(nameText);
},
setName: function(text) {
if (text != null) {
// This is the easiest way to provide a accessible name to
// this widget. The label could be also used for other
// purposes in the future.
if (!this.label) {
this.label = new St.Label({ text: text });
this.actor.label_actor = this.label;
} else
this.label.text = text;
} else {
this.label = null;
this.actor.label_actor = null;
}
}, },
setMenu: function(menu) { setMenu: function(menu) {
@ -203,8 +221,8 @@ const SystemStatusButton = new Lang.Class({
Name: 'SystemStatusButton', Name: 'SystemStatusButton',
Extends: Button, Extends: Button,
_init: function(iconName,tooltipText) { _init: function(iconName, tooltipText, nameText) {
this.parent(0.0); this.parent(0.0, nameText);
this._iconActor = new St.Icon({ icon_name: iconName, this._iconActor = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC, icon_type: St.IconType.SYMBOLIC,

View File

@ -157,8 +157,8 @@ const PlacesManager = new Lang.Class({
function (size) { function (size) {
// do NOT use St.Icon here, it crashes the shell // do NOT use St.Icon here, it crashes the shell
// see wanda.js for details // see wanda.js for details
return St.TextureCache.get_default().load_icon_name('applications-internet', return St.TextureCache.get_default().load_icon_name(null,
null, 'applications-internet',
St.IconType.FULLCOLOR, St.IconType.FULLCOLOR,
size); size);
}, },

View File

@ -389,6 +389,7 @@ const PopupMenuItem = new Lang.Class({
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.addActor(this.label); this.addActor(this.label);
this.actor.label_actor = this.label
} }
}); });
@ -773,6 +774,12 @@ const PopupSwitchMenuItem = new Lang.Class({
this.toggle(); this.toggle();
} }
// we allow pressing space to toggle the switch
// without closing the menu
if (event.type() == Clutter.EventType.KEY_PRESS &&
event.get_key_symbol() == Clutter.KEY_space)
return;
this.parent(event); this.parent(event);
}, },
@ -869,6 +876,10 @@ const PopupMenuBase = new Lang.Class({
return menuItem; return menuItem;
}, },
isEmpty: function() {
return this.box.get_children().length == 0;
},
isChildMenu: function(menu) { isChildMenu: function(menu) {
return this._childMenus.indexOf(menu) != -1; return this._childMenus.indexOf(menu) != -1;
}, },
@ -1194,6 +1205,9 @@ const PopupMenu = new Lang.Class({
if (this.isOpen) if (this.isOpen)
return; return;
if (this.isEmpty())
return;
this.isOpen = true; this.isOpen = true;
this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment); this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment);
@ -1285,6 +1299,9 @@ const PopupSubMenu = new Lang.Class({
if (this.isOpen) if (this.isOpen)
return; return;
if (this.isEmpty())
return;
this.isOpen = true; this.isOpen = true;
this.actor.show(); this.actor.show();
@ -1428,6 +1445,7 @@ const PopupSubMenuMenuItem = new Lang.Class({
this.label = new St.Label({ text: text }); this.label = new St.Label({ text: text });
this.addActor(this.label); this.addActor(this.label);
this.actor.label_actor = this.label;
this._triangle = new St.Label({ text: '\u25B8' }); this._triangle = new St.Label({ text: '\u25B8' });
this.addActor(this._triangle, { align: St.Align.END }); this.addActor(this._triangle, { align: St.Align.END });
@ -1528,6 +1546,9 @@ const PopupComboMenu = new Lang.Class({
if (this.isOpen) if (this.isOpen)
return; return;
if (this.isEmpty())
return;
this.isOpen = true; this.isOpen = true;
let [sourceX, sourceY] = this.sourceActor.get_transformed_position(); let [sourceX, sourceY] = this.sourceActor.get_transformed_position();

View File

@ -3,9 +3,12 @@
const Lang = imports.lang; const Lang = imports.lang;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const Config = imports.misc.config; const Config = imports.misc.config;
const ExtensionSystem = imports.ui.extensionSystem; const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionUtils = imports.misc.extensionUtils;
const Flashspot = imports.ui.flashspot;
const Main = imports.ui.main; const Main = imports.ui.main;
const GnomeShellIface = <interface name="org.gnome.Shell"> const GnomeShellIface = <interface name="org.gnome.Shell">
@ -30,15 +33,18 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="i" direction="in" name="y"/> <arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="width"/> <arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="height"/> <arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/> <arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/> <arg type="b" direction="out" name="success"/>
</method> </method>
<method name="ScreenshotWindow"> <method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/> <arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/> <arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/> <arg type="b" direction="out" name="success"/>
</method> </method>
<method name="Screenshot"> <method name="Screenshot">
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/> <arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/> <arg type="b" direction="out" name="success"/>
</method> </method>
@ -56,6 +62,9 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="s" direction="in" name="uuid"/> <arg type="s" direction="in" name="uuid"/>
<arg type="b" direction="out" name="success"/> <arg type="b" direction="out" name="success"/>
</method> </method>
<method name="LaunchExtensionPrefs">
<arg type="s" direction="in" name="uuid"/>
</method>
<property name="OverviewActive" type="b" access="readwrite" /> <property name="OverviewActive" type="b" access="readwrite" />
<property name="ApiVersion" type="i" access="read" /> <property name="ApiVersion" type="i" access="read" />
<property name="ShellVersion" type="s" access="read" /> <property name="ShellVersion" type="s" access="read" />
@ -109,6 +118,16 @@ const GnomeShell = new Lang.Class({
return [success, returnValue]; return [success, returnValue];
}, },
_onScreenshotComplete: function(obj, result, area, flash, invocation) {
if (flash) {
let flashspot = new Flashspot.Flashspot(area);
flashspot.fire();
}
let retval = GLib.Variant.new('(b)', [result]);
invocation.return_value(retval);
},
/** /**
* ScreenshotArea: * ScreenshotArea:
* @x: The X coordinate of the area * @x: The X coordinate of the area
@ -123,12 +142,10 @@ const GnomeShell = new Lang.Class({
* *
*/ */
ScreenshotAreaAsync : function (params, invocation) { ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, filename, callback] = params; let [x, y, width, height, flash, filename, callback] = params;
global.screenshot_area (x, y, width, height, filename, global.screenshot_area (x, y, width, height, filename,
function (obj, result) { Lang.bind(this, this._onScreenshotComplete,
let retval = GLib.Variant.new('(b)', [result]); flash, invocation));
invocation.return_value(retval);
});
}, },
/** /**
@ -141,8 +158,11 @@ const GnomeShell = new Lang.Class({
* indicating whether the operation was successful or not. * indicating whether the operation was successful or not.
* *
*/ */
ScreenshotWindow : function (include_frame, filename) { ScreenshotWindowAsync : function (params, invocation) {
return global.screenshot_window (include_frame, filename); let [include_frame, flash, filename] = params;
global.screenshot_window (include_frame, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
}, },
/** /**
@ -155,17 +175,15 @@ const GnomeShell = new Lang.Class({
* *
*/ */
ScreenshotAsync : function (params, invocation) { ScreenshotAsync : function (params, invocation) {
let [filename] = params; let [flash, filename] = params;
global.screenshot(filename, global.screenshot(filename,
function (obj, result) { Lang.bind(this, this._onScreenshotComplete,
let retval = GLib.Variant.new('(b)', [result]); flash, invocation));
invocation.return_value(retval);
});
}, },
ListExtensions: function() { ListExtensions: function() {
let out = {}; let out = {};
for (let uuid in ExtensionSystem.extensionMeta) { for (let uuid in ExtensionUtils.extensions) {
let dbusObj = this.GetExtensionInfo(uuid); let dbusObj = this.GetExtensionInfo(uuid);
out[uuid] = dbusObj; out[uuid] = dbusObj;
} }
@ -173,10 +191,23 @@ const GnomeShell = new Lang.Class({
}, },
GetExtensionInfo: function(uuid) { GetExtensionInfo: function(uuid) {
let meta = ExtensionSystem.extensionMeta[uuid] || {}; let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return {};
let obj = {};
Lang.copyProperties(extension.metadata, obj);
// Only serialize the properties that we actually need.
const serializedProperties = ["type", "state", "path", "error", "hasPrefs"];
serializedProperties.forEach(function(prop) {
obj[prop] = extension[prop];
});
let out = {}; let out = {};
for (let key in meta) { for (let key in obj) {
let val = meta[key]; let val = obj[key];
let type; let type;
switch (typeof val) { switch (typeof val) {
case 'string': case 'string':
@ -185,16 +216,27 @@ const GnomeShell = new Lang.Class({
case 'number': case 'number':
type = 'd'; type = 'd';
break; break;
case 'boolean':
type = 'b';
break;
default: default:
continue; continue;
} }
out[key] = GLib.Variant.new(type, val); out[key] = GLib.Variant.new(type, val);
} }
return out; return out;
}, },
GetExtensionErrors: function(uuid) { GetExtensionErrors: function(uuid) {
return ExtensionSystem.errors[uuid] || []; let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return [];
if (!extension.errors)
return [];
return extension.errors;
}, },
EnableExtension: function(uuid) { EnableExtension: function(uuid) {
@ -219,6 +261,13 @@ const GnomeShell = new Lang.Class({
return ExtensionSystem.uninstallExtensionFromUUID(uuid); return ExtensionSystem.uninstallExtensionFromUUID(uuid);
}, },
LaunchExtensionPrefs: function(uuid) {
let appSys = Shell.AppSystem.get_default();
let app = appSys.lookup_app('gnome-shell-extension-prefs.desktop');
app.launch(global.display.get_current_time_roundtrip(),
['extension:///' + uuid], -1, null);
},
get OverviewActive() { get OverviewActive() {
return Main.overview.visible; return Main.overview.visible;
}, },

View File

@ -211,6 +211,8 @@ const ShellMountQuestionDialog = new Lang.Class({
{ y_align: St.Align.START }); { y_align: St.Align.START });
this.subjectLabel = new St.Label({ style_class: 'mount-question-dialog-subject' }); this.subjectLabel = new St.Label({ style_class: 'mount-question-dialog-subject' });
this.subjectLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this.subjectLabel.clutter_text.line_wrap = true;
messageLayout.add(this.subjectLabel, messageLayout.add(this.subjectLabel,
{ y_fill: false, { y_fill: false,

View File

@ -44,7 +44,7 @@ const ATIndicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
_init: function() { _init: function() {
this.parent('preferences-desktop-accessibility', null); this.parent('preferences-desktop-accessibility', null, _("Accessibility"));
let highContrast = this._buildHCItem(); let highContrast = this._buildHCItem();
this.menu.addMenuItem(highContrast); this.menu.addMenuItem(highContrast);

View File

@ -28,7 +28,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
_init: function() { _init: function() {
this.parent('bluetooth-disabled', null); this.parent('bluetooth-disabled', null, _("Bluetooth"));
this._applet = new GnomeBluetoothApplet.Applet(); this._applet = new GnomeBluetoothApplet.Applet();

View File

@ -113,6 +113,7 @@ const NMNetworkMenuItem = new Lang.Class({
} }
this._label = new St.Label({ text: title }); this._label = new St.Label({ text: title });
this.actor.label_actor = this._label;
this.addActor(this._label); this.addActor(this._label);
this._icons = new St.BoxLayout({ style_class: 'nm-menu-item-icons' }); this._icons = new St.BoxLayout({ style_class: 'nm-menu-item-icons' });
this.addActor(this._icons, { align: St.Align.END }); this.addActor(this._icons, { align: St.Align.END });
@ -1537,7 +1538,7 @@ const NMApplet = new Lang.Class({
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
_init: function() { _init: function() {
this.parent('network-error', null); this.parent('network-error', null, _("Network"));
this._client = NMClient.Client.new(); this._client = NMClient.Client.new();

View File

@ -46,7 +46,6 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
<method name="GetPrimaryDevice"> <method name="GetPrimaryDevice">
<arg type="(susdut)" direction="out" /> <arg type="(susdut)" direction="out" />
</method> </method>
<signal name="Changed" />
<property name="Icon" type="s" access="read" /> <property name="Icon" type="s" access="read" />
</interface>; </interface>;
@ -57,7 +56,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
_init: function() { _init: function() {
this.parent('battery-missing', null); this.parent('battery-missing', null, _("Battery"));
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH); this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH);
@ -76,7 +75,8 @@ const Indicator = new Lang.Class({
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop'); this.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop');
this._proxy.connectSignal('Changed', Lang.bind(this, this._devicesChanged)); this._proxy.connect('g-properties-changed',
Lang.bind(this, this._devicesChanged));
this._devicesChanged(); this._devicesChanged();
}, },

View File

@ -22,7 +22,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
_init: function() { _init: function() {
this.parent('audio-volume-muted', null); this.parent('audio-volume-muted', null, _("Volume"));
this._control = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' }); this._control = new Gvc.MixerControl({ name: 'GNOME Shell Volume Control' });
this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged)); this._control.connect('state-changed', Lang.bind(this, this._onControlStateChanged));

View File

@ -1092,7 +1092,7 @@ const AudioVideoNotification = new Lang.Class({
/* translators: argument is a contact name like Alice for example. */ /* translators: argument is a contact name like Alice for example. */
title = _("Call from %s").format(contact.get_alias()); title = _("Call from %s").format(contact.get_alias());
this.parent(this, source, title, null, { customContent: true }); this.parent(source, title, null, { customContent: true });
this.setResident(true); this.setResident(true);
this.addButton('reject', _("Reject")); this.addButton('reject', _("Reject"));
@ -1123,8 +1123,7 @@ const FileTransferNotification = new Lang.Class({
Extends: MessageTray.Notification, Extends: MessageTray.Notification,
_init: function(source, dispatchOp, channel, contact) { _init: function(source, dispatchOp, channel, contact) {
this.parent(this, this.parent(source,
source,
/* To translators: The first parameter is /* To translators: The first parameter is
* the contact's alias and the second one is the * the contact's alias and the second one is the
* file name. The string will be something * file name. The string will be something
@ -1197,7 +1196,7 @@ const SubscriptionRequestNotification = new Lang.Class({
Extends: MessageTray.Notification, Extends: MessageTray.Notification,
_init: function(source, contact) { _init: function(source, contact) {
this.parent(this, source, this.parent(source,
/* To translators: The parameter is the contact's alias */ /* To translators: The parameter is the contact's alias */
_("%s would like permission to see when you are online").format(contact.get_alias()), _("%s would like permission to see when you are online").format(contact.get_alias()),
null, { customContent: true }); null, { customContent: true });

View File

@ -376,7 +376,8 @@ const IMStatusChooserItem = new Lang.Class({
if (sessionStatus == GnomeSession.PresenceStatus.IDLE) { if (sessionStatus == GnomeSession.PresenceStatus.IDLE) {
// Only change presence if the current one is "more present" than // Only change presence if the current one is "more present" than
// idle // idle
if (this._currentPresence != Tp.ConnectionPresenceType.OFFLINE) if (this._currentPresence != Tp.ConnectionPresenceType.OFFLINE &&
this._currentPresence != Tp.ConnectionPresenceType.HIDDEN)
return Tp.ConnectionPresenceType.EXTENDED_AWAY; return Tp.ConnectionPresenceType.EXTENDED_AWAY;
} }
@ -466,6 +467,7 @@ const UserMenuButton = new Lang.Class({
})); }));
this._name = new St.Label(); this._name = new St.Label();
this.actor.label_actor = this._name;
box.add(this._name, { y_align: St.Align.MIDDLE, y_fill: false }); box.add(this._name, { y_align: St.Align.MIDDLE, y_fill: false });
this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUserName)); this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUserName));
this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUserName)); this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUserName));
@ -611,7 +613,7 @@ const UserMenuButton = new Lang.Class({
this._statusChooser = item; this._statusChooser = item;
item = new PopupMenu.PopupSwitchMenuItem(_("Notifications")); item = new PopupMenu.PopupSwitchMenuItem(_("Notifications"));
item.connect('activate', Lang.bind(this, this._updatePresenceStatus)); item.connect('toggled', Lang.bind(this, this._updatePresenceStatus));
this.menu.addMenuItem(item); this.menu.addMenuItem(item);
this._notificationsSwitch = item; this._notificationsSwitch = item;

View File

@ -370,6 +370,7 @@ const WindowClone = new Lang.Class({
if (this._selected) if (this._selected)
return; return;
let [x, y] = action.get_coords(); let [x, y] = action.get_coords();
action.release();
this._draggable.startDrag(x, y, global.get_current_time()); this._draggable.startDrag(x, y, global.get_current_time());
})); }));
} }

View File

@ -611,7 +611,11 @@ const ThumbnailsBox = new Lang.Class({
let thumbHeight = this._porthole.height * this._scale; let thumbHeight = this._porthole.height * this._scale;
let workspace = -1; let workspace = -1;
let firstThumbY = this._thumbnails[0].actor.y; let firstThumbY;
if (this._dropPlaceholderPos == 0)
firstThumbY = this._dropPlaceholder.y;
else
firstThumbY = this._thumbnails[0].actor.y;
for (let i = 0; i < this._thumbnails.length; i ++) { for (let i = 0; i < this._thumbnails.length; i ++) {
let targetBase = firstThumbY + (thumbHeight + spacing) * i; let targetBase = firstThumbY + (thumbHeight + spacing) * i;

View File

@ -48,6 +48,7 @@ pt
pt_BR pt_BR
ro ro
ru ru
si
sk sk
sl sl
sr sr

View File

@ -1,5 +1,7 @@
data/gnome-shell.desktop.in.in data/gnome-shell.desktop.in.in
data/gnome-shell-extension-prefs.desktop.in.in
data/org.gnome.shell.gschema.xml.in data/org.gnome.shell.gschema.xml.in
js/extensionPrefs/main.js
js/gdm/loginDialog.js js/gdm/loginDialog.js
js/gdm/powerMenu.js js/gdm/powerMenu.js
js/misc/util.js js/misc/util.js

View File

@ -1,2 +1,2 @@
data/gnome-shell.desktop.in data/gnome-shell.desktop.in
data/gnome-shell-clock-preferences.desktop.in data/gnome-shell-extension-prefs.desktop.in

338
po/es.po
View File

@ -3,15 +3,15 @@
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011. # Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011. # Benjamín Valero Espinosa <benjavalero@gmail.com>, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011. # Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011, 2012.
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-12-26 13:34+0000\n" "POT-Creation-Date: 2012-01-31 15:48+0000\n"
"PO-Revision-Date: 2011-12-31 18:57+0100\n" "PO-Revision-Date: 2012-01-31 17:14+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -87,6 +87,18 @@ msgstr "Lista de ID de archivos de escritorio para las aplicaciones favoritas"
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format #, no-c-format
#| msgid ""
#| "Sets the GStreamer pipeline used to encode recordings. It follows the "
#| "syntax used for gst-launch. The pipeline should have an unconnected sink "
#| "pad where the recorded video is recorded. It will normally have a "
#| "unconnected source pad; output from that pad will be written into the "
#| "output file. However the pipeline can also take care of its own output - "
#| "this might be used to send the output to an icecast server via shout2send "
#| "or similar. When unset or set to an empty value, the default pipeline "
#| "will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 "
#| "threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T "
#| "is used as a placeholder for a guess at the optimal thread count on the "
#| "system."
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where " "used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -95,21 +107,21 @@ msgid ""
"pipeline can also take care of its own output - this might be used to send " "pipeline can also take care of its own output - this might be used to send "
"the output to an icecast server via shout2send or similar. When unset or set " "the output to an icecast server via shout2send or similar. When unset or set "
"to an empty value, the default pipeline will be used. This is currently " "to an empty value, the default pipeline will be used. This is currently "
"'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and " "'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM "
"records to WEBM using the VP8 codec. %T is used as a placeholder for a guess " "using the VP8 codec. %T is used as a placeholder for a guess at the optimal "
"at the optimal thread count on the system." "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») de ensamblaje/sesensamblaje donde el vídeo que se está grabando se " "desconectado donde grabar el vídeo que se está grabando. Generalmente tendrá "
"graba. Generalmente tendrá un origen de ensamblado/desensamblado; la salida " "un punto de origen desconectado; la salida de ese punto se escribirá en el "
"de ese punto se escibirá en el archivo de salida. No obstante la tubería " "archivo de salida. Sin embargo, la tubería también puede tomar parte en su "
"también puede tomar parte en su propia salida; esto se puede usar para " "propia salida; esto se puede usar para enviar la salida a un servidor "
"enviar la salida a un servidor «icecast» a través de shout2send o similar. " "«icecast» a través de shout2send o similar. Cuando no está establecido o lo "
"Cuando no está establecido o lo está a un valor vacío, se usará la tubería " "está a un valor vacío, se usará la tubería predeterminada. Actualmente es "
"predeterminada. Actualmente es «videorate ! vp8enc quality=10 speed=2 " "«'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux» y graba en WEBM "
"threads=%T ! queue ! webmmux» y greba en WEBM usando el códec VP8. Se usa %T " "usando el códec VP8. Se usa %T como marcador de posición para el número de "
"como suposición para el número de hilos óptimos en el sistema." "hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock" msgid "Show date in clock"
@ -186,45 +198,45 @@ msgstr "Qué teclado usar"
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "proveedores OpenSearch desactivados" msgstr "proveedores OpenSearch desactivados"
#: ../js/gdm/loginDialog.js:623 #: ../js/gdm/loginDialog.js:624
msgid "Session..." msgid "Session..."
msgstr "Sesión…" msgstr "Sesión…"
#: ../js/gdm/loginDialog.js:785 #: ../js/gdm/loginDialog.js:786
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830 #: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o pase el dedo)" msgstr "(o pase el dedo)"
#. 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:851 #: ../js/gdm/loginDialog.js:852
msgid "Not listed?" msgid "Not listed?"
msgstr "¿No está en la lista?" msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:1019 ../js/ui/endSessionDialog.js:418 #: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419
#: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145 #: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:1024 #: ../js/gdm/loginDialog.js:1025
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:1376 #: ../js/gdm/loginDialog.js:1377
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578 #: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:581
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649 #: ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:652
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@ -445,8 +457,8 @@ msgstr "Esta semana"
msgid "Next week" msgid "Next week"
msgstr "La semana que viene" msgstr "La semana que viene"
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:466 #: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:394 #: ../js/ui/status/power.js:215 ../src/shell-app.c:372
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
@ -466,7 +478,7 @@ msgstr "Ocupado"
msgid "Offline" msgid "Offline"
msgstr "Desconectado" msgstr "Desconectado"
#: ../js/ui/contactDisplay.js:141 #: ../js/ui/contactDisplay.js:148
msgid "CONTACTS" msgid "CONTACTS"
msgstr "CONTACTOS" msgstr "CONTACTOS"
@ -474,58 +486,58 @@ msgstr "CONTACTOS"
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha" msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:122 #: ../js/ui/dateMenu.js:123
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir calendario" msgstr "Abrir calendario"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S" msgstr "%a %e de %b, %R:%S"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R" msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:185 #: ../js/ui/dateMenu.js:186
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:187
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:193 #: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %l:%M:%S %p" msgstr "%a %e de %b, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:195
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e de %b, %l:%M %p" msgstr "%a %e de %b, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:198 #: ../js/ui/dateMenu.js:199
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:200
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. 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:210 #: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y" msgstr "%A, %e de %B de %Y"
@ -701,7 +713,7 @@ msgstr "Dar voz"
msgid "Mute" msgid "Mute"
msgstr "Silenciar" msgstr "Silenciar"
#: ../js/ui/messageTray.js:2444 #: ../js/ui/messageTray.js:2446
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -747,8 +759,8 @@ msgstr "La red inalámbrica requiere autenticación"
#: ../js/ui/networkAgent.js:322 #: ../js/ui/networkAgent.js:322
#, 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»."
@ -804,17 +816,17 @@ msgstr "Aplicaciones"
msgid "Dash" msgid "Dash"
msgstr "Tablero" msgstr "Tablero"
#: ../js/ui/panel.js:564 #: ../js/ui/panel.js:572
msgid "Quit" msgid "Quit"
msgstr "Salir" msgstr "Salir"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595 #: ../js/ui/panel.js:603
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:990
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
@ -831,7 +843,7 @@ msgstr "Reintentar"
msgid "Connect to..." msgid "Connect to..."
msgstr "Conectar a…" msgstr "Conectar a…"
#: ../js/ui/placeDisplay.js:364 #: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS" msgstr "LUGARES Y DISPOSITIVOS"
@ -864,7 +876,7 @@ msgstr "Contraseña:"
#. "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:719 #: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -900,6 +912,10 @@ msgstr "Ocultar texto"
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "Contraseña incorrecta; inténtelo de nuevo" msgstr "Contraseña incorrecta; inténtelo de nuevo"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Accesibilidad"
#: ../js/ui/status/accessibility.js:52 #: ../js/ui/status/accessibility.js:52
msgid "Zoom" msgid "Zoom"
msgstr "Ampliación" msgstr "Ampliación"
@ -943,10 +959,10 @@ msgstr "Contraste alto"
msgid "Large Text" msgid "Large Text"
msgstr "Texto grande" msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:35 ../js/ui/status/bluetooth.js:258 #: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:341 ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:436 #: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/network.js:892 #: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -967,7 +983,7 @@ msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth" msgstr "Configuración de Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:255 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:256
msgid "hardware disabled" msgid "hardware disabled"
msgstr "hardware desactivado" msgstr "hardware desactivado"
@ -975,11 +991,11 @@ msgstr "hardware desactivado"
msgid "Connection" msgid "Connection"
msgstr "Conexión" msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:490 #: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
msgid "disconnecting..." msgid "disconnecting..."
msgstr "deconectando…" msgstr "deconectando…"
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:496 #: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
@ -1030,7 +1046,7 @@ msgstr "Conceder acceso siempre"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Conceder sólo esta vez" msgstr "Conceder sólo esta vez"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1168 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1098
msgid "Reject" msgid "Reject"
msgstr "Rechazar" msgstr "Rechazar"
@ -1083,119 +1099,127 @@ msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:277 #: ../js/ui/status/network.js:278
msgid "disabled" msgid "disabled"
msgstr "desactivada" msgstr "desactivada"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:488 #: ../js/ui/status/network.js:489
msgid "unmanaged" msgid "unmanaged"
msgstr "no gestionada" msgstr "no gestionada"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:499 #: ../js/ui/status/network.js:500
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:509 #: ../js/ui/status/network.js:510
msgid "firmware missing" msgid "firmware missing"
msgstr "falta el «firmware»" msgstr "falta el «firmware»"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:516 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "cable desconectado" msgstr "cable desconectado"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:522
msgid "unavailable" msgid "unavailable"
msgstr "no disponible" msgstr "no disponible"
#: ../js/ui/status/network.js:523 #: ../js/ui/status/network.js:524
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: ../js/ui/status/network.js:584 ../js/ui/status/network.js:1504 #: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
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:620 ../js/ui/status/network.js:1439 #: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Conectada (privada)" msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:695 #: ../js/ui/status/network.js:696
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Ethernet automática" msgstr "Ethernet automática"
#: ../js/ui/status/network.js:756 #: ../js/ui/status/network.js:757
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Banda ancha automática" msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:759 #: ../js/ui/status/network.js:760
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:878 ../js/ui/status/network.js:1451 #: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s automática" msgstr "%s automática"
#: ../js/ui/status/network.js:880 #: ../js/ui/status/network.js:881
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth automático" msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1454
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Inalámbrica automática" msgstr "Inalámbrica automática"
#: ../js/ui/status/network.js:1547 #: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Red"
#: ../js/ui/status/network.js:1548
msgid "Enable networking" msgid "Enable networking"
msgstr "Activar red" msgstr "Activar red"
#: ../js/ui/status/network.js:1559 #: ../js/ui/status/network.js:1560
msgid "Wired" msgid "Wired"
msgstr "Cableada" msgstr "Cableada"
#: ../js/ui/status/network.js:1570 #: ../js/ui/status/network.js:1571
msgid "Wireless" msgid "Wireless"
msgstr "Inalámbrica" msgstr "Inalámbrica"
#: ../js/ui/status/network.js:1580 #: ../js/ui/status/network.js:1581
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Banda ancha móvil" msgstr "Banda ancha móvil"
#: ../js/ui/status/network.js:1590 #: ../js/ui/status/network.js:1591
msgid "VPN Connections" msgid "VPN Connections"
msgstr "Conexiones VPN" msgstr "Conexiones VPN"
#: ../js/ui/status/network.js:1601 #: ../js/ui/status/network.js:1602
msgid "Network Settings" msgid "Network Settings"
msgstr "Configuración de la red" msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1738 #: ../js/ui/status/network.js:1739
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1739 #: ../js/ui/status/network.js:1740
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:1989 #: ../js/ui/status/network.js:1993
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "La red está desactivada" msgstr "La red está desactivada"
#: ../js/ui/status/network.js:2113 #: ../js/ui/status/network.js:2117
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:59
msgid "Battery"
msgstr "Batería"
#: ../js/ui/status/power.js:76
msgid "Power Settings" msgid "Power Settings"
msgstr "Configuración de energía" msgstr "Configuración de energía"
@ -1283,7 +1307,7 @@ msgstr "Tableta"
msgid "Computer" msgid "Computer"
msgstr "Equipo" msgstr "Equipo"
#: ../js/ui/status/volume.js:38 #: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:38
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
@ -1291,47 +1315,46 @@ msgstr "Volumen"
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267 #: ../js/ui/telepathyClient.js:225
msgid "Invitation" msgid "Invitation"
msgstr "Invitación" msgstr "Invitación"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:278
msgid "Call" msgid "Call"
msgstr "Llamar" msgstr "Llamar"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:365 #: ../js/ui/telepathyClient.js:294
msgid "File Transfer" msgid "File Transfer"
msgstr "Transferencia de archivos" msgstr "Transferencia de archivos"
#: ../js/ui/telepathyClient.js:446 #: ../js/ui/telepathyClient.js:376
msgid "Subscription request" msgid "Subscription request"
msgstr "Solicitud de suscripción" msgstr "Solicitud de suscripción"
#: ../js/ui/telepathyClient.js:482 #: ../js/ui/telepathyClient.js:412
msgid "Connection error" msgid "Connection error"
msgstr "Error de conexión" msgstr "Error de conexión"
#: ../js/ui/telepathyClient.js:740 #: ../js/ui/telepathyClient.js:670
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s está conectado/a." msgstr "%s está conectado/a."
#: ../js/ui/telepathyClient.js:745 #: ../js/ui/telepathyClient.js:674
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s está desconectado/a." msgstr "%s está desconectado/a."
#: ../js/ui/telepathyClient.js:748 #: ../js/ui/telepathyClient.js:678
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "%s está ausente." msgstr "%s está ausente."
#: ../js/ui/telepathyClient.js:751 #: ../js/ui/telepathyClient.js:681
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s está ocupado/a." msgstr "%s está ocupado/a."
@ -1339,35 +1362,35 @@ msgstr "%s está ocupado/a."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:964 #: ../js/ui/telepathyClient.js:894
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Enviado el <b>%A</b> a las <b>%H:%M</b>" msgstr "Enviado el <b>%A</b> a las <b>%H:%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Enviado el <b>%A</b>, <b>%d de %B</b>" msgstr "Enviado el <b>%A</b>, <b>%d de %B</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975 #: ../js/ui/telepathyClient.js:905
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Enviado el <b>%A</b>, <b>%d de %B</b> de %Y" msgstr "Enviado el <b>%A</b>, <b>%d de %B</b> de %Y"
#. 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.
#: ../js/ui/telepathyClient.js:1017 #: ../js/ui/telepathyClient.js:947
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "Ahora %s se llama %s" msgstr "Ahora %s se llama %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119 #: ../js/ui/telepathyClient.js:1049
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Invitación a %s" msgstr "Invitación a %s"
@ -1375,35 +1398,35 @@ msgstr "Invitación a %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1127 #: ../js/ui/telepathyClient.js:1057
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s le está invitando a unirse a %s" msgstr "%s le está invitando a unirse a %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209 #: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1236
msgid "Decline" msgid "Decline"
msgstr "Rechazar" msgstr "Rechazar"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210 #: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1308 #: ../js/ui/telepathyClient.js:1237
msgid "Accept" msgid "Accept"
msgstr "Aceptar" msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160 #: ../js/ui/telepathyClient.js:1090
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videollamada de %s" msgstr "Videollamada de %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163 #: ../js/ui/telepathyClient.js:1093
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Llamada de %s" msgstr "Llamada de %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170 #: ../js/ui/telepathyClient.js:1100
msgid "Answer" msgid "Answer"
msgstr "Responder" msgstr "Responder"
@ -1412,112 +1435,112 @@ msgstr "Responder"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1203 #: ../js/ui/telepathyClient.js:1132
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s le está enviando %s" msgstr "%s le está enviando %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272 #: ../js/ui/telepathyClient.js:1201
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s solicita permiso para ver cuándo está en línea" msgstr "%s solicita permiso para ver cuándo está en línea"
#: ../js/ui/telepathyClient.js:1365 #: ../js/ui/telepathyClient.js:1294
msgid "Network error" msgid "Network error"
msgstr "Error de la red" msgstr "Error de la red"
#: ../js/ui/telepathyClient.js:1367 #: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Falló la autenticación" msgstr "Falló la autenticación"
#: ../js/ui/telepathyClient.js:1369 #: ../js/ui/telepathyClient.js:1298
msgid "Encryption error" msgid "Encryption error"
msgstr "Error de cifrado" msgstr "Error de cifrado"
#: ../js/ui/telepathyClient.js:1371 #: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certificado no proporcionado" msgstr "Certificado no proporcionado"
#: ../js/ui/telepathyClient.js:1373 #: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "No se confía en el certificado" msgstr "No se confía en el certificado"
#: ../js/ui/telepathyClient.js:1375 #: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certificado caducado" msgstr "Certificado caducado"
#: ../js/ui/telepathyClient.js:1377 #: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certificado no activado" msgstr "Certificado no activado"
#: ../js/ui/telepathyClient.js:1379 #: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "El nombre del servidor dle certificado no coincide" msgstr "El nombre del servidor dle certificado no coincide"
#: ../js/ui/telepathyClient.js:1381 #: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "La huella del certificado no coincide" msgstr "La huella del certificado no coincide"
#: ../js/ui/telepathyClient.js:1383 #: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certificado autofirmado" msgstr "Certificado autofirmado"
#: ../js/ui/telepathyClient.js:1385 #: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "El estado está establecido a «desconectado»" msgstr "El estado está establecido a «desconectado»"
#: ../js/ui/telepathyClient.js:1387 #: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "El cifrado no está disponible" msgstr "El cifrado no está disponible"
#: ../js/ui/telepathyClient.js:1389 #: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "El certificado no es válido" msgstr "El certificado no es válido"
#: ../js/ui/telepathyClient.js:1391 #: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Se ha rechazado la conexión" msgstr "Se ha rechazado la conexión"
#: ../js/ui/telepathyClient.js:1393 #: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "No se puede establecer la conexión" msgstr "No se puede establecer la conexión"
#: ../js/ui/telepathyClient.js:1395 #: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Se ha perdido la conexión" msgstr "Se ha perdido la conexión"
#: ../js/ui/telepathyClient.js:1397 #: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server" msgid "This resource is already connected to the server"
msgstr "Este recurso ya está conectado al servidor" msgstr "Este recurso ya está conectado al servidor"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1328
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Se ha sustituido la conexión por una nueva conexión usando el mismo recurso" "Se ha sustituido la conexión por una nueva conexión usando el mismo recurso"
#: ../js/ui/telepathyClient.js:1401 #: ../js/ui/telepathyClient.js:1330
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "La cuenta ya existe en el servidor" msgstr "La cuenta ya existe en el servidor"
#: ../js/ui/telepathyClient.js:1403 #: ../js/ui/telepathyClient.js:1332
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "" msgstr ""
"Actualmente el servidor está muy ocupado intentando gestionar la conexión" "Actualmente el servidor está muy ocupado intentando gestionar la conexión"
#: ../js/ui/telepathyClient.js:1405 #: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Se ha revocado el certificado" msgstr "Se ha revocado el certificado"
#: ../js/ui/telepathyClient.js:1407 #: ../js/ui/telepathyClient.js:1336
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"El certificado usa un algoritmo de cifrado inseguro o es criptográficamente " "El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
"débil" "débil"
#: ../js/ui/telepathyClient.js:1409 #: ../js/ui/telepathyClient.js:1338
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1528,20 +1551,20 @@ msgstr ""
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419 #: ../js/ui/telepathyClient.js:1348
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Falló la conexión a %s" msgstr "Falló la conexión a %s"
#: ../js/ui/telepathyClient.js:1428 #: ../js/ui/telepathyClient.js:1357
msgid "Reconnect" msgid "Reconnect"
msgstr "Reconectar" msgstr "Reconectar"
#: ../js/ui/telepathyClient.js:1429 #: ../js/ui/telepathyClient.js:1358
msgid "Edit account" msgid "Edit account"
msgstr "Editar cuenta" msgstr "Editar cuenta"
#: ../js/ui/telepathyClient.js:1475 #: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón desconocida" msgstr "Razón desconocida"
@ -1557,39 +1580,39 @@ msgstr "Inactivo"
msgid "Unavailable" msgid "Unavailable"
msgstr "No disponible" msgstr "No disponible"
#: ../js/ui/userMenu.js:576 ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:650 #: ../js/ui/userMenu.js:579 ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:653
msgid "Power Off..." msgid "Power Off..."
msgstr "Apagar…" msgstr "Apagar…"
#: ../js/ui/userMenu.js:612 #: ../js/ui/userMenu.js:615
msgid "Notifications" msgid "Notifications"
msgstr "Notificaciones" msgstr "Notificaciones"
#: ../js/ui/userMenu.js:620 #: ../js/ui/userMenu.js:623
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Cuentas en línea" msgstr "Cuentas en línea"
#: ../js/ui/userMenu.js:624 #: ../js/ui/userMenu.js:627
msgid "System Settings" msgid "System Settings"
msgstr "Configuración del sistema" msgstr "Configuración del sistema"
#: ../js/ui/userMenu.js:631 #: ../js/ui/userMenu.js:634
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Bloquear la pantalla" msgstr "Bloquear la pantalla"
#: ../js/ui/userMenu.js:636 #: ../js/ui/userMenu.js:639
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:641 #: ../js/ui/userMenu.js:644
msgid "Log Out..." msgid "Log Out..."
msgstr "Cerrar la sesión…" msgstr "Cerrar la sesión…"
#: ../js/ui/userMenu.js:669 #: ../js/ui/userMenu.js:672
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:670 #: ../js/ui/userMenu.js:673
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."
@ -1663,7 +1686,7 @@ msgstr "Imprimir versión"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para la pantalla de inicio" msgstr "Modo usado por GDM para la pantalla de inicio"
#: ../src/shell-app.c:639 #: ../src/shell-app.c:617
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Falló al lanzar «%s»" msgstr "Falló al lanzar «%s»"
@ -1676,7 +1699,7 @@ msgstr "Reino Unido"
msgid "Default" msgid "Default"
msgstr "Predeterminada" msgstr "Predeterminada"
#: ../src/shell-polkit-authentication-agent.c:334 #: ../src/shell-polkit-authentication-agent.c:332
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"
@ -1974,8 +1997,8 @@ msgstr "%1$s: %2$s"
#~ "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 "
@ -1992,19 +2015,18 @@ msgstr "%1$s: %2$s"
#~ 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"

335
po/fi.po
View File

@ -21,8 +21,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-10 09:26+0100\n" "POT-Creation-Date: 2012-01-24 15:37+0200\n"
"PO-Revision-Date: 2012-01-09 16:54+0200\n" "PO-Revision-Date: 2012-01-22 14:10+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n" "Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
"Language-Team: Finnish <>\n" "Language-Team: Finnish <>\n"
"Language: fi\n" "Language: fi\n"
@ -43,11 +43,6 @@ msgid "Window management and application launching"
msgstr "Ikkunanhallinta ja sovelluksien käynnistäminen" msgstr "Ikkunanhallinta ja sovelluksien käynnistäminen"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Ota käyttöön sisäiset kehittäjiä ja testaajia hyödyttävät työkalut Alt-F2:sta"
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "" msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 " "Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog." "dialog."
@ -55,11 +50,20 @@ msgstr ""
"Salli pääsy sisäiseen vianselvitys- ja monitorointityökaluun Alt-F2-ikkunan " "Salli pääsy sisäiseen vianselvitys- ja monitorointityökaluun Alt-F2-ikkunan "
"kautta." "kautta."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Ota käyttöön sisäiset kehittäjiä ja testaajia hyödyttävät työkalut Alt-F2:sta"
#: ../data/org.gnome.shell.gschema.xml.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Uuids of extensions to enable" msgid "File extension used for storing the screencast"
msgstr "Käyttöön otettavien laajennosten UUID:t" msgstr "Tiedostopääte ruutunauhoitusten tallentamiseen"
#: ../data/org.gnome.shell.gschema.xml.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Ruutunauhoitusten kuvataajuus."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "" msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which " "GNOME Shell extensions have a uuid property; this key lists extensions which "
"should be loaded. Any extension that wants to be loaded needs to be in this " "should be loaded. Any extension that wants to be loaded needs to be in this "
@ -71,94 +75,31 @@ msgstr ""
"halutaan ladata, on oltava tässä luettelossa. Tätä luetteloa voi muokata " "halutaan ladata, on oltava tässä luettelossa. Tätä luetteloa voi muokata "
"myös org.gnome.Shell-DBus-metodeilla EnableExtension ja DisableExtension." "myös org.gnome.Shell-DBus-metodeilla EnableExtension ja DisableExtension."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Whether to collect stats about applications usage"
msgstr "Kerätäänkö sovellusten käytöstä tilastoja"
#: ../data/org.gnome.shell.gschema.xml.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Ikkunanhallinta seuraa normaalisti aktiivisia sovelluksia, jotta eniten "
"käytetyt voidaan esittää (esim. käynnistimissä). Vaikka nämä tiedot pysyvät "
"yksityisinä, voit silti haluta ottaa ominaisuuden pois käytöstä "
"yksityisyyden vuoksi. Huomaa että pois kytkeminen ei poista aiemmin "
"tallennettuja tietoja."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "List of desktop file IDs for favorite applications"
msgstr "Luettelo työpöytätiedostojen tunnisteista lempisovelluksille"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "Näitä tunnisteita vastaavat sovellukset näytetään suosikkien alueella."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "disabled OpenSearch providers"
msgstr "käytöstä poistetut OpenSearch-tarjoajat"
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "Historia komentoikkunalle (Alt-F2)" msgstr "Historia komentoikkunalle (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "Historia näyttölasi-ikkunalle" msgstr "Historia näyttölasi-ikkunalle"
#: ../data/org.gnome.shell.gschema.xml.in.h:12 #: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Show the week date in the calendar"
msgstr "Näytä viikonpäivä kalenterissa"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "If true, display the ISO week date in the calendar."
msgstr "Jos tosi, näytä ISO-viikonpäivät kalenterissa."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Which keyboard to use"
msgstr "Mitä näppäimistöä käytetään"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "The type of keyboard to use."
msgstr "Käytettävän näppäimistön tyyppi."
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Näytä aika sekuntien kera"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "If true, display seconds in time."
msgstr "Jos tosi, näytä sekunnit ajassa."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "Show date in clock"
msgstr "Näytä päivämäärä kellossa"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "If true, display date in the clock, in addition to time." msgid "If true, display date in the clock, in addition to time."
msgstr "Jos tosi, näytä päivämäärä kellossa ajan lisäksi." msgstr "Jos tosi, näytä päivämäärä kellossa ajan lisäksi."
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "Framerate used for recording screencasts." msgid "If true, display seconds in time."
msgstr "Ruutunauhoitusten kuvataajuus." msgstr "Jos tosi, näytä sekunnit ajassa."
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "" msgid "If true, display the ISO week date in the calendar."
"The framerate of the resulting screencast recordered by GNOME Shell's " msgstr "Jos tosi, näytä ISO-viikonpäivät kalenterissa."
"screencast recorder in frames-per-second."
msgstr ""
"Nauhoituksesta tuloksena saatavan ruutunauhoituksen kuvataajuus kun käytössä "
"on GNOMEn ikkunanhallinnan nauhoitin, kuvaa per sekunti."
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "The gstreamer pipeline used to encode the screencast" msgid "List of desktop file IDs for favorite applications"
msgstr "Gstreamer-liukuhihna jolla ruutunauhoitukset pakataan" msgstr "Luettelo työpöytätiedostojen tunnisteista lempisovelluksille"
#: ../data/org.gnome.shell.gschema.xml.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -184,11 +125,25 @@ msgstr ""
"muotoon VP8-koodekilla. %T korvautuu arvauksella parhaan suorituskyvy " "muotoon VP8-koodekilla. %T korvautuu arvauksella parhaan suorituskyvy "
"antavasta säiemäärästä järjestelmässä." "antavasta säiemäärästä järjestelmässä."
#: ../data/org.gnome.shell.gschema.xml.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "File extension used for storing the screencast" msgid "Show date in clock"
msgstr "Tiedostopääte ruutunauhoitusten tallentamiseen" msgstr "Näytä päivämäärä kellossa"
#: ../data/org.gnome.shell.gschema.xml.in.h:26 #: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Näytä viikonpäivä kalenterissa"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Näytä aika sekuntien kera"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "Näitä tunnisteita vastaavat sovellukset näytetään suosikkien alueella."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -198,45 +153,90 @@ msgstr ""
"nykyisen päivämäärän ja tämän tiedostopäätteen mukaisesti. Tiedostopääte " "nykyisen päivämäärän ja tämän tiedostopäätteen mukaisesti. Tiedostopääte "
"tulisi vaihtaa mikäli nauhoitetaan eri tallennusmuotoon." "tulisi vaihtaa mikäli nauhoitetaan eri tallennusmuotoon."
#: ../js/gdm/loginDialog.js:623 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"Nauhoituksesta tuloksena saatavan ruutunauhoituksen kuvataajuus kun käytössä "
"on GNOMEn ikkunanhallinnan nauhoitin, kuvaa per sekunti."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer-liukuhihna jolla ruutunauhoitukset pakataan"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"Ikkunanhallinta seuraa normaalisti aktiivisia sovelluksia, jotta eniten "
"käytetyt voidaan esittää (esim. käynnistimissä). Vaikka nämä tiedot pysyvät "
"yksityisinä, voit silti haluta ottaa ominaisuuden pois käytöstä "
"yksityisyyden vuoksi. Huomaa että pois kytkeminen ei poista aiemmin "
"tallennettuja tietoja."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "The type of keyboard to use."
msgstr "Käytettävän näppäimistön tyyppi."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Uuids of extensions to enable"
msgstr "Käyttöön otettavien laajennosten UUID:t"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Whether to collect stats about applications usage"
msgstr "Kerätäänkö sovellusten käytöstä tilastoja"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Which keyboard to use"
msgstr "Mitä näppäimistöä käytetään"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "disabled OpenSearch providers"
msgstr "käytöstä poistetut OpenSearch-tarjoajat"
#: ../js/gdm/loginDialog.js:624
msgid "Session..." msgid "Session..."
msgstr "Istunto…" msgstr "Istunto…"
#: ../js/gdm/loginDialog.js:785 #: ../js/gdm/loginDialog.js:786
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Kirjaudu sisään" msgstr "Kirjaudu sisään"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830 #: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(tai pyyhkäise sormella)" msgstr "(tai pyyhkäise sormella)"
#. 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:851 #: ../js/gdm/loginDialog.js:852
msgid "Not listed?" msgid "Not listed?"
msgstr "Ei luettelossa?" msgstr "Ei luettelossa?"
#: ../js/gdm/loginDialog.js:1019 ../js/ui/endSessionDialog.js:418 #: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419
#: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145 #: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Peru" msgstr "Peru"
#: ../js/gdm/loginDialog.js:1024 #: ../js/gdm/loginDialog.js:1025
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Kirjaudu sisään" msgstr "Kirjaudu sisään"
#: ../js/gdm/loginDialog.js:1376 #: ../js/gdm/loginDialog.js:1377
msgid "Login Window" msgid "Login Window"
msgstr "Kirjautumisikkuna" msgstr "Kirjautumisikkuna"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578 #: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649 #: ../js/ui/userMenu.js:581 ../js/ui/userMenu.js:650
msgid "Suspend" msgid "Suspend"
msgstr "Valmiustila" msgstr "Valmiustila"
@ -460,7 +460,7 @@ msgid "Next week"
msgstr "Ensi viikolla" msgstr "Ensi viikolla"
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486 #: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:394 #: ../js/ui/status/power.js:215 ../src/shell-app.c:371
msgid "Unknown" msgid "Unknown"
msgstr "Tuntematon" msgstr "Tuntematon"
@ -830,17 +830,17 @@ msgstr "Sovellukset"
msgid "Dash" msgid "Dash"
msgstr "Pikavalikko" msgstr "Pikavalikko"
#: ../js/ui/panel.js:564 #: ../js/ui/panel.js:567
msgid "Quit" msgid "Quit"
msgstr "Lopeta" msgstr "Lopeta"
#. 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:595 #: ../js/ui/panel.js:598
msgid "Activities" msgid "Activities"
msgstr "Toiminnot" msgstr "Toiminnot"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:985
msgid "Top Bar" msgid "Top Bar"
msgstr "Yläpalkki" msgstr "Yläpalkki"
@ -857,7 +857,7 @@ msgstr "Yritä uudelleen"
msgid "Connect to..." msgid "Connect to..."
msgstr "Yhdistä…" msgstr "Yhdistä…"
#: ../js/ui/placeDisplay.js:364 #: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "SIJAINNIT JA LAITTEET" msgstr "SIJAINNIT JA LAITTEET"
@ -1056,7 +1056,7 @@ msgstr "Salli pääsy aina"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Salli vain tällä kerralla" msgstr "Salli vain tällä kerralla"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1168 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1098
msgid "Reject" msgid "Reject"
msgstr "Hylkää" msgstr "Hylkää"
@ -1213,11 +1213,11 @@ msgstr "Yhteys epäonnistui"
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Verkkoyhteyden aktivointi epäonnistui" msgstr "Verkkoyhteyden aktivointi epäonnistui"
#: ../js/ui/status/network.js:1989 #: ../js/ui/status/network.js:1992
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Verkko ei ole käytössä" msgstr "Verkko ei ole käytössä"
#: ../js/ui/status/network.js:2113 #: ../js/ui/status/network.js:2116
msgid "Network Manager" msgid "Network Manager"
msgstr "Verkon hallinta" msgstr "Verkon hallinta"
@ -1317,47 +1317,46 @@ msgstr "Äänenvoimakkuus"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofoni" msgstr "Mikrofoni"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267 #: ../js/ui/telepathyClient.js:225
msgid "Invitation" msgid "Invitation"
msgstr "Kutsu" msgstr "Kutsu"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:278
msgid "Call" msgid "Call"
msgstr "Soita" msgstr "Soita"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:365 #: ../js/ui/telepathyClient.js:294
msgid "File Transfer" msgid "File Transfer"
msgstr "Tiedostonsiirto" msgstr "Tiedostonsiirto"
#: ../js/ui/telepathyClient.js:446 #: ../js/ui/telepathyClient.js:376
msgid "Subscription request" msgid "Subscription request"
msgstr "Tilauspyyntö" msgstr "Tilauspyyntö"
#: ../js/ui/telepathyClient.js:482 #: ../js/ui/telepathyClient.js:412
msgid "Connection error" msgid "Connection error"
msgstr "Yhteysvirhe" msgstr "Yhteysvirhe"
#: ../js/ui/telepathyClient.js:740 #: ../js/ui/telepathyClient.js:670
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s on linjoilla." msgstr "%s on linjoilla."
#: ../js/ui/telepathyClient.js:745 #: ../js/ui/telepathyClient.js:674
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s on poissa linjoilta." msgstr "%s on poissa linjoilta."
#: ../js/ui/telepathyClient.js:748 #: ../js/ui/telepathyClient.js:678
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "%s on poissa." msgstr "%s on poissa."
#: ../js/ui/telepathyClient.js:751 #: ../js/ui/telepathyClient.js:681
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s on kiireinen." msgstr "%s on kiireinen."
@ -1365,35 +1364,35 @@ msgstr "%s on kiireinen."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:964 #: ../js/ui/telepathyClient.js:894
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Lähetetty <b>%Ana</b> kello <b>%H.%M</b>" msgstr "Lähetetty <b>%Ana</b> kello <b>%H.%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Lähetetty <b>%Ana</b> <b>%d. %Bta</b>" msgstr "Lähetetty <b>%Ana</b> <b>%d. %Bta</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975 #: ../js/ui/telepathyClient.js:905
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Lähetetty <b>%Ana</b> <b>%d. %Bta</b> %Y" msgstr "Lähetetty <b>%Ana</b> <b>%d. %Bta</b> %Y"
#. 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.
#: ../js/ui/telepathyClient.js:1017 #: ../js/ui/telepathyClient.js:947
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s on nyt nimeltään %s" msgstr "%s on nyt nimeltään %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119 #: ../js/ui/telepathyClient.js:1049
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Kutsu huoneeseen %s" msgstr "Kutsu huoneeseen %s"
@ -1401,35 +1400,35 @@ msgstr "Kutsu huoneeseen %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1127 #: ../js/ui/telepathyClient.js:1057
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s kutsuu sinut huoneeseen %s" msgstr "%s kutsuu sinut huoneeseen %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209 #: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1237
msgid "Decline" msgid "Decline"
msgstr "Kieltäydy" msgstr "Kieltäydy"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210 #: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1140
#: ../js/ui/telepathyClient.js:1308 #: ../js/ui/telepathyClient.js:1238
msgid "Accept" msgid "Accept"
msgstr "Hyväksy" msgstr "Hyväksy"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160 #: ../js/ui/telepathyClient.js:1090
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videopuhelu käyttäjältä %s" msgstr "Videopuhelu käyttäjältä %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163 #: ../js/ui/telepathyClient.js:1093
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Puhelu käyttäjältä %s" msgstr "Puhelu käyttäjältä %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170 #: ../js/ui/telepathyClient.js:1100
msgid "Answer" msgid "Answer"
msgstr "Vastaa" msgstr "Vastaa"
@ -1438,108 +1437,108 @@ msgstr "Vastaa"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1203 #: ../js/ui/telepathyClient.js:1133
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s on lähettämässä sinulle tiedostoa %s" msgstr "%s on lähettämässä sinulle tiedostoa %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272 #: ../js/ui/telepathyClient.js:1202
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s haluaisi saada luvan nähdä, milloin olet linjoilla" msgstr "%s haluaisi saada luvan nähdä, milloin olet linjoilla"
#: ../js/ui/telepathyClient.js:1365 #: ../js/ui/telepathyClient.js:1295
msgid "Network error" msgid "Network error"
msgstr "Verkkovirhe" msgstr "Verkkovirhe"
#: ../js/ui/telepathyClient.js:1367 #: ../js/ui/telepathyClient.js:1297
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Tunnistautuminen epäonnistui" msgstr "Tunnistautuminen epäonnistui"
#: ../js/ui/telepathyClient.js:1369 #: ../js/ui/telepathyClient.js:1299
msgid "Encryption error" msgid "Encryption error"
msgstr "Salausvirhe" msgstr "Salausvirhe"
#: ../js/ui/telepathyClient.js:1371 #: ../js/ui/telepathyClient.js:1301
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Varmennetta ei annettu" msgstr "Varmennetta ei annettu"
#: ../js/ui/telepathyClient.js:1373 #: ../js/ui/telepathyClient.js:1303
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Varmenteeseen ei luoteta" msgstr "Varmenteeseen ei luoteta"
#: ../js/ui/telepathyClient.js:1375 #: ../js/ui/telepathyClient.js:1305
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Varmenne on vanhentunut" msgstr "Varmenne on vanhentunut"
#: ../js/ui/telepathyClient.js:1377 #: ../js/ui/telepathyClient.js:1307
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Varmennetta ei ole aktivoitu" msgstr "Varmennetta ei ole aktivoitu"
#: ../js/ui/telepathyClient.js:1379 #: ../js/ui/telepathyClient.js:1309
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Varmenteen konenimiristiriita" msgstr "Varmenteen konenimiristiriita"
#: ../js/ui/telepathyClient.js:1381 #: ../js/ui/telepathyClient.js:1311
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Varmenteen sormenjälkiristiriita" msgstr "Varmenteen sormenjälkiristiriita"
#: ../js/ui/telepathyClient.js:1383 #: ../js/ui/telepathyClient.js:1313
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Varmenne on itseallekirjoitettu" msgstr "Varmenne on itseallekirjoitettu"
#: ../js/ui/telepathyClient.js:1385 #: ../js/ui/telepathyClient.js:1315
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Tilaksi on asetettu ”poissa linjoilta”" msgstr "Tilaksi on asetettu ”poissa linjoilta”"
#: ../js/ui/telepathyClient.js:1387 #: ../js/ui/telepathyClient.js:1317
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Salaus ei ole käytettävissä" msgstr "Salaus ei ole käytettävissä"
#: ../js/ui/telepathyClient.js:1389 #: ../js/ui/telepathyClient.js:1319
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Varmenne ei kelpaa" msgstr "Varmenne ei kelpaa"
#: ../js/ui/telepathyClient.js:1391 #: ../js/ui/telepathyClient.js:1321
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Yhteys on evätty" msgstr "Yhteys on evätty"
#: ../js/ui/telepathyClient.js:1393 #: ../js/ui/telepathyClient.js:1323
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Yhteyttä ei voida muodostaa" msgstr "Yhteyttä ei voida muodostaa"
#: ../js/ui/telepathyClient.js:1395 #: ../js/ui/telepathyClient.js:1325
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Yhteys on katkennut" msgstr "Yhteys on katkennut"
#: ../js/ui/telepathyClient.js:1397 #: ../js/ui/telepathyClient.js:1327
msgid "This resource is already connected to the server" msgid "This resource is already connected to the server"
msgstr "Tämä resurssi on jo yhteydessä palvelimeen" msgstr "Tämä resurssi on jo yhteydessä palvelimeen"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1329
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "Yhteys on korvattu uudella samaa resurssia käyttävällä yhteydellä" msgstr "Yhteys on korvattu uudella samaa resurssia käyttävällä yhteydellä"
#: ../js/ui/telepathyClient.js:1401 #: ../js/ui/telepathyClient.js:1331
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Tili on jo olemassa palvelimella" msgstr "Tili on jo olemassa palvelimella"
#: ../js/ui/telepathyClient.js:1403 #: ../js/ui/telepathyClient.js:1333
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Palvelin on tällä hetkellä liian kiireinen käsittelemään yhteyttä" msgstr "Palvelin on tällä hetkellä liian kiireinen käsittelemään yhteyttä"
#: ../js/ui/telepathyClient.js:1405 #: ../js/ui/telepathyClient.js:1335
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Varmenne on kumottu" msgstr "Varmenne on kumottu"
#: ../js/ui/telepathyClient.js:1407 #: ../js/ui/telepathyClient.js:1337
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "Varmenne käyttää turvatonta salausmenetelmää" msgstr "Varmenne käyttää turvatonta salausmenetelmää"
#: ../js/ui/telepathyClient.js:1409 #: ../js/ui/telepathyClient.js:1339
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1548,20 +1547,20 @@ msgstr ""
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419 #: ../js/ui/telepathyClient.js:1349
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Yhteys kohteeseen %s katkesi" msgstr "Yhteys kohteeseen %s katkesi"
#: ../js/ui/telepathyClient.js:1428 #: ../js/ui/telepathyClient.js:1358
msgid "Reconnect" msgid "Reconnect"
msgstr "Yhdistä uudelleen" msgstr "Yhdistä uudelleen"
#: ../js/ui/telepathyClient.js:1429 #: ../js/ui/telepathyClient.js:1359
msgid "Edit account" msgid "Edit account"
msgstr "Muokkaa tiliä" msgstr "Muokkaa tiliä"
#: ../js/ui/telepathyClient.js:1475 #: ../js/ui/telepathyClient.js:1405
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Tuntematon syy" msgstr "Tuntematon syy"
@ -1577,39 +1576,39 @@ msgstr "Jouten"
msgid "Unavailable" msgid "Unavailable"
msgstr "Ei tavoitettavissa" msgstr "Ei tavoitettavissa"
#: ../js/ui/userMenu.js:576 ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:650 #: ../js/ui/userMenu.js:577 ../js/ui/userMenu.js:581 ../js/ui/userMenu.js:651
msgid "Power Off..." msgid "Power Off..."
msgstr "Sammuta…" msgstr "Sammuta…"
#: ../js/ui/userMenu.js:612 #: ../js/ui/userMenu.js:613
msgid "Notifications" msgid "Notifications"
msgstr "Ilmoitukset" msgstr "Ilmoitukset"
#: ../js/ui/userMenu.js:620 #: ../js/ui/userMenu.js:621
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Verkkotilit" msgstr "Verkkotilit"
#: ../js/ui/userMenu.js:624 #: ../js/ui/userMenu.js:625
msgid "System Settings" msgid "System Settings"
msgstr "Järjestelmän asetukset" msgstr "Järjestelmän asetukset"
#: ../js/ui/userMenu.js:631 #: ../js/ui/userMenu.js:632
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Lukitse näyttö" msgstr "Lukitse näyttö"
#: ../js/ui/userMenu.js:636 #: ../js/ui/userMenu.js:637
msgid "Switch User" msgid "Switch User"
msgstr "Vaihda käyttäjää" msgstr "Vaihda käyttäjää"
#: ../js/ui/userMenu.js:641 #: ../js/ui/userMenu.js:642
msgid "Log Out..." msgid "Log Out..."
msgstr "Kirjaudu ulos…" msgstr "Kirjaudu ulos…"
#: ../js/ui/userMenu.js:669 #: ../js/ui/userMenu.js:670
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Pikaviestitilaksi asetetaan ”kiireinen”" msgstr "Pikaviestitilaksi asetetaan ”kiireinen”"
#: ../js/ui/userMenu.js:670 #: ../js/ui/userMenu.js:671
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."
@ -1642,7 +1641,7 @@ msgstr ""
#: ../js/ui/wanda.js:128 #: ../js/ui/wanda.js:128
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "" msgstr "%s, sanoo oraakkeli"
#: ../js/ui/wanda.js:168 #: ../js/ui/wanda.js:168
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
@ -1683,7 +1682,7 @@ msgstr "Tulosta versio"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "GDM:n kirjautumisruudussa käyttämä tila" msgstr "GDM:n kirjautumisruudussa käyttämä tila"
#: ../src/shell-app.c:639 #: ../src/shell-app.c:616
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Sovelluksen ”%s” käynnistäminen epäonnistui" msgstr "Sovelluksen ”%s” käynnistäminen epäonnistui"

902
po/ga.po

File diff suppressed because it is too large Load Diff

461
po/gl.po

File diff suppressed because it is too large Load Diff

277
po/he.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-12-30 10:49+0200\n" "POT-Creation-Date: 2012-01-28 11:25+0200\n"
"PO-Revision-Date: 2011-12-30 10:50+0200\n" "PO-Revision-Date: 2012-01-28 11:25+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n" "Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <sh.yaron@gmail.com>\n" "Language-Team: Hebrew <sh.yaron@gmail.com>\n"
"Language: he\n" "Language: he\n"
@ -130,30 +130,30 @@ msgstr "באיזו מקלדת להשתמש"
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "disabled OpenSearch providers" msgstr "disabled OpenSearch providers"
#: ../js/gdm/loginDialog.js:623 #: ../js/gdm/loginDialog.js:624
msgid "Session..." msgid "Session..."
msgstr "הפעלה..." msgstr "הפעלה..."
#: ../js/gdm/loginDialog.js:785 #: ../js/gdm/loginDialog.js:786
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "כניסה" msgstr "כניסה"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830 #: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(או להעביר אצבע)" msgstr "(או להעביר אצבע)"
#. 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:851 #: ../js/gdm/loginDialog.js:852
msgid "Not listed?" msgid "Not listed?"
msgstr "לא רשום?" msgstr "לא רשום?"
#: ../js/gdm/loginDialog.js:1019 #: ../js/gdm/loginDialog.js:1020
#: ../js/ui/endSessionDialog.js:418 #: ../js/ui/endSessionDialog.js:419
#: ../js/ui/extensionSystem.js:516 #: ../js/ui/extensionSystem.js:516
#: ../js/ui/networkAgent.js:145 #: ../js/ui/networkAgent.js:145
#: ../js/ui/polkitAuthenticationAgent.js:175 #: ../js/ui/polkitAuthenticationAgent.js:175
@ -161,19 +161,19 @@ msgstr "לא רשום?"
msgid "Cancel" msgid "Cancel"
msgstr "ביטול" msgstr "ביטול"
#: ../js/gdm/loginDialog.js:1024 #: ../js/gdm/loginDialog.js:1025
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "כניסה" msgstr "כניסה"
#: ../js/gdm/loginDialog.js:1376 #: ../js/gdm/loginDialog.js:1377
msgid "Login Window" msgid "Login Window"
msgstr "חלון כניסה" msgstr "חלון כניסה"
#: ../js/gdm/powerMenu.js:113 #: ../js/gdm/powerMenu.js:113
#: ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580 #: ../js/ui/userMenu.js:580
#: ../js/ui/userMenu.js:649 #: ../js/ui/userMenu.js:582
#: ../js/ui/userMenu.js:651
msgid "Suspend" msgid "Suspend"
msgstr "השהיה" msgstr "השהיה"
@ -395,9 +395,9 @@ msgid "Next week"
msgstr "בשבוע הבא" msgstr "בשבוע הבא"
#: ../js/ui/contactDisplay.js:63 #: ../js/ui/contactDisplay.js:63
#: ../js/ui/notificationDaemon.js:466 #: ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:215
#: ../src/shell-app.c:394 #: ../src/shell-app.c:372
msgid "Unknown" msgid "Unknown"
msgstr "לא ידוע" msgstr "לא ידוע"
@ -420,7 +420,7 @@ msgstr "עסוק"
msgid "Offline" msgid "Offline"
msgstr "מנותק" msgstr "מנותק"
#: ../js/ui/contactDisplay.js:141 #: ../js/ui/contactDisplay.js:148
msgid "CONTACTS" msgid "CONTACTS"
msgstr "אנשי קשר" msgstr "אנשי קשר"
@ -429,58 +429,58 @@ msgstr "אנשי קשר"
msgid "Remove" msgid "Remove"
msgstr "הסרה" msgstr "הסרה"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "הגדרות תאריך ושעה" msgstr "הגדרות תאריך ושעה"
#: ../js/ui/dateMenu.js:122 #: ../js/ui/dateMenu.js:123
msgid "Open Calendar" msgid "Open Calendar"
msgstr "פתיחת היומן" msgstr "פתיחת היומן"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S" msgstr "%a %b %e, %R:%S"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %b %e, %R" msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:185 #: ../js/ui/dateMenu.js:186
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:187
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:193 #: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p" msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:195
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p" msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:198 #: ../js/ui/dateMenu.js:199
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:200
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. 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:210 #: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A ה־%e ב%B, %Y" msgstr "%A ה־%e ב%B, %Y"
@ -661,7 +661,7 @@ msgstr "ביטול ההשתקה"
msgid "Mute" msgid "Mute"
msgstr "השתקה" msgstr "השתקה"
#: ../js/ui/messageTray.js:2444 #: ../js/ui/messageTray.js:2446
msgid "System Information" msgid "System Information"
msgstr "פרטי המערכת" msgstr "פרטי המערכת"
@ -763,17 +763,17 @@ msgstr "יישומים"
msgid "Dash" msgid "Dash"
msgstr "חלונית" msgstr "חלונית"
#: ../js/ui/panel.js:564 #: ../js/ui/panel.js:572
msgid "Quit" msgid "Quit"
msgstr "יציאה" msgstr "יציאה"
#. 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:595 #: ../js/ui/panel.js:603
msgid "Activities" msgid "Activities"
msgstr "פעילויות" msgstr "פעילויות"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:990
msgid "Top Bar" msgid "Top Bar"
msgstr "הסרגל העליון" msgstr "הסרגל העליון"
@ -790,7 +790,7 @@ msgstr "ניסיון חוזר"
msgid "Connect to..." msgid "Connect to..."
msgstr "התחברות אל..." msgstr "התחברות אל..."
#: ../js/ui/placeDisplay.js:364 #: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים" msgstr "מקומות והתקנים"
@ -823,7 +823,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:719 #: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -859,6 +859,10 @@ msgstr "הסתרת טקסט"
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "ססמה שגויה, נא לנסות שוב" msgstr "ססמה שגויה, נא לנסות שוב"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "נגישות"
#: ../js/ui/status/accessibility.js:52 #: ../js/ui/status/accessibility.js:52
msgid "Zoom" msgid "Zoom"
msgstr "תקריב" msgstr "תקריב"
@ -902,13 +906,14 @@ msgstr "ניגודיות גבוהה"
msgid "Large Text" msgid "Large Text"
msgstr "טקסט גדול" msgstr "טקסט גדול"
#: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:35 #: ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258 #: ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341 #: ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407 #: ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 #: ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892 #: ../js/ui/status/network.js:893
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -930,7 +935,7 @@ msgstr "הגדרות Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:107 #: ../js/ui/status/bluetooth.js:107
#: ../js/ui/status/network.js:255 #: ../js/ui/status/network.js:256
msgid "hardware disabled" msgid "hardware disabled"
msgstr "מנוטרל חומרתית" msgstr "מנוטרל חומרתית"
@ -939,12 +944,12 @@ msgid "Connection"
msgstr "חיבור" msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:214 #: ../js/ui/status/bluetooth.js:214
#: ../js/ui/status/network.js:490 #: ../js/ui/status/network.js:491
msgid "disconnecting..." msgid "disconnecting..."
msgstr "בהליכי ניתוק..." msgstr "בהליכי ניתוק..."
#: ../js/ui/status/bluetooth.js:227 #: ../js/ui/status/bluetooth.js:227
#: ../js/ui/status/network.js:496 #: ../js/ui/status/network.js:497
msgid "connecting..." msgid "connecting..."
msgstr "בהתחברות..." msgstr "בהתחברות..."
@ -997,7 +1002,7 @@ msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד" msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:382 #: ../js/ui/status/bluetooth.js:382
#: ../js/ui/telepathyClient.js:1168 #: ../js/ui/telepathyClient.js:1098
msgid "Reject" msgid "Reject"
msgstr "סירוב" msgstr "סירוב"
@ -1051,121 +1056,129 @@ msgid "<unknown>"
msgstr "<לא ידוע>" msgstr "<לא ידוע>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:277 #: ../js/ui/status/network.js:278
msgid "disabled" msgid "disabled"
msgstr "מנוטרל" msgstr "מנוטרל"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:488 #: ../js/ui/status/network.js:489
msgid "unmanaged" 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:499 #: ../js/ui/status/network.js:500
msgid "authentication required" msgid "authentication required"
msgstr "נדרש אימות" msgstr "נדרש אימות"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:509 #: ../js/ui/status/network.js:510
msgid "firmware missing" msgid "firmware missing"
msgstr "הקושחה חסרה" msgstr "הקושחה חסרה"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:516 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "הכבל מנותק" msgstr "הכבל מנותק"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:522
msgid "unavailable" msgid "unavailable"
msgstr "לא זמין" msgstr "לא זמין"
#: ../js/ui/status/network.js:523 #: ../js/ui/status/network.js:524
msgid "connection failed" msgid "connection failed"
msgstr "החיבור נכשל" msgstr "החיבור נכשל"
#: ../js/ui/status/network.js:584 #: ../js/ui/status/network.js:585
#: ../js/ui/status/network.js:1504 #: ../js/ui/status/network.js:1505
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:620 #: ../js/ui/status/network.js:621
#: ../js/ui/status/network.js:1439 #: ../js/ui/status/network.js:1440
msgid "Connected (private)" msgid "Connected (private)"
msgstr "מחובר (פרטי)" msgstr "מחובר (פרטי)"
#: ../js/ui/status/network.js:695 #: ../js/ui/status/network.js:696
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "אתרנט אוטומטי" msgstr "אתרנט אוטומטי"
#: ../js/ui/status/network.js:756 #: ../js/ui/status/network.js:757
msgid "Auto broadband" msgid "Auto broadband"
msgstr "פס רחב אוטומטי" msgstr "פס רחב אוטומטי"
#: ../js/ui/status/network.js:759 #: ../js/ui/status/network.js:760
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:878 #: ../js/ui/status/network.js:879
#: ../js/ui/status/network.js:1451 #: ../js/ui/status/network.js:1452
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s אוטומטי" msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:880 #: ../js/ui/status/network.js:881
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Bluetooth אוטומטי" msgstr "Bluetooth אוטומטי"
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1454
msgid "Auto wireless" msgid "Auto wireless"
msgstr "אלחוטי אוטומטי" msgstr "אלחוטי אוטומטי"
#: ../js/ui/status/network.js:1547 #: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "רשת"
#: ../js/ui/status/network.js:1548
msgid "Enable networking" msgid "Enable networking"
msgstr "הפעלת תכונת הרשת" msgstr "הפעלת תכונת הרשת"
#: ../js/ui/status/network.js:1559 #: ../js/ui/status/network.js:1560
msgid "Wired" msgid "Wired"
msgstr "קווי" msgstr "קווי"
#: ../js/ui/status/network.js:1570 #: ../js/ui/status/network.js:1571
msgid "Wireless" msgid "Wireless"
msgstr "אלחוטי" msgstr "אלחוטי"
#: ../js/ui/status/network.js:1580 #: ../js/ui/status/network.js:1581
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "פס־רחב נייד" msgstr "פס־רחב נייד"
#: ../js/ui/status/network.js:1590 #: ../js/ui/status/network.js:1591
msgid "VPN Connections" msgid "VPN Connections"
msgstr "חיבורי VPN" msgstr "חיבורי VPN"
#: ../js/ui/status/network.js:1601 #: ../js/ui/status/network.js:1602
msgid "Network Settings" msgid "Network Settings"
msgstr "הגדרות הרשת" msgstr "הגדרות הרשת"
#: ../js/ui/status/network.js:1738 #: ../js/ui/status/network.js:1739
msgid "Connection failed" msgid "Connection failed"
msgstr "ההתחברות נכשל" msgstr "ההתחברות נכשל"
#: ../js/ui/status/network.js:1739 #: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "הפעלת חיבור הרשת נכשלה" msgstr "הפעלת חיבור הרשת נכשלה"
#: ../js/ui/status/network.js:1989 #: ../js/ui/status/network.js:1993
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "תכונת הרשת מנוטרלת" msgstr "תכונת הרשת מנוטרלת"
#: ../js/ui/status/network.js:2113 #: ../js/ui/status/network.js:2117
msgid "Network Manager" msgid "Network Manager"
msgstr "מנהל הרשתות" msgstr "מנהל הרשתות"
#: ../js/ui/status/power.js:60
msgid "Battery"
msgstr "סוללה"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
msgid "Power Settings" msgid "Power Settings"
msgstr "הגדרות צריכת החשמל" msgstr "הגדרות צריכת החשמל"
@ -1259,6 +1272,7 @@ msgstr "טבלת שליטה"
msgid "Computer" msgid "Computer"
msgstr "מחשב" msgstr "מחשב"
#: ../js/ui/status/volume.js:25
#: ../js/ui/status/volume.js:38 #: ../js/ui/status/volume.js:38
msgid "Volume" msgid "Volume"
msgstr "עצמה" msgstr "עצמה"
@ -1267,47 +1281,46 @@ msgstr "עצמה"
msgid "Microphone" msgid "Microphone"
msgstr "מיקרופון" msgstr "מיקרופון"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267 #: ../js/ui/telepathyClient.js:225
msgid "Invitation" msgid "Invitation"
msgstr "הזמנה" msgstr "הזמנה"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:278
msgid "Call" msgid "Call"
msgstr "התקשרות" msgstr "התקשרות"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:365 #: ../js/ui/telepathyClient.js:294
msgid "File Transfer" msgid "File Transfer"
msgstr "העברת קבצים" msgstr "העברת קבצים"
#: ../js/ui/telepathyClient.js:446 #: ../js/ui/telepathyClient.js:376
msgid "Subscription request" msgid "Subscription request"
msgstr "בקשת הרשמה" msgstr "בקשת הרשמה"
#: ../js/ui/telepathyClient.js:482 #: ../js/ui/telepathyClient.js:412
msgid "Connection error" msgid "Connection error"
msgstr "שגיאת התחברות" msgstr "שגיאת התחברות"
#: ../js/ui/telepathyClient.js:740 #: ../js/ui/telepathyClient.js:670
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s התחבר/ה." msgstr "%s התחבר/ה."
#: ../js/ui/telepathyClient.js:745 #: ../js/ui/telepathyClient.js:674
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s התנתק/ה." msgstr "%s התנתק/ה."
#: ../js/ui/telepathyClient.js:748 #: ../js/ui/telepathyClient.js:678
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "'%s' מרוחק/ת." msgstr "'%s' מרוחק/ת."
#: ../js/ui/telepathyClient.js:751 #: ../js/ui/telepathyClient.js:681
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s עסוק/ה." msgstr "%s עסוק/ה."
@ -1315,35 +1328,35 @@ msgstr "%s עסוק/ה."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:964 #: ../js/ui/telepathyClient.js:894
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "נשלח ב־<b>%X</b> בשעה <b>%A</b>" msgstr "נשלח ב־<b>%X</b> בשעה <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>" msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975 #: ../js/ui/telepathyClient.js:905
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>, %Y" msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>, %Y"
#. 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.
#: ../js/ui/telepathyClient.js:1017 #: ../js/ui/telepathyClient.js:947
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "השם של %s הוחלף ל־%s" msgstr "השם של %s הוחלף ל־%s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119 #: ../js/ui/telepathyClient.js:1049
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "הזמנה ל־%s" msgstr "הזמנה ל־%s"
@ -1351,37 +1364,37 @@ msgstr "הזמנה ל־%s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1127 #: ../js/ui/telepathyClient.js:1057
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "הוזמנת על ידי %s להצטרף אל %s" msgstr "הוזמנת על ידי %s להצטרף אל %s"
#: ../js/ui/telepathyClient.js:1129 #: ../js/ui/telepathyClient.js:1059
#: ../js/ui/telepathyClient.js:1209 #: ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1236
msgid "Decline" msgid "Decline"
msgstr "דחייה" msgstr "דחייה"
#: ../js/ui/telepathyClient.js:1130 #: ../js/ui/telepathyClient.js:1060
#: ../js/ui/telepathyClient.js:1210 #: ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1308 #: ../js/ui/telepathyClient.js:1237
msgid "Accept" msgid "Accept"
msgstr "אישור" msgstr "אישור"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160 #: ../js/ui/telepathyClient.js:1090
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "שיחת וידאו מאת %s" msgstr "שיחת וידאו מאת %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163 #: ../js/ui/telepathyClient.js:1093
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "שיחה מאת %s" msgstr "שיחה מאת %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170 #: ../js/ui/telepathyClient.js:1100
msgid "Answer" msgid "Answer"
msgstr "מענה" msgstr "מענה"
@ -1390,125 +1403,125 @@ msgstr "מענה"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1203 #: ../js/ui/telepathyClient.js:1132
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s שולח/ת אליך %s" msgstr "%s שולח/ת אליך %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272 #: ../js/ui/telepathyClient.js:1201
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון" msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
#: ../js/ui/telepathyClient.js:1365 #: ../js/ui/telepathyClient.js:1294
msgid "Network error" msgid "Network error"
msgstr "שגיאת רשת" msgstr "שגיאת רשת"
#: ../js/ui/telepathyClient.js:1367 #: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed" msgid "Authentication failed"
msgstr "האימות נכשל" msgstr "האימות נכשל"
#: ../js/ui/telepathyClient.js:1369 #: ../js/ui/telepathyClient.js:1298
msgid "Encryption error" msgid "Encryption error"
msgstr "שגיאת הצפנה" msgstr "שגיאת הצפנה"
#: ../js/ui/telepathyClient.js:1371 #: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "לא סופק אישור" msgstr "לא סופק אישור"
#: ../js/ui/telepathyClient.js:1373 #: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "האישור אינו מהימן" msgstr "האישור אינו מהימן"
#: ../js/ui/telepathyClient.js:1375 #: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired" msgid "Certificate expired"
msgstr "האישור פג" msgstr "האישור פג"
#: ../js/ui/telepathyClient.js:1377 #: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "האישור לא מופעל" msgstr "האישור לא מופעל"
#: ../js/ui/telepathyClient.js:1379 #: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "שם המארח באישור אינו תואם" msgstr "שם המארח באישור אינו תואם"
#: ../js/ui/telepathyClient.js:1381 #: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "חוסר התאמה בטביעת האצבע של האישור" msgstr "חוסר התאמה בטביעת האצבע של האישור"
#: ../js/ui/telepathyClient.js:1383 #: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "אישור בחתימה עצמית" msgstr "אישור בחתימה עצמית"
#: ../js/ui/telepathyClient.js:1385 #: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "המצב הוגדר ל'מנותק'" msgstr "המצב הוגדר ל'מנותק'"
#: ../js/ui/telepathyClient.js:1387 #: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "ההצפנה אינה זמינה" msgstr "ההצפנה אינה זמינה"
#: ../js/ui/telepathyClient.js:1389 #: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "האישור אינו תקף" msgstr "האישור אינו תקף"
#: ../js/ui/telepathyClient.js:1391 #: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "ההתחברות נשללה" msgstr "ההתחברות נשללה"
#: ../js/ui/telepathyClient.js:1393 #: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "לא ניתן להפעיל את החיבור" msgstr "לא ניתן להפעיל את החיבור"
#: ../js/ui/telepathyClient.js:1395 #: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "החיבור אבד" msgstr "החיבור אבד"
#: ../js/ui/telepathyClient.js:1397 #: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server" msgid "This resource is already connected to the server"
msgstr "משאב זה כבר מחובר לשרת" msgstr "משאב זה כבר מחובר לשרת"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1328
msgid "Connection has been replaced by a new connection using the same resource" msgid "Connection has been replaced by a new connection using the same resource"
msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב" msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב"
#: ../js/ui/telepathyClient.js:1401 #: ../js/ui/telepathyClient.js:1330
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "החשבון כבר קיים בשרת" msgstr "החשבון כבר קיים בשרת"
#: ../js/ui/telepathyClient.js:1403 #: ../js/ui/telepathyClient.js:1332
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור" msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור"
#: ../js/ui/telepathyClient.js:1405 #: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "האישור נשלל" msgstr "האישור נשלל"
#: ../js/ui/telepathyClient.js:1407 #: ../js/ui/telepathyClient.js:1336
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "האישור משתמש באלגוריתם הצפנה שאינו בטוח או חלש מבחינת הצפנה" msgstr "האישור משתמש באלגוריתם הצפנה שאינו בטוח או חלש מבחינת הצפנה"
#: ../js/ui/telepathyClient.js:1409 #: ../js/ui/telepathyClient.js:1338
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library" msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
msgstr "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי ספריית ההצפנה" msgstr "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי ספריית ההצפנה"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419 #: ../js/ui/telepathyClient.js:1348
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "החיבור אל %s נכשל" msgstr "החיבור אל %s נכשל"
#: ../js/ui/telepathyClient.js:1428 #: ../js/ui/telepathyClient.js:1357
msgid "Reconnect" msgid "Reconnect"
msgstr "התחברות מחדש" msgstr "התחברות מחדש"
#: ../js/ui/telepathyClient.js:1429 #: ../js/ui/telepathyClient.js:1358
msgid "Edit account" msgid "Edit account"
msgstr "עריכת חשבון" msgstr "עריכת חשבון"
#: ../js/ui/telepathyClient.js:1475 #: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason" msgid "Unknown reason"
msgstr "סיבה לא ידועה" msgstr "סיבה לא ידועה"
@ -1524,41 +1537,41 @@ msgstr "בהמתנה"
msgid "Unavailable" msgid "Unavailable"
msgstr "לא זמין" msgstr "לא זמין"
#: ../js/ui/userMenu.js:576 #: ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580 #: ../js/ui/userMenu.js:582
#: ../js/ui/userMenu.js:650 #: ../js/ui/userMenu.js:652
msgid "Power Off..." msgid "Power Off..."
msgstr "כיבוי..." msgstr "כיבוי..."
#: ../js/ui/userMenu.js:612 #: ../js/ui/userMenu.js:614
msgid "Notifications" msgid "Notifications"
msgstr "התרעות" msgstr "התרעות"
#: ../js/ui/userMenu.js:620 #: ../js/ui/userMenu.js:622
msgid "Online Accounts" msgid "Online Accounts"
msgstr "חשבונות מקוונים" msgstr "חשבונות מקוונים"
#: ../js/ui/userMenu.js:624 #: ../js/ui/userMenu.js:626
msgid "System Settings" msgid "System Settings"
msgstr "הגדרות המערכת" msgstr "הגדרות המערכת"
#: ../js/ui/userMenu.js:631 #: ../js/ui/userMenu.js:633
msgid "Lock Screen" msgid "Lock Screen"
msgstr "נעילת המסך" msgstr "נעילת המסך"
#: ../js/ui/userMenu.js:636 #: ../js/ui/userMenu.js:638
msgid "Switch User" msgid "Switch User"
msgstr "החלפת משתמש" msgstr "החלפת משתמש"
#: ../js/ui/userMenu.js:641 #: ../js/ui/userMenu.js:643
msgid "Log Out..." msgid "Log Out..."
msgstr "ניתוק..." msgstr "ניתוק..."
#: ../js/ui/userMenu.js:669 #: ../js/ui/userMenu.js:671
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "מצב הצ׳אט שלך יוגדר ל'עסוק'" msgstr "מצב הצ׳אט שלך יוגדר ל'עסוק'"
#: ../js/ui/userMenu.js:670 #: ../js/ui/userMenu.js:672
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי." msgstr "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי."
@ -1630,7 +1643,7 @@ msgstr "Print version"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "המצב בו GDM יעשה שימוש לצורך מסך הכניסה" msgstr "המצב בו GDM יעשה שימוש לצורך מסך הכניסה"
#: ../src/shell-app.c:639 #: ../src/shell-app.c:617
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "אירע כשל בטעינת '%s'" msgstr "אירע כשל בטעינת '%s'"
@ -1643,7 +1656,7 @@ msgstr "בריטניה"
msgid "Default" msgid "Default"
msgstr "בררת מחדל" msgstr "בררת מחדל"
#: ../src/shell-polkit-authentication-agent.c:334 #: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות" msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"

265
po/nb.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 3.3.x\n" "Project-Id-Version: gnome-shell 3.3.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-06 21:16+0100\n" "POT-Creation-Date: 2012-01-28 15:53+0100\n"
"PO-Revision-Date: 2012-01-06 21:18+0100\n" "PO-Revision-Date: 2012-01-28 15:53+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"
@ -173,45 +173,45 @@ msgstr ""
"og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt " "og bruke denne filendelsen. Den bør endres når du gjør opptak til et nytt "
"oppbevaringsformat." "oppbevaringsformat."
#: ../js/gdm/loginDialog.js:623 #: ../js/gdm/loginDialog.js:624
msgid "Session..." msgid "Session..."
msgstr "Økt …" msgstr "Økt …"
#: ../js/gdm/loginDialog.js:785 #: ../js/gdm/loginDialog.js:786
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#. Translators: this message is shown below the password entry field #. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead #. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830 #: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(eller dra finger)" msgstr "(eller dra finger)"
#. 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:851 #: ../js/gdm/loginDialog.js:852
msgid "Not listed?" msgid "Not listed?"
msgstr "Ikke listet?" msgstr "Ikke listet?"
#: ../js/gdm/loginDialog.js:1019 ../js/ui/endSessionDialog.js:418 #: ../js/gdm/loginDialog.js:1020 ../js/ui/endSessionDialog.js:419
#: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145 #: ../js/ui/extensionSystem.js:516 ../js/ui/networkAgent.js:145
#: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462 #: ../js/ui/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:1024 #: ../js/gdm/loginDialog.js:1025
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Logg inn" msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:1376 #: ../js/gdm/loginDialog.js:1377
msgid "Login Window" msgid "Login Window"
msgstr "Innloggingsvindu" msgstr "Innloggingsvindu"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578 #: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:580
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649 #: ../js/ui/userMenu.js:582 ../js/ui/userMenu.js:651
msgid "Suspend" msgid "Suspend"
msgstr "Hvilemodus" msgstr "Hvilemodus"
@ -433,7 +433,7 @@ msgid "Next week"
msgstr "Neste uke" msgstr "Neste uke"
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486 #: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:394 #: ../js/ui/status/power.js:215 ../src/shell-app.c:372
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
@ -453,7 +453,7 @@ msgstr "Opptatt"
msgid "Offline" msgid "Offline"
msgstr "Frakoblet" msgstr "Frakoblet"
#: ../js/ui/contactDisplay.js:141 #: ../js/ui/contactDisplay.js:148
msgid "CONTACTS" msgid "CONTACTS"
msgstr "KONTAKTER" msgstr "KONTAKTER"
@ -461,58 +461,58 @@ msgstr "KONTAKTER"
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:97
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:122 #: ../js/ui/dateMenu.js:123
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Åpne kalender" msgstr "Åpne kalender"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S" msgstr "%a %e %b, %R.%S"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e %b, %R" msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:185 #: ../js/ui/dateMenu.js:186
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R.%S" msgstr "%a %R.%S"
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:187
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:193 #: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %p" msgstr "%a %e %b, %l.%M.%S %p"
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:195
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l.%M %p" msgstr "%a %e %b, %l.%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:198 #: ../js/ui/dateMenu.js:199
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %p" msgstr "%a %l.%M.%S %p"
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:200
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l.%M %p" msgstr "%a %l.%M %p"
#. 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:210 #: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@ -689,7 +689,7 @@ msgstr "Fjern demping"
msgid "Mute" msgid "Mute"
msgstr "Demp" msgstr "Demp"
#: ../js/ui/messageTray.js:2444 #: ../js/ui/messageTray.js:2446
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
@ -792,17 +792,17 @@ msgstr "Programmer"
msgid "Dash" msgid "Dash"
msgstr "Favoritter" msgstr "Favoritter"
#: ../js/ui/panel.js:564 #: ../js/ui/panel.js:572
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:595 #: ../js/ui/panel.js:603
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:990
msgid "Top Bar" msgid "Top Bar"
msgstr "Topp-panel" msgstr "Topp-panel"
@ -819,7 +819,7 @@ msgstr "Prøv igjen"
msgid "Connect to..." msgid "Connect to..."
msgstr "Koble til …" msgstr "Koble til …"
#: ../js/ui/placeDisplay.js:364 #: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER" msgstr "STEDER & ENHETER"
@ -852,7 +852,7 @@ msgstr "Passord:"
#. "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:719 #: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -888,6 +888,10 @@ msgstr "Skjul tekst"
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "Feil passord. Prøv igjen" msgstr "Feil passord. Prøv igjen"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Tilgjengelighet"
#: ../js/ui/status/accessibility.js:52 #: ../js/ui/status/accessibility.js:52
msgid "Zoom" msgid "Zoom"
msgstr "Zoom" msgstr "Zoom"
@ -931,10 +935,10 @@ msgstr "Høy kontrast"
msgid "Large Text" msgid "Large Text"
msgstr "Stor tekst" msgstr "Stor tekst"
#: ../js/ui/status/bluetooth.js:35 ../js/ui/status/bluetooth.js:258 #: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:341 ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:436 #: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/network.js:892 #: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -955,7 +959,7 @@ msgid "Bluetooth Settings"
msgstr "Innstillinger for Bluetooth" msgstr "Innstillinger for Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:255 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/network.js:256
msgid "hardware disabled" msgid "hardware disabled"
msgstr "maskinvare slått av" msgstr "maskinvare slått av"
@ -963,11 +967,11 @@ msgstr "maskinvare slått av"
msgid "Connection" msgid "Connection"
msgstr "Tilkobling" msgstr "Tilkobling"
#: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:490 #: ../js/ui/status/bluetooth.js:214 ../js/ui/status/network.js:491
msgid "disconnecting..." msgid "disconnecting..."
msgstr "kobler fra …" msgstr "kobler fra …"
#: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:496 #: ../js/ui/status/bluetooth.js:227 ../js/ui/status/network.js:497
msgid "connecting..." msgid "connecting..."
msgstr "kobler til …" msgstr "kobler til …"
@ -1018,7 +1022,7 @@ msgstr "Alltid gi tilgang"
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Gi tilgang kun denne ene gangen" msgstr "Gi tilgang kun denne ene gangen"
#: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1168 #: ../js/ui/status/bluetooth.js:382 ../js/ui/telepathyClient.js:1098
msgid "Reject" msgid "Reject"
msgstr "Avvis" msgstr "Avvis"
@ -1071,118 +1075,126 @@ msgid "<unknown>"
msgstr "<ukjent>" msgstr "<ukjent>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:277 #: ../js/ui/status/network.js:278
msgid "disabled" msgid "disabled"
msgstr "slått av" msgstr "slått av"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:488 #: ../js/ui/status/network.js:489
msgid "unmanaged" msgid "unmanaged"
msgstr "ikke håndtert" msgstr "ikke håndtert"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:499 #: ../js/ui/status/network.js:500
msgid "authentication required" msgid "authentication required"
msgstr "autentisering kreves" msgstr "autentisering kreves"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:509 #: ../js/ui/status/network.js:510
msgid "firmware missing" msgid "firmware missing"
msgstr "fastvare mangler" msgstr "fastvare mangler"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:516 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel koblet fra" msgstr "kabel koblet fra"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:522
msgid "unavailable" msgid "unavailable"
msgstr "ikke tilgjengelig" msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:523 #: ../js/ui/status/network.js:524
msgid "connection failed" msgid "connection failed"
msgstr "tilkobling feilet" msgstr "tilkobling feilet"
#: ../js/ui/status/network.js:584 ../js/ui/status/network.js:1504 #: ../js/ui/status/network.js:585 ../js/ui/status/network.js:1505
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:620 ../js/ui/status/network.js:1439 #: ../js/ui/status/network.js:621 ../js/ui/status/network.js:1440
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Tilkoblet (privat)" msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:695 #: ../js/ui/status/network.js:696
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Automatisk Ethernet" msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:756 #: ../js/ui/status/network.js:757
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Automatisk bredbånd" msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:759 #: ../js/ui/status/network.js:760
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:878 ../js/ui/status/network.js:1451 #: ../js/ui/status/network.js:879 ../js/ui/status/network.js:1452
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Automatisk %s" msgstr "Automatisk %s"
#: ../js/ui/status/network.js:880 #: ../js/ui/status/network.js:881
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth" msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1454
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Automatisk trådløst" msgstr "Automatisk trådløst"
#: ../js/ui/status/network.js:1547 #: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Nettverk"
#: ../js/ui/status/network.js:1548
msgid "Enable networking" msgid "Enable networking"
msgstr "Slå på nettverk" msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1559 #: ../js/ui/status/network.js:1560
msgid "Wired" msgid "Wired"
msgstr "Kablet" msgstr "Kablet"
#: ../js/ui/status/network.js:1570 #: ../js/ui/status/network.js:1571
msgid "Wireless" msgid "Wireless"
msgstr "Trådløst" msgstr "Trådløst"
#: ../js/ui/status/network.js:1580 #: ../js/ui/status/network.js:1581
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilt bredbånd" msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:1590 #: ../js/ui/status/network.js:1591
msgid "VPN Connections" msgid "VPN Connections"
msgstr "VPN-tilkoblinger" msgstr "VPN-tilkoblinger"
#: ../js/ui/status/network.js:1601 #: ../js/ui/status/network.js:1602
msgid "Network Settings" msgid "Network Settings"
msgstr "Innstillinger for nettverk" msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1738 #: ../js/ui/status/network.js:1739
msgid "Connection failed" msgid "Connection failed"
msgstr "Tilkobling feilet" msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1739 #: ../js/ui/status/network.js:1740
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:1989 #: ../js/ui/status/network.js:1993
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Nettverk er slått av" msgstr "Nettverk er slått av"
#: ../js/ui/status/network.js:2113 #: ../js/ui/status/network.js:2117
msgid "Network Manager" msgid "Network Manager"
msgstr "Nettverkshåndtering" msgstr "Nettverkshåndtering"
#: ../js/ui/status/power.js:60
msgid "Battery"
msgstr "Batteri"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
msgid "Power Settings" msgid "Power Settings"
msgstr "Innstillinger for strøm" msgstr "Innstillinger for strøm"
@ -1271,7 +1283,7 @@ msgstr "Nettbrett"
msgid "Computer" msgid "Computer"
msgstr "Datamaskin" msgstr "Datamaskin"
#: ../js/ui/status/volume.js:38 #: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:38
msgid "Volume" msgid "Volume"
msgstr "Volum" msgstr "Volum"
@ -1279,47 +1291,46 @@ msgstr "Volum"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267 #: ../js/ui/telepathyClient.js:225
msgid "Invitation" msgid "Invitation"
msgstr "Invitasjon" msgstr "Invitasjon"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:278
msgid "Call" msgid "Call"
msgstr "Ring" msgstr "Ring"
#. We got the TpContact #. We got the TpContact
#: ../js/ui/telepathyClient.js:365 #: ../js/ui/telepathyClient.js:294
msgid "File Transfer" msgid "File Transfer"
msgstr "Filoverføring" msgstr "Filoverføring"
#: ../js/ui/telepathyClient.js:446 #: ../js/ui/telepathyClient.js:376
msgid "Subscription request" msgid "Subscription request"
msgstr "Forespørsel om abbonering" msgstr "Forespørsel om abbonering"
#: ../js/ui/telepathyClient.js:482 #: ../js/ui/telepathyClient.js:412
msgid "Connection error" msgid "Connection error"
msgstr "Feil ved tilkobling" msgstr "Feil ved tilkobling"
#: ../js/ui/telepathyClient.js:740 #: ../js/ui/telepathyClient.js:670
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s er tilkoblet." msgstr "%s er tilkoblet."
#: ../js/ui/telepathyClient.js:745 #: ../js/ui/telepathyClient.js:674
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s er frakoblet." msgstr "%s er frakoblet."
#: ../js/ui/telepathyClient.js:748 #: ../js/ui/telepathyClient.js:678
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "«%s» er borte." msgstr "«%s» er borte."
#: ../js/ui/telepathyClient.js:751 #: ../js/ui/telepathyClient.js:681
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s er opptatt." msgstr "%s er opptatt."
@ -1327,35 +1338,35 @@ msgstr "%s er opptatt."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:964 #: ../js/ui/telepathyClient.js:894
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Sendt <b>%X</b> på <b>%A</b>" msgstr "Sendt <b>%X</b> på <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970 #: ../js/ui/telepathyClient.js:900
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Sendt <b>%A</b>, <b>%B %d</b>" msgstr "Sendt <b>%A</b>, <b>%B %d</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975 #: ../js/ui/telepathyClient.js:905
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Sendt <b>%A</b>, <b>%B %d</b>, %Y" msgstr "Sendt <b>%A</b>, <b>%B %d</b>, %Y"
#. 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.
#: ../js/ui/telepathyClient.js:1017 #: ../js/ui/telepathyClient.js:947
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s er nå kjent som %s" msgstr "%s er nå kjent som %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119 #: ../js/ui/telepathyClient.js:1049
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Invitasjon til %s" msgstr "Invitasjon til %s"
@ -1363,35 +1374,35 @@ msgstr "Invitasjon til %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/telepathyClient.js:1127 #: ../js/ui/telepathyClient.js:1057
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s inviterer deg til å bli med i %s" msgstr "%s inviterer deg til å bli med i %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209 #: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1236
msgid "Decline" msgid "Decline"
msgstr "Avslå" msgstr "Avslå"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210 #: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1308 #: ../js/ui/telepathyClient.js:1237
msgid "Accept" msgid "Accept"
msgstr "Godta" msgstr "Godta"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160 #: ../js/ui/telepathyClient.js:1090
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videosamtale fra %s" msgstr "Videosamtale fra %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163 #: ../js/ui/telepathyClient.js:1093
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Samtale fra %s" msgstr "Samtale fra %s"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170 #: ../js/ui/telepathyClient.js:1100
msgid "Answer" msgid "Answer"
msgstr "Svar" msgstr "Svar"
@ -1400,110 +1411,110 @@ msgstr "Svar"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1203 #: ../js/ui/telepathyClient.js:1132
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s sender deg %s" msgstr "%s sender deg %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272 #: ../js/ui/telepathyClient.js:1201
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s vil ha rettigheter til å se når du er tilkoblet" msgstr "%s vil ha rettigheter til å se når du er tilkoblet"
#: ../js/ui/telepathyClient.js:1365 #: ../js/ui/telepathyClient.js:1294
msgid "Network error" msgid "Network error"
msgstr "Nettverksfeil" msgstr "Nettverksfeil"
#: ../js/ui/telepathyClient.js:1367 #: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Autentisering feilet" msgstr "Autentisering feilet"
#: ../js/ui/telepathyClient.js:1369 #: ../js/ui/telepathyClient.js:1298
msgid "Encryption error" msgid "Encryption error"
msgstr "Feil ved kryptering" msgstr "Feil ved kryptering"
#: ../js/ui/telepathyClient.js:1371 #: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Sertifikat ikke oppgitt" msgstr "Sertifikat ikke oppgitt"
#: ../js/ui/telepathyClient.js:1373 #: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Stoler ikke på sertifikatet" msgstr "Stoler ikke på sertifikatet"
#: ../js/ui/telepathyClient.js:1375 #: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Sertifikatet er utløpt" msgstr "Sertifikatet er utløpt"
#: ../js/ui/telepathyClient.js:1377 #: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Sertifikatet er ikke aktivert" msgstr "Sertifikatet er ikke aktivert"
#: ../js/ui/telepathyClient.js:1379 #: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Feil vertsnavn for sertifikat" msgstr "Feil vertsnavn for sertifikat"
#: ../js/ui/telepathyClient.js:1381 #: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Feil fingeravtrykk for sertifikat" msgstr "Feil fingeravtrykk for sertifikat"
#: ../js/ui/telepathyClient.js:1383 #: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Sertifikatet er selvsignert" msgstr "Sertifikatet er selvsignert"
#: ../js/ui/telepathyClient.js:1385 #: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Status er satt til frakoblet" msgstr "Status er satt til frakoblet"
#: ../js/ui/telepathyClient.js:1387 #: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Kryptering er ikke tilgjengelig" msgstr "Kryptering er ikke tilgjengelig"
#: ../js/ui/telepathyClient.js:1389 #: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Sertifikatet er ugyldig" msgstr "Sertifikatet er ugyldig"
#: ../js/ui/telepathyClient.js:1391 #: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Tilkobling ble nektet" msgstr "Tilkobling ble nektet"
#: ../js/ui/telepathyClient.js:1393 #: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Tilkobling kan ikke etableres" msgstr "Tilkobling kan ikke etableres"
#: ../js/ui/telepathyClient.js:1395 #: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Tilkobling tapt" msgstr "Tilkobling tapt"
#: ../js/ui/telepathyClient.js:1397 #: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server" msgid "This resource is already connected to the server"
msgstr "Denne ressursen er allerede koblet til tjeneren" msgstr "Denne ressursen er allerede koblet til tjeneren"
#: ../js/ui/telepathyClient.js:1399 #: ../js/ui/telepathyClient.js:1328
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs" "Tilkoblingen har blitt erstattet av en ny tilkobling som bruker samme ressurs"
#: ../js/ui/telepathyClient.js:1401 #: ../js/ui/telepathyClient.js:1330
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Kontoen eksisterer allerede på tjeneren" msgstr "Kontoen eksisterer allerede på tjeneren"
#: ../js/ui/telepathyClient.js:1403 #: ../js/ui/telepathyClient.js:1332
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Tjener er for opptatt til å håndtere tilkoblingen" msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
#: ../js/ui/telepathyClient.js:1405 #: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Sertifikatet er tilbaketrukket" msgstr "Sertifikatet er tilbaketrukket"
#: ../js/ui/telepathyClient.js:1407 #: ../js/ui/telepathyClient.js:1336
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt" "Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
#: ../js/ui/telepathyClient.js:1409 #: ../js/ui/telepathyClient.js:1338
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -1513,20 +1524,20 @@ msgstr ""
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419 #: ../js/ui/telepathyClient.js:1348
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Tilkobling til %s feilet" msgstr "Tilkobling til %s feilet"
#: ../js/ui/telepathyClient.js:1428 #: ../js/ui/telepathyClient.js:1357
msgid "Reconnect" msgid "Reconnect"
msgstr "Koble til på nytt" msgstr "Koble til på nytt"
#: ../js/ui/telepathyClient.js:1429 #: ../js/ui/telepathyClient.js:1358
msgid "Edit account" msgid "Edit account"
msgstr "Rediger konto" msgstr "Rediger konto"
#: ../js/ui/telepathyClient.js:1475 #: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Ukjent årsak" msgstr "Ukjent årsak"
@ -1542,39 +1553,39 @@ msgstr "Ledig"
msgid "Unavailable" msgid "Unavailable"
msgstr "Ikke tilgjengelig" msgstr "Ikke tilgjengelig"
#: ../js/ui/userMenu.js:576 ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:650 #: ../js/ui/userMenu.js:578 ../js/ui/userMenu.js:582 ../js/ui/userMenu.js:652
msgid "Power Off..." msgid "Power Off..."
msgstr "Slå av …" msgstr "Slå av …"
#: ../js/ui/userMenu.js:612 #: ../js/ui/userMenu.js:614
msgid "Notifications" msgid "Notifications"
msgstr "Varslinger" msgstr "Varslinger"
#: ../js/ui/userMenu.js:620 #: ../js/ui/userMenu.js:622
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Kontoer på nettet" msgstr "Kontoer på nettet"
#: ../js/ui/userMenu.js:624 #: ../js/ui/userMenu.js:626
msgid "System Settings" msgid "System Settings"
msgstr "Systeminnstillinger" msgstr "Systeminnstillinger"
#: ../js/ui/userMenu.js:631 #: ../js/ui/userMenu.js:633
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Lås skjerm" msgstr "Lås skjerm"
#: ../js/ui/userMenu.js:636 #: ../js/ui/userMenu.js:638
msgid "Switch User" msgid "Switch User"
msgstr "Bytt bruker" msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:641 #: ../js/ui/userMenu.js:643
msgid "Log Out..." msgid "Log Out..."
msgstr "Logg ut …" msgstr "Logg ut …"
#: ../js/ui/userMenu.js:669 #: ../js/ui/userMenu.js:671
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:670 #: ../js/ui/userMenu.js:672
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."
@ -1648,7 +1659,7 @@ msgstr "Skriv ut versjon"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modus som brukes av GDM for innloggingsskjermen" msgstr "Modus som brukes av GDM for innloggingsskjermen"
#: ../src/shell-app.c:639 #: ../src/shell-app.c:617
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Klarte ikke å starte «%s»" msgstr "Klarte ikke å starte «%s»"
@ -1661,7 +1672,7 @@ msgstr "Storbritannia"
msgid "Default" msgid "Default"
msgstr "Forvalg" msgstr "Forvalg"
#: ../src/shell-polkit-authentication-agent.c:334 #: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Autentiseringsdialogen ble lukket av brukeren" msgstr "Autentiseringsdialogen ble lukket av brukeren"

745
po/nl.po

File diff suppressed because it is too large Load Diff

1667
po/si.po Normal file

File diff suppressed because it is too large Load Diff

222
po/sl.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-01-15 01:35+0000\n" "POT-Creation-Date: 2012-02-02 13:31+0000\n"
"PO-Revision-Date: 2012-01-15 13:44+0100\n" "PO-Revision-Date: 2012-02-02 20:58+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: Slovenian\n" "Language: Slovenian\n"
@ -75,8 +75,8 @@ msgstr "Seznam določil ID namiznih datotek priljubljenih programov"
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format #, no-c-format
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system."
msgstr "Določa cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki se uporablja za gst-launch. Cevovod mora imeti nepovezano korito, kamor se posnetek snema. Običajno je za to namenjen nepovezan izvorni pomnilnik, katerega odvod se zapiše v odvodno datoteko. Vendar pa lahko cevovod ta korak naredi v lastni odvod - možnost se lahko uporabi pri pošiljanju odvoda na strežnik icecast preko shout2send ali podobno. Nedoločena ali prazna možnost se odrazi kot privzeti cevovod. Trenutno je to 'videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux' in omogoča snemanje v zapis WEBM z uporabo kodeka VP8. %T se uporablja kot ročnik za ugibanje optimalnega števila niti na sistemu." msgstr "Določa cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki se uporablja za gst-launch. Cevovod mora imeti nepovezano korito, kamor se posnetek snema. Običajno je za to namenjen nepovezan izvorni pomnilnik, katerega odvod se zapiše v odvodno datoteko. Vendar pa lahko cevovod ta korak naredi v lastni odvod - možnost se lahko uporabi pri pošiljanju odvoda na strežnik icecast preko shout2send ali podobno. Nedoločena ali prazna možnost se odrazi kot privzeti cevovod. Trenutno je to 'videorate ! vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux' in omogoča snemanje v zapis WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje optimalnega števila niti na sistemu."
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock" msgid "Show date in clock"
@ -171,9 +171,9 @@ msgid "Login Window"
msgstr "Prijavno okno" msgstr "Prijavno okno"
#: ../js/gdm/powerMenu.js:113 #: ../js/gdm/powerMenu.js:113
#: ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:581 #: ../js/ui/userMenu.js:581
#: ../js/ui/userMenu.js:650 #: ../js/ui/userMenu.js:583
#: ../js/ui/userMenu.js:652
msgid "Suspend" msgid "Suspend"
msgstr "Zaustavi" msgstr "Zaustavi"
@ -397,7 +397,7 @@ msgstr "Naslednji teden"
#: ../js/ui/contactDisplay.js:63 #: ../js/ui/contactDisplay.js:63
#: ../js/ui/notificationDaemon.js:486 #: ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 #: ../js/ui/status/power.js:215
#: ../src/shell-app.c:394 #: ../src/shell-app.c:372
msgid "Unknown" msgid "Unknown"
msgstr "Neznano" msgstr "Neznano"
@ -420,7 +420,7 @@ msgstr "Zaposleno"
msgid "Offline" msgid "Offline"
msgstr "Nepovezano" msgstr "Nepovezano"
#: ../js/ui/contactDisplay.js:141 #: ../js/ui/contactDisplay.js:148
msgid "CONTACTS" msgid "CONTACTS"
msgstr "Stiki" msgstr "Stiki"
@ -429,58 +429,58 @@ msgstr "Stiki"
msgid "Remove" msgid "Remove"
msgstr "Odstrani" msgstr "Odstrani"
#: ../js/ui/dateMenu.js:96 #: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Nastavitve časa in datuma" msgstr "Nastavitve časa in datuma"
#: ../js/ui/dateMenu.js:122 #: ../js/ui/dateMenu.js:123
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Odpri koledar" msgstr "Odpri koledar"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a. %e. %b., %R:%S" msgstr "%a. %e. %b., %R:%S"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a, %e. %b., %R" msgstr "%a, %e. %b., %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:185 #: ../js/ui/dateMenu.js:186
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a. %R:%S" msgstr "%a. %R:%S"
#: ../js/ui/dateMenu.js:186 #: ../js/ui/dateMenu.js:187
msgid "%a %R" msgid "%a %R"
msgstr "%a. %R" msgstr "%a. %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:193 #: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p" msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:194 #: ../js/ui/dateMenu.js:195
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p" msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:198 #: ../js/ui/dateMenu.js:199
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:199 #: ../js/ui/dateMenu.js:200
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. 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:210 #: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a, %e. %b., %R" msgstr "%a, %e. %b., %R"
@ -665,7 +665,7 @@ msgstr "Povrni glasnost"
msgid "Mute" msgid "Mute"
msgstr "Utišaj" msgstr "Utišaj"
#: ../js/ui/messageTray.js:2444 #: ../js/ui/messageTray.js:2446
msgid "System Information" msgid "System Information"
msgstr "Podrobnosti sistema" msgstr "Podrobnosti sistema"
@ -767,17 +767,17 @@ msgstr "Programi"
msgid "Dash" msgid "Dash"
msgstr "Armaturna plošča" msgstr "Armaturna plošča"
#: ../js/ui/panel.js:564 #: ../js/ui/panel.js:572
msgid "Quit" msgid "Quit"
msgstr "Končaj" msgstr "Končaj"
#. 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:595 #: ../js/ui/panel.js:603
msgid "Activities" msgid "Activities"
msgstr "Dejavnosti" msgstr "Dejavnosti"
#: ../js/ui/panel.js:982 #: ../js/ui/panel.js:990
msgid "Top Bar" msgid "Top Bar"
msgstr "Vrhnja vrstica" msgstr "Vrhnja vrstica"
@ -827,7 +827,7 @@ msgstr "Geslo:"
#. "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:719 #: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -859,10 +859,14 @@ msgstr "Pokaži besedilo"
msgid "Hide Text" msgid "Hide Text"
msgstr "Skrij besedilo" msgstr "Skrij besedilo"
#: ../js/ui/shellMountOperation.js:269 #: ../js/ui/shellMountOperation.js:271
msgid "Wrong password, please try again" msgid "Wrong password, please try again"
msgstr "Napačno geslo; poskusite znova." msgstr "Napačno geslo; poskusite znova."
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Dostopnost"
#: ../js/ui/status/accessibility.js:52 #: ../js/ui/status/accessibility.js:52
msgid "Zoom" msgid "Zoom"
msgstr "Približanje" msgstr "Približanje"
@ -906,13 +910,14 @@ msgstr "Visok kontrast"
msgid "Large Text" msgid "Large Text"
msgstr "Veliko besedilo" msgstr "Veliko besedilo"
#: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:35 #: ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258 #: ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341 #: ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407 #: ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 #: ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892 #: ../js/ui/status/network.js:893
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
@ -934,7 +939,7 @@ msgstr "Nastavitve za Bluetooth"
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill #. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
#: ../js/ui/status/bluetooth.js:107 #: ../js/ui/status/bluetooth.js:107
#: ../js/ui/status/network.js:255 #: ../js/ui/status/network.js:256
msgid "hardware disabled" msgid "hardware disabled"
msgstr "strojno onemogočen" msgstr "strojno onemogočen"
@ -943,12 +948,12 @@ msgid "Connection"
msgstr "Povezava" msgstr "Povezava"
#: ../js/ui/status/bluetooth.js:214 #: ../js/ui/status/bluetooth.js:214
#: ../js/ui/status/network.js:490 #: ../js/ui/status/network.js:491
msgid "disconnecting..." msgid "disconnecting..."
msgstr "prekinjanje povezave ..." msgstr "prekinjanje povezave ..."
#: ../js/ui/status/bluetooth.js:227 #: ../js/ui/status/bluetooth.js:227
#: ../js/ui/status/network.js:496 #: ../js/ui/status/network.js:497
msgid "connecting..." msgid "connecting..."
msgstr "povezovanje ..." msgstr "povezovanje ..."
@ -1055,122 +1060,130 @@ msgid "<unknown>"
msgstr "<neznano>" msgstr "<neznano>"
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch #. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
#: ../js/ui/status/network.js:277 #: ../js/ui/status/network.js:278
msgid "disabled" msgid "disabled"
msgstr "onemogočeno" msgstr "onemogočeno"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:488 #: ../js/ui/status/network.js:489
msgid "unmanaged" msgid "unmanaged"
msgstr "neupravljano" msgstr "neupravljano"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:499 #: ../js/ui/status/network.js:500
msgid "authentication required" msgid "authentication required"
msgstr "zahtevana je overitev" msgstr "zahtevana je overitev"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:509 #: ../js/ui/status/network.js:510
msgid "firmware missing" msgid "firmware missing"
msgstr "manjka strojna programska oprema" msgstr "manjka strojna programska oprema"
#. Translators: this is for wired network devices that are physically disconnected #. Translators: this is for wired network devices that are physically disconnected
#: ../js/ui/status/network.js:516 #: ../js/ui/status/network.js:517
msgid "cable unplugged" msgid "cable unplugged"
msgstr "kabel ni priklopljen" msgstr "kabel ni priklopljen"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521 #: ../js/ui/status/network.js:522
msgid "unavailable" msgid "unavailable"
msgstr "ni na voljo" msgstr "ni na voljo"
#: ../js/ui/status/network.js:523 #: ../js/ui/status/network.js:524
msgid "connection failed" msgid "connection failed"
msgstr "povezovanje je spodletelo" msgstr "povezovanje je spodletelo"
#: ../js/ui/status/network.js:584 #: ../js/ui/status/network.js:585
#: ../js/ui/status/network.js:1504 #: ../js/ui/status/network.js:1505
msgid "More..." msgid "More..."
msgstr "Več ..." msgstr "Več ..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active, #. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. and we cannot access its settings (including the name) #. and we cannot access its settings (including the name)
#: ../js/ui/status/network.js:620 #: ../js/ui/status/network.js:621
#: ../js/ui/status/network.js:1439 #: ../js/ui/status/network.js:1440
msgid "Connected (private)" msgid "Connected (private)"
msgstr "Povezano (zasebna povezava)" msgstr "Povezano (zasebna povezava)"
#: ../js/ui/status/network.js:695 #: ../js/ui/status/network.js:696
msgid "Auto Ethernet" msgid "Auto Ethernet"
msgstr "Samodejni eternet" msgstr "Samodejni eternet"
#: ../js/ui/status/network.js:756 #: ../js/ui/status/network.js:757
msgid "Auto broadband" msgid "Auto broadband"
msgstr "Samodejni širokopasovni dostop" msgstr "Samodejni širokopasovni dostop"
#: ../js/ui/status/network.js:759 #: ../js/ui/status/network.js:760
msgid "Auto dial-up" msgid "Auto dial-up"
msgstr "Samodejni klicni dostop" msgstr "Samodejni klicni dostop"
#. TRANSLATORS: this the automatic wireless connection name (including the network name) #. TRANSLATORS: this the automatic wireless connection name (including the network name)
#: ../js/ui/status/network.js:878 #: ../js/ui/status/network.js:879
#: ../js/ui/status/network.js:1451 #: ../js/ui/status/network.js:1452
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "Samodejna povezava z %s" msgstr "Samodejna povezava z %s"
#: ../js/ui/status/network.js:880 #: ../js/ui/status/network.js:881
msgid "Auto bluetooth" msgid "Auto bluetooth"
msgstr "Samodejna povezava z Bluetooth" msgstr "Samodejna povezava z Bluetooth"
#: ../js/ui/status/network.js:1453 #: ../js/ui/status/network.js:1454
msgid "Auto wireless" msgid "Auto wireless"
msgstr "Samodejni brezžični dostop" msgstr "Samodejni brezžični dostop"
#: ../js/ui/status/network.js:1547 #: ../js/ui/status/network.js:1541
msgid "Network"
msgstr "Omrežje"
#: ../js/ui/status/network.js:1548
msgid "Enable networking" msgid "Enable networking"
msgstr "Omogoči omrežje" msgstr "Omogoči omrežje"
#: ../js/ui/status/network.js:1559 #: ../js/ui/status/network.js:1560
msgid "Wired" msgid "Wired"
msgstr "Žično" msgstr "Žično"
#: ../js/ui/status/network.js:1570 #: ../js/ui/status/network.js:1571
msgid "Wireless" msgid "Wireless"
msgstr "Brezžično" msgstr "Brezžično"
#: ../js/ui/status/network.js:1580 #: ../js/ui/status/network.js:1581
msgid "Mobile broadband" msgid "Mobile broadband"
msgstr "Mobilni širokopasovni dostop" msgstr "Mobilni širokopasovni dostop"
#: ../js/ui/status/network.js:1590 #: ../js/ui/status/network.js:1591
msgid "VPN Connections" msgid "VPN Connections"
msgstr "Povezave VPN" msgstr "Povezave VPN"
#: ../js/ui/status/network.js:1601 #: ../js/ui/status/network.js:1602
msgid "Network Settings" msgid "Network Settings"
msgstr "Omrežne nastavitve" msgstr "Omrežne nastavitve"
#: ../js/ui/status/network.js:1738 #: ../js/ui/status/network.js:1739
msgid "Connection failed" msgid "Connection failed"
msgstr "Povezava je spodletela" msgstr "Povezava je spodletela"
#: ../js/ui/status/network.js:1739 #: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Omogočanje omrežne povezave je spodletelo." msgstr "Omogočanje omrežne povezave je spodletelo."
#: ../js/ui/status/network.js:1989 #: ../js/ui/status/network.js:1993
msgid "Networking is disabled" msgid "Networking is disabled"
msgstr "Omrežje je onemogočeno" msgstr "Omrežje je onemogočeno"
#: ../js/ui/status/network.js:2113 #: ../js/ui/status/network.js:2117
msgid "Network Manager" msgid "Network Manager"
msgstr "Upravljalnik omrežij" msgstr "Upravljalnik omrežij"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:59
msgid "Battery"
msgstr "Baterija"
#: ../js/ui/status/power.js:76
msgid "Power Settings" msgid "Power Settings"
msgstr "Upravljanje napajanja" msgstr "Upravljanje napajanja"
@ -1267,6 +1280,7 @@ msgstr "Tablični računalnik"
msgid "Computer" msgid "Computer"
msgstr "Računalnik" msgstr "Računalnik"
#: ../js/ui/status/volume.js:25
#: ../js/ui/status/volume.js:38 #: ../js/ui/status/volume.js:38
msgid "Volume" msgid "Volume"
msgstr "Glasnost" msgstr "Glasnost"
@ -1364,14 +1378,14 @@ msgid "%s is inviting you to join %s"
msgstr "%s vas vabi, da se pridružite v %s" msgstr "%s vas vabi, da se pridružite v %s"
#: ../js/ui/telepathyClient.js:1059 #: ../js/ui/telepathyClient.js:1059
#: ../js/ui/telepathyClient.js:1139 #: ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1237 #: ../js/ui/telepathyClient.js:1236
msgid "Decline" msgid "Decline"
msgstr "Zavrni" msgstr "Zavrni"
#: ../js/ui/telepathyClient.js:1060 #: ../js/ui/telepathyClient.js:1060
#: ../js/ui/telepathyClient.js:1140 #: ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1238 #: ../js/ui/telepathyClient.js:1237
msgid "Accept" msgid "Accept"
msgstr "Sprejmi" msgstr "Sprejmi"
@ -1397,125 +1411,125 @@ msgstr "Odgovori"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/telepathyClient.js:1133 #: ../js/ui/telepathyClient.js:1132
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s pošilja %s" msgstr "%s pošilja %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1202 #: ../js/ui/telepathyClient.js:1201
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s želi dovoljenje za pogled dosegljivosti" msgstr "%s želi dovoljenje za pogled dosegljivosti"
#: ../js/ui/telepathyClient.js:1295 #: ../js/ui/telepathyClient.js:1294
msgid "Network error" msgid "Network error"
msgstr "Napaka omrežja" msgstr "Napaka omrežja"
#: ../js/ui/telepathyClient.js:1297 #: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Overitev je spodletela" msgstr "Overitev je spodletela"
#: ../js/ui/telepathyClient.js:1299 #: ../js/ui/telepathyClient.js:1298
msgid "Encryption error" msgid "Encryption error"
msgstr "Napaka šifriranja" msgstr "Napaka šifriranja"
#: ../js/ui/telepathyClient.js:1301 #: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Potrdilo ni na voljo" msgstr "Potrdilo ni na voljo"
#: ../js/ui/telepathyClient.js:1303 #: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Potrdilo ni zaupljivo" msgstr "Potrdilo ni zaupljivo"
#: ../js/ui/telepathyClient.js:1305 #: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Potrdilo je preteklo" msgstr "Potrdilo je preteklo"
#: ../js/ui/telepathyClient.js:1307 #: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Potrdilo ni potrjeno" msgstr "Potrdilo ni potrjeno"
#: ../js/ui/telepathyClient.js:1309 #: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Neustrezno ime gostitelja potrdila" msgstr "Neustrezno ime gostitelja potrdila"
#: ../js/ui/telepathyClient.js:1311 #: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Neustrezen prstni odtis potrdila" msgstr "Neustrezen prstni odtis potrdila"
#: ../js/ui/telepathyClient.js:1313 #: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Potrdilo je samo-podpisano" msgstr "Potrdilo je samo-podpisano"
#: ../js/ui/telepathyClient.js:1315 #: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Stanje je nastavljeno na brez povezave" msgstr "Stanje je nastavljeno na brez povezave"
#: ../js/ui/telepathyClient.js:1317 #: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Šifriranje ni na voljo." msgstr "Šifriranje ni na voljo."
#: ../js/ui/telepathyClient.js:1319 #: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Potrdilo je neveljavno." msgstr "Potrdilo je neveljavno."
#: ../js/ui/telepathyClient.js:1321 #: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Povezava je zavrnjena." msgstr "Povezava je zavrnjena."
#: ../js/ui/telepathyClient.js:1323 #: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Povezave ni mogoče vzpostaviti." msgstr "Povezave ni mogoče vzpostaviti."
#: ../js/ui/telepathyClient.js:1325 #: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Povezava je prekinjena." msgstr "Povezava je prekinjena."
#: ../js/ui/telepathyClient.js:1327 #: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server" msgid "This resource is already connected to the server"
msgstr "Vir je s strežnikom že povezan" msgstr "Vir je s strežnikom že povezan"
#: ../js/ui/telepathyClient.js:1329 #: ../js/ui/telepathyClient.js:1328
msgid "Connection has been replaced by a new connection using the same resource" msgid "Connection has been replaced by a new connection using the same resource"
msgstr "Povezava je zamenjana z novo povezavo, ki uporablja isti vir." msgstr "Povezava je zamenjana z novo povezavo, ki uporablja isti vir."
#: ../js/ui/telepathyClient.js:1331 #: ../js/ui/telepathyClient.js:1330
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Račun na strežniku že obstaja" msgstr "Račun na strežniku že obstaja"
#: ../js/ui/telepathyClient.js:1333 #: ../js/ui/telepathyClient.js:1332
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Strežnik je trenutno preveč zaposlen za upravljanje s povezavo." msgstr "Strežnik je trenutno preveč zaposlen za upravljanje s povezavo."
#: ../js/ui/telepathyClient.js:1335 #: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Potrdilo je preklicano" msgstr "Potrdilo je preklicano"
#: ../js/ui/telepathyClient.js:1337 #: ../js/ui/telepathyClient.js:1336
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak" msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "Potrdilo ne uporablja varnega algoritma ali pa uporablja šibko šifriranje." msgstr "Potrdilo ne uporablja varnega algoritma ali pa uporablja šibko šifriranje."
#: ../js/ui/telepathyClient.js:1339 #: ../js/ui/telepathyClient.js:1338
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library" msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
msgstr "Dolžina potrdila strežnika ali pa globina verige potrdila presega omejitev, ki je določena s šifrirno knjižnico." msgstr "Dolžina potrdila strežnika ali pa globina verige potrdila presega omejitev, ki je določena s šifrirno knjižnico."
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1349 #: ../js/ui/telepathyClient.js:1348
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Povezava z %s je spodletela" msgstr "Povezava z %s je spodletela"
#: ../js/ui/telepathyClient.js:1358 #: ../js/ui/telepathyClient.js:1357
msgid "Reconnect" msgid "Reconnect"
msgstr "Ponovno se poveži" msgstr "Ponovno se poveži"
#: ../js/ui/telepathyClient.js:1359 #: ../js/ui/telepathyClient.js:1358
msgid "Edit account" msgid "Edit account"
msgstr "Uredi račun" msgstr "Uredi račun"
#: ../js/ui/telepathyClient.js:1405 #: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznan vzrok" msgstr "Neznan vzrok"
@ -1531,41 +1545,41 @@ msgstr "Nedejavno"
msgid "Unavailable" msgid "Unavailable"
msgstr "Nedostopno" msgstr "Nedostopno"
#: ../js/ui/userMenu.js:577 #: ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:581 #: ../js/ui/userMenu.js:583
#: ../js/ui/userMenu.js:651 #: ../js/ui/userMenu.js:653
msgid "Power Off..." msgid "Power Off..."
msgstr "Izklop ..." msgstr "Izklop ..."
#: ../js/ui/userMenu.js:613 #: ../js/ui/userMenu.js:615
msgid "Notifications" msgid "Notifications"
msgstr "Obvestila" msgstr "Obvestila"
#: ../js/ui/userMenu.js:621 #: ../js/ui/userMenu.js:623
msgid "Online Accounts" msgid "Online Accounts"
msgstr "Spletni računi" msgstr "Spletni računi"
#: ../js/ui/userMenu.js:625 #: ../js/ui/userMenu.js:627
msgid "System Settings" msgid "System Settings"
msgstr "Sistemske nastavitve" msgstr "Sistemske nastavitve"
#: ../js/ui/userMenu.js:632 #: ../js/ui/userMenu.js:634
msgid "Lock Screen" msgid "Lock Screen"
msgstr "Zakleni zaslon" msgstr "Zakleni zaslon"
#: ../js/ui/userMenu.js:637 #: ../js/ui/userMenu.js:639
msgid "Switch User" msgid "Switch User"
msgstr "Preklopi uporabnika" msgstr "Preklopi uporabnika"
#: ../js/ui/userMenu.js:642 #: ../js/ui/userMenu.js:644
msgid "Log Out..." msgid "Log Out..."
msgstr "Odjava ..." msgstr "Odjava ..."
#: ../js/ui/userMenu.js:670 #: ../js/ui/userMenu.js:672
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno" msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"
#: ../js/ui/userMenu.js:671 #: ../js/ui/userMenu.js:673
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "Obveščanje je zdaj onemogočeno, vključno s sporočili klepeta. Vaše stanje povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil morda ne boste opazili." msgstr "Obveščanje je zdaj onemogočeno, vključno s sporočili klepeta. Vaše stanje povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil morda ne boste opazili."
@ -1639,7 +1653,7 @@ msgstr "Izpiši različico"
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Način uporabljen v GDM za prijavni naslov" msgstr "Način uporabljen v GDM za prijavni naslov"
#: ../src/shell-app.c:639 #: ../src/shell-app.c:617
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Zaganjanje '%s' je spodletelo" msgstr "Zaganjanje '%s' je spodletelo"
@ -1652,7 +1666,7 @@ msgstr "Velika Britanija"
msgid "Default" msgid "Default"
msgstr "Privzeto" msgstr "Privzeto"
#: ../src/shell-polkit-authentication-agent.c:334 #: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Uporabnik je zavrnil pogovorno okno overitve" msgstr "Uporabnik je zavrnil pogovorno okno overitve"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -11,39 +11,16 @@ st_cflags = \
st_built_sources = \ st_built_sources = \
st-enum-types.h \ st-enum-types.h \
st-enum-types.c \ st-enum-types.c
st-marshal.h \
st-marshal.c
BUILT_SOURCES += $(st_built_sources) BUILT_SOURCES += $(st_built_sources)
EXTRA_DIST += \ EXTRA_DIST += \
st/test-theme.css \ st/test-theme.css \
st/st-marshal.list \
st/st-enum-types.h.in \ st/st-enum-types.h.in \
st/st-enum-types.c.in st/st-enum-types.c.in
CLEANFILES += stamp-st-marshal.h stamp-st-enum-types.h CLEANFILES += stamp-st-enum-types.h
st-marshal.h: stamp-st-marshal.h
@true
stamp-st-marshal.h: Makefile st/st-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_st_marshal \
--header \
$(srcdir)/st/st-marshal.list > $@.tmp && \
(cmp -s $@.tmp st-marshal.h || cp -f $@.tmp st-marshal.h) && \
rm -f $@.tmp && \
echo timestamp > $(@F)
st-marshal.c: Makefile st/st-marshal.list
$(AM_V_GEN) (echo "#include \"st-marshal.h\"" ; \
$(GLIB_GENMARSHAL) \
--prefix=_st_marshal \
--body \
$(srcdir)/st/st-marshal.list ) > $@.tmp && \
cp -f $@.tmp st-marshal.c && \
rm -f $@.tmp
st-enum-types.h: stamp-st-enum-types.h Makefile st-enum-types.h: stamp-st-enum-types.h Makefile
@true @true

View File

@ -5,14 +5,8 @@ tray_cflags = \
$(TRAY_CFLAGS) \ $(TRAY_CFLAGS) \
$(NULL) $(NULL)
tray_built_sources = \
na-marshal.h \
na-marshal.c
BUILT_SOURCES += $(tray_built_sources) BUILT_SOURCES += $(tray_built_sources)
TRAY_STAMP_FILES = stamp-na-marshal.h
# please, keep this sorted alphabetically # please, keep this sorted alphabetically
tray_source = \ tray_source = \
tray/na-tray-child.c \ tray/na-tray-child.c \
@ -21,26 +15,6 @@ tray_source = \
tray/na-tray-manager.h \ tray/na-tray-manager.h \
$(NULL) $(NULL)
na-marshal.h: stamp-na-marshal.h
@true
stamp-na-marshal.h: Makefile tray/na-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_na_marshal \
--header \
$(srcdir)/tray/na-marshal.list > xgen-tmh && \
(cmp -s xgen-tmh na-marshal.h || cp -f xgen-tmh na-marshal.h) && \
rm -f xgen-tmh && \
echo timestamp > $(@F)
na-marshal.c: Makefile tray/na-marshal.list
$(AM_V_GEN) (echo "#include \"na-marshal.h\"" ; \
$(GLIB_GENMARSHAL) \
--prefix=_na_marshal \
--body \
$(srcdir)/tray/na-marshal.list ) > xgen-tmc && \
cp -f xgen-tmc na-marshal.c && \
rm -f xgen-tmc
noinst_LTLIBRARIES += libtray.la noinst_LTLIBRARIES += libtray.la
libtray_la_LIBADD = $(TRAY_LIBS) libtray_la_LIBADD = $(TRAY_LIBS)
@ -52,6 +26,3 @@ libtray_la_CPPFLAGS = $(tray_cflags)
libtray_la_LDFLAGS = $(LDADD) libtray_la_LDFLAGS = $(LDADD)
CLEANFILES += $(TRAY_STAMP_FILES) $(BUILT_SOURCES) CLEANFILES += $(TRAY_STAMP_FILES) $(BUILT_SOURCES)
EXTRA_DIST += \
tray/na-marshal.list

View File

@ -27,8 +27,8 @@ CLEANFILES += $(service_DATA)
CLEANFILES += $(gir_DATA) $(typelib_DATA) CLEANFILES += $(gir_DATA) $(typelib_DATA)
bin_SCRIPTS += gnome-shell-extension-tool bin_SCRIPTS += gnome-shell-extension-tool gnome-shell-extension-prefs
EXTRA_DIST += gnome-shell-extension-tool.in EXTRA_DIST += gnome-shell-extension-tool.in gnome-shell-extension-prefs.in
bin_PROGRAMS = gnome-shell-real bin_PROGRAMS = gnome-shell-real
if USE_JHBUILD_WRAPPER_SCRIPT if USE_JHBUILD_WRAPPER_SCRIPT
@ -48,15 +48,17 @@ uninstall-hook:
rm -f $(DESTDIR)$(bindir)/gnome-shell rm -f $(DESTDIR)$(bindir)/gnome-shell
generated_script_substitutions = \ generated_script_substitutions = \
-e "s|@bindir[@]|$(bindir)|" \ -e "s|@bindir[@]|$(bindir)|g" \
-e "s|@datadir[@]|$(datadir)|" \ -e "s|@datadir[@]|$(datadir)|g" \
-e "s|@libexecdir[@]|$(libexecdir)|" \ -e "s|@libexecdir[@]|$(libexecdir)|g" \
-e "s|@libdir[@]|$(libdir)|" \ -e "s|@libdir[@]|$(libdir)|g" \
-e "s|@JHBUILD_TYPELIBDIR[@]|$(JHBUILD_TYPELIBDIR)|" \ -e "s|@pkglibdir[@]|$(pkglibdir)|g" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \ -e "s|@JHBUILD_TYPELIBDIR[@]|$(JHBUILD_TYPELIBDIR)|g" \
-e "s|@PYTHON[@]|$(PYTHON)|" \ -e "s|@pkgdatadir[@]|$(pkgdatadir)|g" \
-e "s|@VERSION[@]|$(VERSION)|" \ -e "s|@PYTHON[@]|$(PYTHON)|g" \
-e "s|@sysconfdir[@]|$(sysconfdir)|" -e "s|@VERSION[@]|$(VERSION)|g" \
-e "s|@sysconfdir[@]|$(sysconfdir)|g" \
-e "s|@GJS_CONSOLE[@]|$(GJS_CONSOLE)|g"
gnome-shell-jhbuild: gnome-shell-jhbuild.in gnome-shell-real Makefile gnome-shell-jhbuild: gnome-shell-jhbuild.in gnome-shell-real Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@ $(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
@ -66,6 +68,9 @@ gnome-shell-jhbuild: gnome-shell-jhbuild.in gnome-shell-real Makefile
gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@ $(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
gnome-shell-extension-prefs: gnome-shell-extension-prefs.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
CLEANFILES += gnome-shell $(bin_SCRIPTS) CLEANFILES += gnome-shell $(bin_SCRIPTS)
include Makefile-st.am include Makefile-st.am
@ -86,16 +91,13 @@ gnome_shell_cflags = \
-DJSDIR=\"$(pkgdatadir)/js\" -DJSDIR=\"$(pkgdatadir)/js\"
privlibdir = $(pkglibdir) privlibdir = $(pkglibdir)
privlib_LTLIBRARIES = libgnome-shell.la privlib_LTLIBRARIES = libgnome-shell.la libgnome-shell-js.la
shell_built_sources = \ shell_built_sources = \
shell-marshal.h \
shell-marshal.c \
shell-enum-types.h \ shell-enum-types.h \
shell-enum-types.c shell-enum-types.c
BUILT_SOURCES += $(shell_built_sources) BUILT_SOURCES += $(shell_built_sources)
EXTRA_DIST += shell-marshal.list
shell_public_headers_h = \ shell_public_headers_h = \
shell-app.h \ shell-app.h \
@ -111,6 +113,7 @@ shell_public_headers_h = \
shell-mount-operation.h \ shell-mount-operation.h \
shell-network-agent.h \ shell-network-agent.h \
shell-perf-log.h \ shell-perf-log.h \
shell-screen-grabber.h \
shell-slicer.h \ shell-slicer.h \
shell-stack.h \ shell-stack.h \
shell-tp-client.h \ shell-tp-client.h \
@ -158,6 +161,7 @@ libgnome_shell_la_SOURCES = \
shell-perf-log.c \ shell-perf-log.c \
shell-polkit-authentication-agent.h \ shell-polkit-authentication-agent.h \
shell-polkit-authentication-agent.c \ shell-polkit-authentication-agent.c \
shell-screen-grabber.c \
shell-slicer.c \ shell-slicer.c \
shell-stack.c \ shell-stack.c \
shell-tp-client.c \ shell-tp-client.c \
@ -183,6 +187,23 @@ EXTRA_DIST += test-gapplication.js
######################################## ########################################
libgnome_shell_js_la_SOURCES = \
shell-js.h \
shell-js.c \
$(NULL)
libgnome_shell_js_la_LIBADD = \
$(GNOME_SHELL_JS_LIBS) \
$(NULL)
libgnome_shell_js_la_LDFLAGS = \
-avoid-version
libgnome_shell_js_la_CPPFLAGS = \
$(GNOME_SHELL_JS_CFLAGS)
########################################
shell_recorder_sources = \ shell_recorder_sources = \
shell-recorder.c \ shell-recorder.c \
shell-recorder.h shell-recorder.h
@ -206,6 +227,8 @@ test_recorder_LDADD = $(TEST_SHELL_RECORDER_LIBS)
test_recorder_SOURCES = \ test_recorder_SOURCES = \
$(shell_recorder_sources) $(shell_recorder_private_sources) \ $(shell_recorder_sources) $(shell_recorder_private_sources) \
shell-screen-grabber.c \
shell-screen-grabber.h \
test-recorder.c test-recorder.c
endif BUILD_RECORDER endif BUILD_RECORDER
@ -230,28 +253,6 @@ run_js_test_SOURCES = \
######################################## ########################################
shell-marshal.h: stamp-shell-marshal.h
@true
stamp-shell-marshal.h: Makefile shell-marshal.list
$(AM_V_GEN) $(GLIB_GENMARSHAL) \
--prefix=_shell_marshal \
--header \
$(srcdir)/shell-marshal.list > xgen-smh && \
(cmp -s xgen-smh shell-marshal.h || cp -f xgen-smh shell-marshal.h) && \
rm -f xgen-smh && \
echo timestamp > $(@F)
CLEANFILES += stamp-shell-marshal.h
shell-marshal.c: Makefile shell-marshal.list
$(AM_V_GEN) (echo "#include \"shell-marshal.h\"" ; \
$(GLIB_GENMARSHAL) \
--prefix=_shell_marshal \
--body \
$(srcdir)/shell-marshal.list ) > xgen-smc && \
cp -f xgen-smc shell-marshal.c && \
rm -f xgen-smc
shell-enum-types.h: stamp-shell-enum-types.h Makefile shell-enum-types.h: stamp-shell-enum-types.h Makefile
@true @true
stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers_h) stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers_h)
@ -296,6 +297,13 @@ Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
INTROSPECTION_GIRS += Shell-0.1.gir INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir CLEANFILES += Shell-0.1.gir
ShellJS-0.1.gir: libgnome-shell-js.la
ShellJS_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
ShellJS_0_1_gir_LIBS = libgnome-shell-js.la
ShellJS_0_1_gir_FILES = $(libgnome_shell_js_la_SOURCES)
INTROSPECTION_GIRS += ShellJS-0.1.gir
CLEANFILES += ShellJS-0.1.gir
St-1.0.gir: libst-1.0.la St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0 St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION

View File

@ -150,7 +150,7 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
appointment_sources_changed), appointment_sources_changed),
NULL, NULL,
NULL, NULL,
g_cclosure_marshal_VOID__VOID, NULL,
G_TYPE_NONE, G_TYPE_NONE,
0); 0);
@ -162,7 +162,7 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
task_sources_changed), task_sources_changed),
NULL, NULL,
NULL, NULL,
g_cclosure_marshal_VOID__VOID, NULL,
G_TYPE_NONE, G_TYPE_NONE,
0); 0);
} }

View File

@ -0,0 +1,15 @@
#!/bin/bash
if [ -n "$GI_TYPELIB_PATH" ]; then
export GI_TYPELIB_PATH=@pkglibdir@
else
export GI_TYPELIB_PATH=@pkglibdir@:$GI_TYPELIB_PATH
fi
if [ -n "$LD_LIBRARY_PATH" ] ; then
export LD_LIBRARY_PATH=@pkglibdir@
else
export LD_LIBRARY_PATH=@pkglibdir@:$LD_LIBRARY_PATH
fi
@GJS_CONSOLE@ -I @pkgdatadir@/js -c "const Main = imports.extensionPrefs.main; Main.main(ARGV);" "$@"

View File

@ -171,8 +171,7 @@ gvc_channel_map_class_init (GvcChannelMapClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed), G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__BOOLEAN,
G_TYPE_NONE, 1, G_TYPE_BOOLEAN); G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
g_type_class_add_private (klass, sizeof (GvcChannelMapPrivate)); g_type_class_add_private (klass, sizeof (GvcChannelMapPrivate));

View File

@ -2137,56 +2137,49 @@ gvc_mixer_control_class_init (GvcMixerControlClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, state_changed), G_STRUCT_OFFSET (GvcMixerControlClass, state_changed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [STREAM_ADDED] = signals [STREAM_ADDED] =
g_signal_new ("stream-added", g_signal_new ("stream-added",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, stream_added), G_STRUCT_OFFSET (GvcMixerControlClass, stream_added),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [STREAM_REMOVED] = signals [STREAM_REMOVED] =
g_signal_new ("stream-removed", g_signal_new ("stream-removed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed), G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [CARD_ADDED] = signals [CARD_ADDED] =
g_signal_new ("card-added", g_signal_new ("card-added",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, card_added), G_STRUCT_OFFSET (GvcMixerControlClass, card_added),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [CARD_REMOVED] = signals [CARD_REMOVED] =
g_signal_new ("card-removed", g_signal_new ("card-removed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, card_removed), G_STRUCT_OFFSET (GvcMixerControlClass, card_removed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [DEFAULT_SINK_CHANGED] = signals [DEFAULT_SINK_CHANGED] =
g_signal_new ("default-sink-changed", g_signal_new ("default-sink-changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed), G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
signals [DEFAULT_SOURCE_CHANGED] = signals [DEFAULT_SOURCE_CHANGED] =
g_signal_new ("default-source-changed", g_signal_new ("default-source-changed",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed), G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__UINT,
G_TYPE_NONE, 1, G_TYPE_UINT); G_TYPE_NONE, 1, G_TYPE_UINT);
g_type_class_add_private (klass, sizeof (GvcMixerControlPrivate)); g_type_class_add_private (klass, sizeof (GvcMixerControlPrivate));

View File

@ -26,6 +26,7 @@
static const char*const vendor_prefixes[] = { "gnome-", static const char*const vendor_prefixes[] = { "gnome-",
"fedora-", "fedora-",
"mozilla-", "mozilla-",
"debian-",
NULL }; NULL };
enum { enum {
@ -69,8 +70,7 @@ static void shell_app_system_class_init(ShellAppSystemClass *klass)
SHELL_TYPE_APP_SYSTEM, SHELL_TYPE_APP_SYSTEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
SHELL_TYPE_APP); SHELL_TYPE_APP);
signals[INSTALLED_CHANGED] = signals[INSTALLED_CHANGED] =
@ -78,8 +78,7 @@ static void shell_app_system_class_init(ShellAppSystemClass *klass)
SHELL_TYPE_APP_SYSTEM, SHELL_TYPE_APP_SYSTEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ShellAppSystemClass, installed_changed), G_STRUCT_OFFSET (ShellAppSystemClass, installed_changed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (gobject_class, sizeof (ShellAppSystemPrivate)); g_type_class_add_private (gobject_class, sizeof (ShellAppSystemPrivate));

View File

@ -18,7 +18,6 @@
#include "shell-app-usage.h" #include "shell-app-usage.h"
#include "shell-window-tracker.h" #include "shell-window-tracker.h"
#include "shell-global.h" #include "shell-global.h"
#include "shell-marshal.h"
/* This file includes modified code from /* This file includes modified code from
* desktop-data-engine/engine-dbus/hippo-application-monitor.c * desktop-data-engine/engine-dbus/hippo-application-monitor.c

View File

@ -75,6 +75,7 @@ struct _ShellApp
char *name_collation_key; char *name_collation_key;
char *casefolded_description; char *casefolded_description;
char *casefolded_exec; char *casefolded_exec;
char **casefolded_keywords;
}; };
enum { enum {
@ -1299,6 +1300,7 @@ shell_app_init_search_data (ShellApp *app)
const char *name; const char *name;
const char *exec; const char *exec;
const char *comment; const char *comment;
const char * const *keywords;
char *normalized_exec; char *normalized_exec;
GDesktopAppInfo *appinfo; GDesktopAppInfo *appinfo;
@ -1313,6 +1315,25 @@ shell_app_init_search_data (ShellApp *app)
normalized_exec = shell_util_normalize_and_casefold (exec); normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (normalized_exec); app->casefolded_exec = trim_exec_line (normalized_exec);
g_free (normalized_exec); g_free (normalized_exec);
keywords = g_desktop_app_info_get_keywords (appinfo);
if (keywords)
{
int i;
app->casefolded_keywords = g_new0 (char*, g_strv_length ((char **)keywords) + 1);
i = 0;
while (keywords[i])
{
app->casefolded_keywords[i] = shell_util_normalize_and_casefold (keywords[i]);
++i;
}
app->casefolded_keywords[i] = NULL;
}
else
app->casefolded_keywords = NULL;
} }
/** /**
@ -1381,6 +1402,23 @@ _shell_app_match_search_terms (ShellApp *app,
current_match = MATCH_SUBSTRING; current_match = MATCH_SUBSTRING;
} }
if (app->casefolded_keywords)
{
int i = 0;
while (app->casefolded_keywords[i] && current_match < MATCH_PREFIX)
{
p = strstr (app->casefolded_keywords[i], term);
if (p != NULL)
{
if (p == app->casefolded_keywords[i])
current_match = MATCH_PREFIX;
else
current_match = MATCH_SUBSTRING;
}
++i;
}
}
if (current_match == MATCH_NONE) if (current_match == MATCH_NONE)
return current_match; return current_match;
@ -1464,6 +1502,7 @@ shell_app_finalize (GObject *object)
g_free (app->name_collation_key); g_free (app->name_collation_key);
g_free (app->casefolded_description); g_free (app->casefolded_description);
g_free (app->casefolded_exec); g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords);
G_OBJECT_CLASS(shell_app_parent_class)->finalize (object); G_OBJECT_CLASS(shell_app_parent_class)->finalize (object);
} }
@ -1481,8 +1520,7 @@ shell_app_class_init(ShellAppClass *klass)
SHELL_TYPE_APP, SHELL_TYPE_APP,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**

View File

@ -320,8 +320,7 @@ shell_doc_system_class_init(ShellDocSystemClass *klass)
SHELL_TYPE_DOC_SYSTEM, SHELL_TYPE_DOC_SYSTEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
signals[DELETED] = signals[DELETED] =
@ -329,8 +328,7 @@ shell_doc_system_class_init(ShellDocSystemClass *klass)
SHELL_TYPE_DOC_SYSTEM, SHELL_TYPE_DOC_SYSTEM,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1, GTK_TYPE_RECENT_INFO); G_TYPE_NONE, 1, GTK_TYPE_RECENT_INFO);
g_type_class_add_private (gobject_class, sizeof (ShellDocSystemPrivate)); g_type_class_add_private (gobject_class, sizeof (ShellDocSystemPrivate));

View File

@ -285,8 +285,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
gi_cclosure_marshal_generic,
G_TYPE_NONE, 2, G_TYPE_FLOAT, SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION); G_TYPE_NONE, 2, G_TYPE_FLOAT, SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION);
/** /**
@ -310,8 +309,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
gi_cclosure_marshal_generic,
G_TYPE_NONE, 2, G_TYPE_FLOAT, SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION); G_TYPE_NONE, 2, G_TYPE_FLOAT, SHELL_TYPE_GENERIC_CONTAINER_ALLOCATION);
/** /**
@ -331,8 +329,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
gi_cclosure_marshal_generic,
G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS); G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS);
g_type_class_add_private (gobject_class, sizeof (ShellGenericContainerPrivate)); g_type_class_add_private (gobject_class, sizeof (ShellGenericContainerPrivate));

View File

@ -25,10 +25,8 @@ typedef struct _screenshot_data {
char *filename; char *filename;
int x; cairo_surface_t *image;
int y; cairo_rectangle_int_t screenshot_area;
int width;
int height;
ShellGlobalScreenshotCallback callback; ShellGlobalScreenshotCallback callback;
} _screenshot_data; } _screenshot_data;

View File

@ -25,6 +25,7 @@
#include <girepository.h> #include <girepository.h>
#include <meta/display.h> #include <meta/display.h>
#include <meta/util.h> #include <meta/util.h>
#include <meta/meta-shaped-texture.h>
/* Memory report bits */ /* Memory report bits */
#ifdef HAVE_MALLINFO #ifdef HAVE_MALLINFO
@ -34,8 +35,8 @@
#include "shell-enum-types.h" #include "shell-enum-types.h"
#include "shell-global-private.h" #include "shell-global-private.h"
#include "shell-jsapi-compat-private.h" #include "shell-jsapi-compat-private.h"
#include "shell-marshal.h"
#include "shell-perf-log.h" #include "shell-perf-log.h"
#include "shell-screen-grabber.h"
#include "shell-window-tracker.h" #include "shell-window-tracker.h"
#include "shell-wm.h" #include "shell-wm.h"
#include "st.h" #include "st.h"
@ -311,8 +312,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
_shell_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT); G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
/* Emitted from gnome-shell-plugin.c during event handling */ /* Emitted from gnome-shell-plugin.c during event handling */
@ -321,8 +321,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/* Emitted from gnome-shell-plugin.c during event handling */ /* Emitted from gnome-shell-plugin.c during event handling */
@ -331,8 +330,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
shell_global_signals[NOTIFY_ERROR] = shell_global_signals[NOTIFY_ERROR] =
@ -340,8 +338,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
gi_cclosure_marshal_generic,
G_TYPE_NONE, 2, G_TYPE_NONE, 2,
G_TYPE_STRING, G_TYPE_STRING,
G_TYPE_STRING); G_TYPE_STRING);
@ -1180,70 +1177,6 @@ shell_global_destroy_pointer_barrier (ShellGlobal *global, guint32 barrier)
#endif #endif
} }
/**
* shell_global_add_extension_importer:
* @target_object_script: JavaScript code evaluating to a target object
* @target_property: Name of property to use for importer
* @directory: Source directory:
* @error: A #GError
*
* This function sets a property named @target_property on the object
* resulting from the evaluation of @target_object_script code, which
* acts as a GJS importer for directory @directory.
*
* Returns: %TRUE on success
*/
gboolean
shell_global_add_extension_importer (ShellGlobal *global,
const char *target_object_script,
const char *target_property,
const char *directory,
GError **error)
{
jsval target_object;
JSContext *context = gjs_context_get_native_context (global->js_context);
char *search_path[2] = { 0, 0 };
JS_BeginRequest (context);
// This is a bit of a hack; ideally we'd be able to pass our target
// object directly into this function, but introspection doesn't
// support that at the moment. Instead evaluate a string to get it.
if (!JS_EvaluateScript(context,
JS_GetGlobalObject(context),
target_object_script,
strlen (target_object_script),
"<target_object_script>",
0,
&target_object))
{
char *message;
gjs_log_exception(context,
&message);
g_set_error(error,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"%s", message ? message : "(unknown)");
g_free(message);
goto out_error;
}
if (!JSVAL_IS_OBJECT (target_object))
{
g_error ("shell_global_add_extension_importer: invalid target object");
goto out_error;
}
search_path[0] = (char*)directory;
gjs_define_importer (context, JSVAL_TO_OBJECT (target_object), target_property, (const char **)search_path, FALSE);
JS_EndRequest (context);
return TRUE;
out_error:
JS_EndRequest (context);
return FALSE;
}
/* Code to close all file descriptors before we exec; copied from gspawn.c in GLib. /* Code to close all file descriptors before we exec; copied from gspawn.c in GLib.
* *
* Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering * Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering
@ -1965,25 +1898,67 @@ shell_global_launch_calendar_server (ShellGlobal *global)
g_free (calendar_server_exe); g_free (calendar_server_exe);
} }
static void
on_screenshot_written (GObject *source,
GAsyncResult *result,
gpointer user_data)
{
_screenshot_data *screenshot_data = (_screenshot_data*) user_data;
if (screenshot_data->callback)
screenshot_data->callback (screenshot_data->global,
g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (result)),
&screenshot_data->screenshot_area);
cairo_surface_destroy (screenshot_data->image);
g_free (screenshot_data->filename);
g_free (screenshot_data);
}
static void
write_screenshot_thread (GSimpleAsyncResult *result,
GObject *object,
GCancellable *cancellable)
{
cairo_status_t status;
_screenshot_data *screenshot_data = g_async_result_get_user_data (G_ASYNC_RESULT (result));
g_assert (screenshot_data != NULL);
status = cairo_surface_write_to_png (screenshot_data->image, screenshot_data->filename);
g_simple_async_result_set_op_res_gboolean (result, status == CAIRO_STATUS_SUCCESS);
}
static void
do_grab_screenshot (_screenshot_data *screenshot_data,
int x,
int y,
int width,
int height)
{
ShellScreenGrabber *grabber;
static const cairo_user_data_key_t key;
guchar *data;
grabber = shell_screen_grabber_new ();
data = shell_screen_grabber_grab (grabber, x, y, width, height);
g_object_unref (grabber);
screenshot_data->image = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_RGB24,
width, height, width * 4);
cairo_surface_set_user_data (screenshot_data->image, &key,
data, (cairo_destroy_func_t)g_free);
}
static void static void
grab_screenshot (ClutterActor *stage, grab_screenshot (ClutterActor *stage,
_screenshot_data *screenshot_data) _screenshot_data *screenshot_data)
{ {
MetaScreen *screen = shell_global_get_screen (screenshot_data->global); MetaScreen *screen = shell_global_get_screen (screenshot_data->global);
cairo_status_t status;
cairo_surface_t *image;
guchar *data;
int width, height; int width, height;
GSimpleAsyncResult *result;
meta_plugin_query_screen_size (screenshot_data->global->plugin, &width, &height); meta_plugin_query_screen_size (screenshot_data->global->plugin, &width, &height);
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
data = cairo_image_surface_get_data (image);
cogl_flush(); do_grab_screenshot (screenshot_data, 0, 0, width, height);
cogl_read_pixels (0, 0, width, height, COGL_READ_PIXELS_COLOR_BUFFER, CLUTTER_CAIRO_FORMAT_ARGB32, data);
cairo_surface_mark_dirty (image);
if (meta_screen_get_n_monitors (screen) > 1) if (meta_screen_get_n_monitors (screen) > 1)
{ {
@ -2009,7 +1984,7 @@ grab_screenshot (ClutterActor *stage,
cairo_region_xor (stage_region, screen_region); cairo_region_xor (stage_region, screen_region);
cairo_region_destroy (screen_region); cairo_region_destroy (screen_region);
cr = cairo_create (image); cr = cairo_create (screenshot_data->image);
for (i = 0; i < cairo_region_num_rectangles (stage_region); i++) for (i = 0; i < cairo_region_num_rectangles (stage_region); i++)
{ {
@ -2023,41 +1998,34 @@ grab_screenshot (ClutterActor *stage,
cairo_region_destroy (stage_region); cairo_region_destroy (stage_region);
} }
screenshot_data->screenshot_area.x = 0;
status = cairo_surface_write_to_png (image, screenshot_data->filename); screenshot_data->screenshot_area.y = 0;
cairo_surface_destroy (image); screenshot_data->screenshot_area.width = width;
screenshot_data->screenshot_area.height = height;
if (screenshot_data->callback)
screenshot_data->callback (screenshot_data->global, status == CAIRO_STATUS_SUCCESS);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot_data); g_signal_handlers_disconnect_by_func (stage, (void *)grab_screenshot, (gpointer)screenshot_data);
g_free (screenshot_data->filename);
g_free (screenshot_data); result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, grab_screenshot);
g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result);
} }
static void static void
grab_area_screenshot (ClutterActor *stage, grab_area_screenshot (ClutterActor *stage,
_screenshot_data *screenshot_data) _screenshot_data *screenshot_data)
{ {
cairo_status_t status; GSimpleAsyncResult *result;
cairo_surface_t *image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, screenshot_data->width, screenshot_data->height);
guchar *data = cairo_image_surface_get_data (image);
cogl_flush(); do_grab_screenshot (screenshot_data,
screenshot_data->screenshot_area.x,
cogl_read_pixels (screenshot_data->x, screenshot_data->y, screenshot_data->width, screenshot_data->height, screenshot_data->screenshot_area.y,
COGL_READ_PIXELS_COLOR_BUFFER, CLUTTER_CAIRO_FORMAT_ARGB32, data); screenshot_data->screenshot_area.width,
screenshot_data->screenshot_area.height);
cairo_surface_mark_dirty (image);
status = cairo_surface_write_to_png (image, screenshot_data->filename);
cairo_surface_destroy (image);
if (screenshot_data->callback)
screenshot_data->callback (screenshot_data->global, status == CAIRO_STATUS_SUCCESS);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot_data); g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_screenshot, (gpointer)screenshot_data);
g_free (screenshot_data->filename); result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, grab_area_screenshot);
g_free (screenshot_data); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result);
} }
/** /**
@ -2073,8 +2041,8 @@ grab_area_screenshot (ClutterActor *stage,
*/ */
void void
shell_global_screenshot (ShellGlobal *global, shell_global_screenshot (ShellGlobal *global,
const char *filename, const char *filename,
ShellGlobalScreenshotCallback callback) ShellGlobalScreenshotCallback callback)
{ {
ClutterActor *stage; ClutterActor *stage;
_screenshot_data *data = g_new0 (_screenshot_data, 1); _screenshot_data *data = g_new0 (_screenshot_data, 1);
@ -2119,10 +2087,10 @@ shell_global_screenshot_area (ShellGlobal *global,
data->global = global; data->global = global;
data->filename = g_strdup (filename); data->filename = g_strdup (filename);
data->x = x; data->screenshot_area.x = x;
data->y = y; data->screenshot_area.y = y;
data->width = width; data->screenshot_area.width = width;
data->height = height; data->screenshot_area.height = height;
data->callback = callback; data->callback = callback;
stage = CLUTTER_ACTOR (meta_plugin_get_stage (global->plugin)); stage = CLUTTER_ACTOR (meta_plugin_get_stage (global->plugin));
@ -2138,60 +2106,69 @@ shell_global_screenshot_area (ShellGlobal *global,
* @include_frame: Whether to include the frame or not * @include_frame: Whether to include the frame or not
* *
* @filename: The filename for the screenshot * @filename: The filename for the screenshot
* @callback: (scope async): function to call returning success or failure
* of the async grabbing
* *
* Takes a screenshot of the focused window (optionally omitting the frame) * Takes a screenshot of the focused window (optionally omitting the frame)
* in @filename as png image. * in @filename as png image.
* *
* Return value: success or failure.
*/ */
gboolean void
shell_global_screenshot_window (ShellGlobal *global, shell_global_screenshot_window (ShellGlobal *global,
gboolean include_frame, gboolean include_frame,
const char *filename) const char *filename,
ShellGlobalScreenshotCallback callback)
{ {
CoglHandle texture; GSimpleAsyncResult *result;
cairo_surface_t *image;
guchar *data; _screenshot_data *screenshot_data = g_new0 (_screenshot_data, 1);
MetaScreen *screen = meta_plugin_get_screen (global->plugin); MetaScreen *screen = meta_plugin_get_screen (global->plugin);
MetaDisplay *display = meta_screen_get_display (screen); MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display); MetaWindow *window = meta_display_get_focus_window (display);
ClutterActor *window_actor; ClutterActor *window_actor;
gfloat actor_x, actor_y;
MetaShapedTexture *stex;
MetaRectangle rect;
cairo_rectangle_int_t clip;
cairo_status_t status; screenshot_data->global = global;
screenshot_data->filename = g_strdup (filename);
screenshot_data->callback = callback;
window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window));
texture = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)))); clutter_actor_get_position (window_actor, &actor_x, &actor_y);
if (!include_frame) if (include_frame || !meta_window_get_frame (window))
{ {
MetaRectangle *window_rect = meta_window_get_rect (window); meta_window_get_outer_rect (window, &rect);
texture = cogl_texture_new_from_sub_texture (texture,
window_rect->x,
window_rect->y,
window_rect->width,
window_rect->height);
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, screenshot_data->screenshot_area.x = rect.x;
window_rect->width, screenshot_data->screenshot_area.y = rect.y;
window_rect->height);
clip.x = rect.x - (gint) actor_x;
clip.y = rect.y - (gint) actor_y;
} }
else else
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, {
clutter_actor_get_width (window_actor), rect = *meta_window_get_rect (window);
clutter_actor_get_height (window_actor));
data = cairo_image_surface_get_data (image); screenshot_data->screenshot_area.x = (gint) actor_x + rect.x;
screenshot_data->screenshot_area.y = (gint) actor_y + rect.y;
cogl_flush(); clip.x = rect.x;
clip.y = rect.y;
}
cogl_texture_get_data (texture, CLUTTER_CAIRO_FORMAT_ARGB32, 0, data); clip.width = screenshot_data->screenshot_area.width = rect.width;
clip.height = screenshot_data->screenshot_area.height = rect.height;
cairo_surface_mark_dirty (image); stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)));
status = cairo_surface_write_to_png (image, filename); screenshot_data->image = meta_shaped_texture_get_image (stex, &clip);
cairo_surface_destroy (image);
return status == CAIRO_STATUS_SUCCESS; result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, shell_global_screenshot_window);
g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL);
g_object_unref (result);
} }
/** /**

View File

@ -119,12 +119,6 @@ void shell_global_run_at_leisure (ShellGlobal *global,
/* Misc utilities / Shell API */ /* Misc utilities / Shell API */
gboolean shell_global_add_extension_importer (ShellGlobal *global,
const char *target_object_script,
const char *target_property,
const char *directory,
GError **error);
void shell_global_sync_pointer (ShellGlobal *global); void shell_global_sync_pointer (ShellGlobal *global);
GAppLaunchContext * GAppLaunchContext *
@ -146,7 +140,9 @@ void shell_global_reexec_self (ShellGlobal *global);
void shell_global_launch_calendar_server (ShellGlobal *global); void shell_global_launch_calendar_server (ShellGlobal *global);
typedef void (*ShellGlobalScreenshotCallback) (ShellGlobal *global, gboolean success); typedef void (*ShellGlobalScreenshotCallback) (ShellGlobal *global,
gboolean success,
cairo_rectangle_int_t *screenshot_area);
void shell_global_screenshot_area (ShellGlobal *global, void shell_global_screenshot_area (ShellGlobal *global,
int x, int x,
@ -156,9 +152,10 @@ void shell_global_screenshot_area (ShellGlobal *global,
const char *filename, const char *filename,
ShellGlobalScreenshotCallback callback); ShellGlobalScreenshotCallback callback);
gboolean shell_global_screenshot_window (ShellGlobal *global, void shell_global_screenshot_window (ShellGlobal *global,
gboolean include_frame, gboolean include_frame,
const char *filename); const char *filename,
ShellGlobalScreenshotCallback callback);
void shell_global_screenshot (ShellGlobal *global, void shell_global_screenshot (ShellGlobal *global,
const char *filename, const char *filename,

81
src/shell-js.c Normal file
View File

@ -0,0 +1,81 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "config.h"
#include "shell-js.h"
#include <jsapi.h>
#include <gio/gio.h>
#include <gjs/gjs.h>
#include <gjs/gjs-module.h>
/**
* shell_js_add_extension_importer:
* @target_object_script: JavaScript code evaluating to a target object
* @target_property: Name of property to use for importer
* @directory: Source directory:
* @error: A #GError
*
* This function sets a property named @target_property on the object
* resulting from the evaluation of @target_object_script code, which
* acts as a GJS importer for directory @directory.
*
* Returns: %TRUE on success
*/
gboolean
shell_js_add_extension_importer (const char *target_object_script,
const char *target_property,
const char *directory,
GError **error)
{
jsval target_object;
GList *contexts;
JSContext *context;
char *search_path[2] = { 0, 0 };
gboolean ret = FALSE;
/* Take the first GjsContext from all of them --
* we should only ever have one context, so this
* should be alright. */
contexts = gjs_context_get_all ();
context = gjs_context_get_native_context (contexts->data);
g_list_free_full (contexts, g_object_unref);
JS_BeginRequest (context);
/* This is a bit of a hack; ideally we'd be able to pass our target
* object directly into this function, but introspection doesn't
* support that at the moment. Instead evaluate a string to get it. */
if (!JS_EvaluateScript(context,
JS_GetGlobalObject(context),
target_object_script,
strlen (target_object_script),
"<target_object_script>",
0,
&target_object))
{
char *message;
gjs_log_exception(context,
&message);
g_set_error(error,
G_IO_ERROR,
G_IO_ERROR_FAILED,
"%s", message ? message : "(unknown)");
g_free(message);
goto out;
}
if (!JSVAL_IS_OBJECT (target_object))
{
g_error ("shell_js_add_extension_importer: invalid target object");
goto out;
}
search_path[0] = (char*)directory;
gjs_define_importer (context, JSVAL_TO_OBJECT (target_object), target_property, (const char **)search_path, FALSE);
ret = TRUE;
out:
JS_EndRequest (context);
return ret;
}

16
src/shell-js.h Normal file
View File

@ -0,0 +1,16 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_JS_H__
#define __SHELL_JS_H__
#include <glib.h>
G_BEGIN_DECLS
gboolean shell_js_add_extension_importer (const char *target_object_script,
const char *target_property,
const char *directory,
GError **error);
G_BEGIN_DECLS
#endif /* __SHELL_JS_H__ */

View File

@ -1,9 +0,0 @@
VOID:INT,INT,INT
VOID:OBJECT,INT,INT,INT,INT
VOID:BOXED
VOID:BOXED,OBJECT
VOID:OBJECT,OBJECT
VOID:STRING,UINT,OBJECT,BOOLEAN
VOID:INT,INT
VOID:STRING,STRING,STRING,STRING,BOXED
VOID:STRING,OBJECT,STRING,BOXED

View File

@ -135,8 +135,7 @@ shell_mount_operation_class_init (ShellMountOperationClass *klass)
g_signal_new ("show-processes-2", g_signal_new ("show-processes-2",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, NULL, NULL, 0, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (klass, sizeof (ShellMountOperationPrivate)); g_type_class_add_private (klass, sizeof (ShellMountOperationPrivate));

View File

@ -24,7 +24,6 @@
#include <gnome-keyring.h> #include <gnome-keyring.h>
#include "shell-network-agent.h" #include "shell-network-agent.h"
#include "shell-marshal.h"
enum { enum {
SIGNAL_NEW_REQUEST, SIGNAL_NEW_REQUEST,
@ -775,7 +774,7 @@ shell_network_agent_class_init (ShellNetworkAgentClass *klass)
0, /* class offset */ 0, /* class offset */
NULL, /* accumulator */ NULL, /* accumulator */
NULL, /* accu_data */ NULL, /* accu_data */
_shell_marshal_VOID__STRING_OBJECT_STRING_BOXED, NULL, /* marshaller */
G_TYPE_NONE, /* return */ G_TYPE_NONE, /* return */
3, /* n_params */ 3, /* n_params */
G_TYPE_STRING, G_TYPE_STRING,
@ -789,7 +788,7 @@ shell_network_agent_class_init (ShellNetworkAgentClass *klass)
0, /* class offset */ 0, /* class offset */
NULL, /* accumulator */ NULL, /* accumulator */
NULL, /* accu_data */ NULL, /* accu_data */
g_cclosure_marshal_VOID__STRING, NULL, /* marshaller */
G_TYPE_NONE, G_TYPE_NONE,
1, /* n_params */ 1, /* n_params */
G_TYPE_STRING); G_TYPE_STRING);

View File

@ -10,8 +10,6 @@
#include <pwd.h> #include <pwd.h>
#include "shell-marshal.h"
#define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE #define POLKIT_AGENT_I_KNOW_API_IS_SUBJECT_TO_CHANGE
#include <polkitagent/polkitagent.h> #include <polkitagent/polkitagent.h>
#include "shell-polkit-authentication-agent.h" #include "shell-polkit-authentication-agent.h"
@ -173,7 +171,7 @@ shell_polkit_authentication_agent_class_init (ShellPolkitAuthenticationAgentClas
0, /* class_offset */ 0, /* class_offset */
NULL, /* accumulator */ NULL, /* accumulator */
NULL, /* accumulator data */ NULL, /* accumulator data */
_shell_marshal_VOID__STRING_STRING_STRING_STRING_BOXED, NULL, /* marshaller */
G_TYPE_NONE, G_TYPE_NONE,
5, 5,
G_TYPE_STRING, G_TYPE_STRING,
@ -189,7 +187,7 @@ shell_polkit_authentication_agent_class_init (ShellPolkitAuthenticationAgentClas
0, /* class_offset */ 0, /* class_offset */
NULL, /* accumulator */ NULL, /* accumulator */
NULL, /* accumulator data */ NULL, /* accumulator data */
g_cclosure_marshal_VOID__VOID, NULL, /* marshaller */
G_TYPE_NONE, G_TYPE_NONE,
0); 0);
} }

View File

@ -40,6 +40,8 @@ static void
shell_recorder_src_init (ShellRecorderSrc *src, shell_recorder_src_init (ShellRecorderSrc *src,
ShellRecorderSrcClass *klass) ShellRecorderSrcClass *klass)
{ {
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
src->queue = g_async_queue_new (); src->queue = g_async_queue_new ();
src->mutex = &src->mutex_data; src->mutex = &src->mutex_data;
g_mutex_init (src->mutex); g_mutex_init (src->mutex);

View File

@ -12,6 +12,7 @@
#include "shell-recorder-src.h" #include "shell-recorder-src.h"
#include "shell-recorder.h" #include "shell-recorder.h"
#include "shell-screen-grabber.h"
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <X11/extensions/Xfixes.h> #include <X11/extensions/Xfixes.h>
@ -47,6 +48,8 @@ struct _ShellRecorder {
int stage_width; int stage_width;
int stage_height; int stage_height;
ShellScreenGrabber *grabber;
gboolean have_pointer; gboolean have_pointer;
int pointer_x; int pointer_x;
int pointer_y; int pointer_y;
@ -74,6 +77,7 @@ struct _ShellRecorder {
GSList *pipelines; /* all pipelines */ GSList *pipelines; /* all pipelines */
GstClockTime start_time; /* When we started recording (adjusted for pauses) */ GstClockTime start_time; /* When we started recording (adjusted for pauses) */
GstClockTime last_frame_time; /* Timestamp for the last frame */
GstClockTime pause_time; /* When the pipeline was paused */ GstClockTime pause_time; /* When the pipeline was paused */
/* GSource IDs for different timeouts and idles */ /* GSource IDs for different timeouts and idles */
@ -114,14 +118,12 @@ enum {
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT); G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
/* The number of frames per second we configure for the GStreamer pipeline. /* The default value of the target frame rate; we'll never record more
* (the number of frames we actually write into the GStreamer pipeline is * than this many frames per second, though we may record less if the
* based entirely on how fast clutter is drawing.) Using 60fps seems high * screen isn't being redrawn. 30 is a compromise between smoothness
* but the observed smoothness is a lot better than for 30fps when encoding * and the size of the recording.
* as theora for a minimal size increase. This may be an artifact of the
* encoding process.
*/ */
#define DEFAULT_FRAMES_PER_SECOND 15 #define DEFAULT_FRAMES_PER_SECOND 30
/* The time (in milliseconds) between querying the server for the cursor /* The time (in milliseconds) between querying the server for the cursor
* position. * position.
@ -145,7 +147,7 @@ G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
* (Theora does have some support for frames at non-uniform times, but * (Theora does have some support for frames at non-uniform times, but
* things seem to break down if there are large gaps.) * things seem to break down if there are large gaps.)
*/ */
#define DEFAULT_PIPELINE "videorate ! vp8enc quality=10 speed=2 threads=%T ! queue ! webmmux" #define DEFAULT_PIPELINE "vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux"
/* The default filename pattern. Example shell-20090311b-2.webm /* The default filename pattern. Example shell-20090311b-2.webm
*/ */
@ -265,6 +267,8 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->recording_icon = create_recording_icon (); recorder->recording_icon = create_recording_icon ();
recorder->memory_target = get_memory_target(); recorder->memory_target = get_memory_target();
recorder->grabber = shell_screen_grabber_new ();
recorder->state = RECORDER_STATE_CLOSED; recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND; recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
} }
@ -296,6 +300,8 @@ shell_recorder_finalize (GObject *object)
recorder_set_pipeline (recorder, NULL); recorder_set_pipeline (recorder, NULL);
recorder_set_filename (recorder, NULL); recorder_set_filename (recorder, NULL);
g_object_unref (recorder->grabber);
cogl_handle_unref (recorder->recording_icon); cogl_handle_unref (recorder->recording_icon);
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object); G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
@ -518,21 +524,35 @@ recorder_record_frame (ShellRecorder *recorder)
GstBuffer *buffer; GstBuffer *buffer;
guint8 *data; guint8 *data;
guint size; guint size;
GstClockTime now;
/* If we get into the red zone, stop buffering new frames; 13/16 is
* a bit more than the 3/4 threshold for a red indicator to keep the
* indicator from flashing between red and yellow. */
if (recorder->memory_used > (recorder->memory_target * 13) / 16)
return;
/* Drop frames to get down to something like the target frame rate; since frames
* are generated with VBlank sync, we don't have full control anyways, so we just
* drop frames if the interval since the last frame is less than 75% of the
* desired inter-frame interval.
*/
now = get_wall_time();
if (now - recorder->last_frame_time < (3 * 1000000000LL / (4 * recorder->framerate)))
return;
recorder->last_frame_time = now;
size = recorder->stage_width * recorder->stage_height * 4; size = recorder->stage_width * recorder->stage_height * 4;
data = g_malloc (size);
data = shell_screen_grabber_grab (recorder->grabber,
0, 0, recorder->stage_width, recorder->stage_height);
buffer = gst_buffer_new(); buffer = gst_buffer_new();
GST_BUFFER_SIZE(buffer) = size; GST_BUFFER_SIZE(buffer) = size;
GST_BUFFER_MALLOCDATA(buffer) = GST_BUFFER_DATA(buffer) = data; GST_BUFFER_MALLOCDATA(buffer) = GST_BUFFER_DATA(buffer) = data;
GST_BUFFER_TIMESTAMP(buffer) = get_wall_time() - recorder->start_time; GST_BUFFER_TIMESTAMP(buffer) = now - recorder->start_time;
cogl_read_pixels (0, 0,
recorder->stage_width, recorder->stage_height,
COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
recorder_draw_cursor (recorder, buffer); recorder_draw_cursor (recorder, buffer);
@ -1558,9 +1578,15 @@ shell_recorder_new (ClutterStage *stage)
* @recorder: the #ShellRecorder * @recorder: the #ShellRecorder
* @framerate: Framerate used for resulting video in frames-per-second. * @framerate: Framerate used for resulting video in frames-per-second.
* *
* Sets the number of frames per second we configure for the GStreamer pipeline. * Sets the number of frames per second we try to record. Less frames
* will be recorded when the screen doesn't need to be redrawn this
* quickly. (This value will also be set as the framerate for the
* GStreamer pipeline; whether that has an effect on the resulting
* video will depend on the details of the pipeline and the codec. The
* default encoding to webm format doesn't pay attention to the pipeline
* framerate.)
* *
* The default value is 15. * The default value is 30.
*/ */
void void
shell_recorder_set_framerate (ShellRecorder *recorder, shell_recorder_set_framerate (ShellRecorder *recorder,
@ -1619,7 +1645,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
* might be used to send the output to an icecast server * might be used to send the output to an icecast server
* via shout2send or similar. * via shout2send or similar.
* *
* The default value is 'videorate ! theoraenc ! oggmux' * The default value is 'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux'
*/ */
void void
shell_recorder_set_pipeline (ShellRecorder *recorder, shell_recorder_set_pipeline (ShellRecorder *recorder,
@ -1662,6 +1688,7 @@ shell_recorder_record (ShellRecorder *recorder)
* pause * pause
*/ */
recorder->start_time = recorder->start_time + (get_wall_time() - recorder->pause_time); recorder->start_time = recorder->start_time + (get_wall_time() - recorder->pause_time);
recorder->last_frame_time = 0;
} }
else else
{ {
@ -1669,6 +1696,7 @@ shell_recorder_record (ShellRecorder *recorder)
return FALSE; return FALSE;
recorder->start_time = get_wall_time(); recorder->start_time = get_wall_time();
recorder->last_frame_time = 0;
} }
recorder->state = RECORDER_STATE_RECORDING; recorder->state = RECORDER_STATE_RECORDING;

205
src/shell-screen-grabber.c Normal file
View File

@ -0,0 +1,205 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include <string.h>
#include <clutter/clutter.h>
#include <cogl/cogl.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <GL/glext.h>
#include "shell-screen-grabber.h"
PFNGLBINDBUFFERARBPROC pf_glBindBufferARB;
PFNGLBUFFERDATAARBPROC pf_glBufferDataARB;
PFNGLDELETEBUFFERSARBPROC pf_glDeleteBuffersARB;
PFNGLGENBUFFERSARBPROC pf_glGenBuffersARB;
PFNGLMAPBUFFERARBPROC pf_glMapBufferARB;
PFNGLUNMAPBUFFERARBPROC pf_glUnmapBufferARB;
struct _ShellScreenGrabberClass
{
GObjectClass parent_class;
};
struct _ShellScreenGrabber
{
GObject parent_instance;
int have_pixel_buffers;
int have_pack_invert;
int width, height;
GLuint pixel_buffer;
};
G_DEFINE_TYPE(ShellScreenGrabber, shell_screen_grabber, G_TYPE_OBJECT);
static void
shell_screen_grabber_finalize (GObject *gobject)
{
ShellScreenGrabber *grabber = SHELL_SCREEN_GRABBER (gobject);
if (grabber->pixel_buffer != 0)
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
}
static void
shell_screen_grabber_class_init (ShellScreenGrabberClass *grabber_class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (grabber_class);
gobject_class->finalize = shell_screen_grabber_finalize;
}
static void
shell_screen_grabber_init (ShellScreenGrabber *grabber)
{
grabber->have_pixel_buffers = -1;
grabber->width = -1;
grabber->height= -1;
grabber->pixel_buffer = 0;
}
ShellScreenGrabber *
shell_screen_grabber_new (void)
{
return g_object_new (SHELL_TYPE_SCREEN_GRABBER, NULL);
}
/**
* shell_screen_grabber_grab:
* x: X coordinate of the rectangle to grab
* y: Y coordinate of the rectangle to grab
* width: width of the rectangle to grab
* height: heigth of the rectangle to grab
*
* Grabs pixel data from a portion of the screen.
*
* Return value: buffer holding the grabbed data. The data is stored as 32-bit
* words with native-endian xRGB pixels (i.e., the same as CAIRO_FORMAT_RGB24)
* with no padding on the rows. So, the size of the buffer is width * height * 4
* bytes. Free with g_free().
**/
guchar *
shell_screen_grabber_grab (ShellScreenGrabber *grabber,
int x,
int y,
int width,
int height)
{
guchar *data;
gsize row_bytes;
gsize data_size;
row_bytes = width * 4;
data_size = row_bytes * height;
data = g_malloc (data_size);
if (grabber->have_pixel_buffers == -1)
{
const GLubyte* extensions = glGetString (GL_EXTENSIONS);
grabber->have_pixel_buffers = strstr ((const char *)extensions, "GL_EXT_pixel_buffer_object") != NULL;
grabber->have_pack_invert = strstr ((const char *)extensions, "GL_MESA_pack_invert") != NULL;
}
if (grabber->have_pixel_buffers)
{
GLubyte *mapped_data;
GLint old_swap_bytes, old_lsb_first, old_row_length, old_skip_pixels, old_skip_rows, old_alignment;
GLint old_pack_invert = GL_FALSE;
guchar *src_row, *dest_row;
int i;
cogl_flush ();
if (pf_glBindBufferARB == NULL)
{
pf_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) cogl_get_proc_address ("glBindBufferARB");
pf_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) cogl_get_proc_address ("glBufferDataARB");
pf_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) cogl_get_proc_address ("glDeleteBuffersARB");
pf_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) cogl_get_proc_address ("glGenBuffersARB");
pf_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) cogl_get_proc_address ("glMapBufferARB");
pf_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) cogl_get_proc_address ("glUnmapBufferARB");
}
glGetIntegerv (GL_PACK_SWAP_BYTES, &old_swap_bytes);
glGetIntegerv (GL_PACK_LSB_FIRST, &old_lsb_first);
glGetIntegerv (GL_PACK_ROW_LENGTH, &old_row_length);
glGetIntegerv (GL_PACK_SKIP_PIXELS, &old_skip_pixels);
glGetIntegerv (GL_PACK_SKIP_ROWS, &old_skip_rows);
glGetIntegerv (GL_PACK_ALIGNMENT, &old_alignment);
glPixelStorei (GL_PACK_SWAP_BYTES, GL_FALSE);
glPixelStorei (GL_PACK_LSB_FIRST, GL_FALSE);
glPixelStorei (GL_PACK_ROW_LENGTH, 0);
glPixelStorei (GL_PACK_SKIP_PIXELS, 0);
glPixelStorei (GL_PACK_SKIP_ROWS, 0);
glPixelStorei (GL_PACK_ALIGNMENT, 1);
if (grabber->have_pack_invert)
{
glGetIntegerv (GL_PACK_INVERT_MESA, &old_pack_invert);
glPixelStorei (GL_PACK_INVERT_MESA, GL_FALSE);
}
if (grabber->pixel_buffer != 0 &&
(grabber->width != width ||
grabber->height != height))
{
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
grabber->pixel_buffer = 0;
}
if (grabber->pixel_buffer == 0)
{
pf_glGenBuffersARB (1, &grabber->pixel_buffer);
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
pf_glBufferDataARB (GL_PIXEL_PACK_BUFFER_ARB, data_size, 0, GL_STREAM_READ_ARB);
grabber->width = width;
grabber->height = height;
}
else
{
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
}
glReadPixels (x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
mapped_data = pf_glMapBufferARB (GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
src_row = mapped_data + (height - 1) * row_bytes;
dest_row = data;
for (i = 0; i < height; i++)
{
memcpy (dest_row, src_row, row_bytes);
src_row -= row_bytes;
dest_row += row_bytes;
}
pf_glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_ARB);
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, 0);
glPixelStorei (GL_PACK_SWAP_BYTES, old_swap_bytes);
glPixelStorei (GL_PACK_LSB_FIRST, old_lsb_first);
glPixelStorei (GL_PACK_ROW_LENGTH, old_row_length);
glPixelStorei (GL_PACK_SKIP_PIXELS, old_skip_pixels);
glPixelStorei (GL_PACK_SKIP_ROWS, old_skip_rows);
glPixelStorei (GL_PACK_ALIGNMENT, old_alignment);
if (grabber->have_pack_invert)
glPixelStorei (GL_PACK_INVERT_MESA, old_pack_invert);
}
else
{
cogl_read_pixels (x, y,
width, height,
COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
}
return data;
}

View File

@ -0,0 +1,44 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_SCREEN_GRABBER_H__
#define __SHELL_SCREEN_GRABBER_H__
#include <glib-object.h>
G_BEGIN_DECLS
/**
* SECTION:shell-screen-grabber
* @short_description: Grab pixel data from the screen
*
* The #ShellScreenGrabber object is used to download previous drawn
* content to the screen. It internally uses pixel-buffer objects if
* available, otherwise falls back to cogl_read_pixels().
*
* If you are repeatedly grabbing images of the same size from the
* screen, it makes sense to create one #ShellScreenGrabber and keep
* it around. Otherwise, it's fine to simply create one as needed and
* then get rid of it.
*/
typedef struct _ShellScreenGrabber ShellScreenGrabber;
typedef struct _ShellScreenGrabberClass ShellScreenGrabberClass;
#define SHELL_TYPE_SCREEN_GRABBER (shell_screen_grabber_get_type ())
#define SHELL_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabber))
#define SHELL_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
#define SHELL_IS_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_SCREEN_GRABBER))
#define SHELL_IS_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_SCREEN_GRABBER))
#define SHELL_SCREEN_GRABBER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
GType shell_screen_grabber_get_type (void) G_GNUC_CONST;
ShellScreenGrabber *shell_screen_grabber_new (void);
guchar * shell_screen_grabber_grab (ShellScreenGrabber *grabber,
int x,
int y,
int width,
int height);
G_END_DECLS
#endif /* __SHELL_SCREEN_GRABBER_H__ */

View File

@ -157,8 +157,7 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_added), G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_added),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);
shell_tray_manager_signals[TRAY_ICON_REMOVED] = shell_tray_manager_signals[TRAY_ICON_REMOVED] =
@ -166,8 +165,7 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_removed), G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_removed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR); CLUTTER_TYPE_ACTOR);

View File

@ -678,18 +678,6 @@ shell_get_file_contents_utf8_sync (const char *path,
return contents; return contents;
} }
/**
* shell_breakpoint:
*
* Using G_BREAKPOINT(), interrupt the current process. This is useful
* in conjunction with a debugger such as gdb.
*/
void
shell_breakpoint (void)
{
G_BREAKPOINT ();
}
/** /**
* shell_parse_search_provider: * shell_parse_search_provider:
* @data: description of provider * @data: description of provider

View File

@ -39,8 +39,6 @@ gboolean shell_write_string_to_stream (GOutputStream *stream,
char *shell_get_file_contents_utf8_sync (const char *path, char *shell_get_file_contents_utf8_sync (const char *path,
GError **error); GError **error);
void shell_breakpoint (void);
gboolean shell_parse_search_provider (const char *data, gboolean shell_parse_search_provider (const char *data,
char **name, char **name,
char **url, char **url,

View File

@ -20,7 +20,6 @@
#include "shell-window-tracker-private.h" #include "shell-window-tracker-private.h"
#include "shell-app-private.h" #include "shell-app-private.h"
#include "shell-global.h" #include "shell-global.h"
#include "shell-marshal.h"
#include "st.h" #include "st.h"
/* This file includes modified code from /* This file includes modified code from
@ -117,15 +116,13 @@ shell_window_tracker_class_init (ShellWindowTrackerClass *klass)
SHELL_TYPE_WINDOW_TRACKER, SHELL_TYPE_WINDOW_TRACKER,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
G_TYPE_NONE, 1, SHELL_TYPE_STARTUP_SEQUENCE); G_TYPE_NONE, 1, SHELL_TYPE_STARTUP_SEQUENCE);
signals[TRACKED_WINDOWS_CHANGED] = g_signal_new ("tracked-windows-changed", signals[TRACKED_WINDOWS_CHANGED] = g_signal_new ("tracked-windows-changed",
SHELL_TYPE_WINDOW_TRACKER, SHELL_TYPE_WINDOW_TRACKER,
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -8,7 +8,6 @@
#include "shell-wm-private.h" #include "shell-wm-private.h"
#include "shell-global.h" #include "shell-global.h"
#include "shell-marshal.h"
struct _ShellWM { struct _ShellWM {
GObject parent; GObject parent;
@ -58,8 +57,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR); META_TYPE_WINDOW_ACTOR);
shell_wm_signals[MAXIMIZE] = shell_wm_signals[MAXIMIZE] =
@ -67,8 +65,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
_shell_marshal_VOID__OBJECT_INT_INT_INT_INT,
G_TYPE_NONE, 5, G_TYPE_NONE, 5,
META_TYPE_WINDOW_ACTOR, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); META_TYPE_WINDOW_ACTOR, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
shell_wm_signals[UNMAXIMIZE] = shell_wm_signals[UNMAXIMIZE] =
@ -76,8 +73,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
_shell_marshal_VOID__OBJECT_INT_INT_INT_INT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); META_TYPE_WINDOW_ACTOR, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
shell_wm_signals[MAP] = shell_wm_signals[MAP] =
@ -85,8 +81,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR); META_TYPE_WINDOW_ACTOR);
shell_wm_signals[DESTROY] = shell_wm_signals[DESTROY] =
@ -94,8 +89,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR); META_TYPE_WINDOW_ACTOR);
shell_wm_signals[SWITCH_WORKSPACE] = shell_wm_signals[SWITCH_WORKSPACE] =
@ -103,8 +97,7 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
_shell_marshal_VOID__INT_INT_INT,
G_TYPE_NONE, 3, G_TYPE_NONE, 3,
G_TYPE_INT, G_TYPE_INT, G_TYPE_INT); G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
shell_wm_signals[KILL_SWITCH_WORKSPACE] = shell_wm_signals[KILL_SWITCH_WORKSPACE] =
@ -112,16 +105,14 @@ shell_wm_class_init (ShellWMClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
shell_wm_signals[KILL_WINDOW_EFFECTS] = shell_wm_signals[KILL_WINDOW_EFFECTS] =
g_signal_new ("kill-window-effects", g_signal_new ("kill-window-effects",
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
META_TYPE_WINDOW_ACTOR); META_TYPE_WINDOW_ACTOR);
} }

View File

@ -304,8 +304,7 @@ shell_xfixes_cursor_class_init (ShellXFixesCursorClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, 0,
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
gobject_class->get_property = shell_xfixes_cursor_get_property; gobject_class->get_property = shell_xfixes_cursor_get_property;

View File

@ -34,7 +34,6 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include "st-adjustment.h" #include "st-adjustment.h"
#include "st-marshal.h"
#include "st-private.h" #include "st-private.h"
G_DEFINE_TYPE (StAdjustment, st_adjustment, G_TYPE_OBJECT) G_DEFINE_TYPE (StAdjustment, st_adjustment, G_TYPE_OBJECT)
@ -267,8 +266,7 @@ st_adjustment_class_init (StAdjustmentClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StAdjustmentClass, changed), G_STRUCT_OFFSET (StAdjustmentClass, changed),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -41,7 +41,6 @@
#include "st-button.h" #include "st-button.h"
#include "st-enum-types.h" #include "st-enum-types.h"
#include "st-marshal.h"
#include "st-texture-cache.h" #include "st-texture-cache.h"
#include "st-private.h" #include "st-private.h"
@ -444,8 +443,7 @@ st_button_class_init (StButtonClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StButtonClass, clicked), G_STRUCT_OFFSET (StButtonClass, clicked),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__INT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
G_TYPE_INT); G_TYPE_INT);
} }

View File

@ -184,8 +184,7 @@ st_drawing_area_class_init (StDrawingAreaClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StDrawingAreaClass, repaint), G_STRUCT_OFFSET (StDrawingAreaClass, repaint),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
g_type_class_add_private (gobject_class, sizeof (StDrawingAreaPrivate)); g_type_class_add_private (gobject_class, sizeof (StDrawingAreaPrivate));

View File

@ -62,7 +62,6 @@
#include "st-icon.h" #include "st-icon.h"
#include "st-widget.h" #include "st-widget.h"
#include "st-texture-cache.h" #include "st-texture-cache.h"
#include "st-marshal.h"
#include "st-clipboard.h" #include "st-clipboard.h"
#include "st-private.h" #include "st-private.h"
@ -548,38 +547,6 @@ st_entry_pick (ClutterActor *actor,
clutter_actor_paint (priv->secondary_icon); clutter_actor_paint (priv->secondary_icon);
} }
static void
st_entry_map (ClutterActor *actor)
{
StEntryPrivate *priv = ST_ENTRY (actor)->priv;
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->map (actor);
clutter_actor_map (priv->entry);
if (priv->primary_icon)
clutter_actor_map (priv->primary_icon);
if (priv->secondary_icon)
clutter_actor_map (priv->secondary_icon);
}
static void
st_entry_unmap (ClutterActor *actor)
{
StEntryPrivate *priv = ST_ENTRY (actor)->priv;
CLUTTER_ACTOR_CLASS (st_entry_parent_class)->unmap (actor);
clutter_actor_unmap (priv->entry);
if (priv->primary_icon)
clutter_actor_unmap (priv->primary_icon);
if (priv->secondary_icon)
clutter_actor_unmap (priv->secondary_icon);
}
static void static void
st_entry_clipboard_callback (StClipboard *clipboard, st_entry_clipboard_callback (StClipboard *clipboard,
const gchar *text, const gchar *text,
@ -695,8 +662,6 @@ st_entry_class_init (StEntryClass *klass)
actor_class->allocate = st_entry_allocate; actor_class->allocate = st_entry_allocate;
actor_class->paint = st_entry_paint; actor_class->paint = st_entry_paint;
actor_class->pick = st_entry_pick; actor_class->pick = st_entry_pick;
actor_class->map = st_entry_map;
actor_class->unmap = st_entry_unmap;
actor_class->key_press_event = st_entry_key_press_event; actor_class->key_press_event = st_entry_key_press_event;
actor_class->key_focus_in = st_entry_key_focus_in; actor_class->key_focus_in = st_entry_key_focus_in;
@ -735,8 +700,7 @@ st_entry_class_init (StEntryClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StEntryClass, primary_icon_clicked), G_STRUCT_OFFSET (StEntryClass, primary_icon_clicked),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
* StEntry::secondary-icon-clicked: * StEntry::secondary-icon-clicked:
@ -748,8 +712,7 @@ st_entry_class_init (StEntryClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StEntryClass, secondary_icon_clicked), G_STRUCT_OFFSET (StEntryClass, secondary_icon_clicked),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -88,12 +88,15 @@ st_im_text_dispose (GObject *object)
{ {
StIMTextPrivate *priv = ST_IM_TEXT (object)->priv; StIMTextPrivate *priv = ST_IM_TEXT (object)->priv;
g_signal_handlers_disconnect_by_func (priv->im_context, if (priv->im_context != NULL)
(void *) st_im_text_commit_cb, {
object); g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_commit_cb,
object);
g_object_unref (priv->im_context); g_object_unref (priv->im_context);
priv->im_context = NULL; priv->im_context = NULL;
}
G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object); G_OBJECT_CLASS (st_im_text_parent_class)->dispose (object);
} }

View File

@ -253,26 +253,6 @@ st_label_paint (ClutterActor *actor)
clutter_actor_paint (priv->label); clutter_actor_paint (priv->label);
} }
static void
st_label_map (ClutterActor *actor)
{
StLabelPrivate *priv = ST_LABEL (actor)->priv;
CLUTTER_ACTOR_CLASS (st_label_parent_class)->map (actor);
clutter_actor_map (priv->label);
}
static void
st_label_unmap (ClutterActor *actor)
{
StLabelPrivate *priv = ST_LABEL (actor)->priv;
CLUTTER_ACTOR_CLASS (st_label_parent_class)->unmap (actor);
clutter_actor_unmap (priv->label);
}
static void static void
st_label_class_init (StLabelClass *klass) st_label_class_init (StLabelClass *klass)
{ {
@ -291,8 +271,6 @@ st_label_class_init (StLabelClass *klass)
actor_class->allocate = st_label_allocate; actor_class->allocate = st_label_allocate;
actor_class->get_preferred_width = st_label_get_preferred_width; actor_class->get_preferred_width = st_label_get_preferred_width;
actor_class->get_preferred_height = st_label_get_preferred_height; actor_class->get_preferred_height = st_label_get_preferred_height;
actor_class->map = st_label_map;
actor_class->unmap = st_label_unmap;
widget_class->style_changed = st_label_style_changed; widget_class->style_changed = st_label_style_changed;
widget_class->get_accessible_type = st_label_accessible_get_type; widget_class->get_accessible_type = st_label_accessible_get_type;
@ -481,12 +459,24 @@ st_label_accessible_init (StLabelAccessible *self)
/* initialization done on AtkObject->initialize */ /* initialization done on AtkObject->initialize */
} }
static void
label_text_notify_cb (StLabel *label,
GParamSpec *pspec,
AtkObject *accessible)
{
g_object_notify (G_OBJECT (accessible), "accessible-name");
}
static void static void
st_label_accessible_initialize (AtkObject *obj, st_label_accessible_initialize (AtkObject *obj,
gpointer data) gpointer data)
{ {
ATK_OBJECT_CLASS (st_label_accessible_parent_class)->initialize (obj, data); ATK_OBJECT_CLASS (st_label_accessible_parent_class)->initialize (obj, data);
g_signal_connect (data, "notify::text",
G_CALLBACK (label_text_notify_cb),
obj);
obj->role = ATK_ROLE_LABEL; obj->role = ATK_ROLE_LABEL;
} }

View File

@ -1,13 +0,0 @@
VOID:OBJECT
VOID:VOID
VOID:PARAM
VOID:POINTER
VOID:INT
VOID:UINT
VOID:UINT,UINT
VOID:OBJECT,OBJECT
VOID:STRING,OBJECT
VOID:OBJECT,OBJECT,INT,INT
VOID:OBJECT,FLOAT,FLOAT,INT,ENUM
VOID:FLOAT,FLOAT,INT,ENUM
VOID:FLOAT,FLOAT

View File

@ -36,7 +36,6 @@
#include "st-scroll-bar.h" #include "st-scroll-bar.h"
#include "st-bin.h" #include "st-bin.h"
#include "st-marshal.h"
#include "st-enum-types.h" #include "st-enum-types.h"
#include "st-private.h" #include "st-private.h"
#include "st-button.h" #include "st-button.h"
@ -243,36 +242,12 @@ st_scroll_bar_pick (ClutterActor *actor,
clutter_actor_paint (priv->handle); clutter_actor_paint (priv->handle);
} }
static void
st_scroll_bar_map (ClutterActor *actor)
{
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->map (actor);
clutter_actor_map (priv->bw_stepper);
clutter_actor_map (priv->fw_stepper);
clutter_actor_map (priv->trough);
if (priv->handle)
clutter_actor_map (priv->handle);
}
static void static void
st_scroll_bar_unmap (ClutterActor *actor) st_scroll_bar_unmap (ClutterActor *actor)
{ {
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->unmap (actor); CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->unmap (actor);
stop_scrolling (ST_SCROLL_BAR (actor)); stop_scrolling (ST_SCROLL_BAR (actor));
clutter_actor_unmap (priv->bw_stepper);
clutter_actor_unmap (priv->fw_stepper);
clutter_actor_unmap (priv->trough);
if (priv->handle)
clutter_actor_unmap (priv->handle);
} }
static void static void
@ -688,7 +663,6 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
actor_class->paint = st_scroll_bar_paint; actor_class->paint = st_scroll_bar_paint;
actor_class->pick = st_scroll_bar_pick; actor_class->pick = st_scroll_bar_pick;
actor_class->scroll_event = st_scroll_bar_scroll_event; actor_class->scroll_event = st_scroll_bar_scroll_event;
actor_class->map = st_scroll_bar_map;
actor_class->unmap = st_scroll_bar_unmap; actor_class->unmap = st_scroll_bar_unmap;
widget_class->style_changed = st_scroll_bar_style_changed; widget_class->style_changed = st_scroll_bar_style_changed;
@ -714,8 +688,7 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StScrollBarClass, scroll_start), G_STRUCT_OFFSET (StScrollBarClass, scroll_start),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
signals[SCROLL_STOP] = signals[SCROLL_STOP] =
@ -723,8 +696,7 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StScrollBarClass, scroll_stop), G_STRUCT_OFFSET (StScrollBarClass, scroll_stop),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -59,7 +59,6 @@
*/ */
#include "st-scroll-view.h" #include "st-scroll-view.h"
#include "st-marshal.h"
#include "st-scroll-bar.h" #include "st-scroll-bar.h"
#include "st-scrollable.h" #include "st-scrollable.h"
#include "st-scroll-view-fade.h" #include "st-scroll-view-fade.h"

View File

@ -41,7 +41,6 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include "st-enum-types.h" #include "st-enum-types.h"
#include "st-marshal.h"
#include "st-private.h" #include "st-private.h"
#include "st-table-child.h" #include "st-table-child.h"
#include "st-table-private.h" #include "st-table-private.h"

View File

@ -95,8 +95,7 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, /* no default handler slot */ 0, /* no default handler slot */
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -86,8 +86,7 @@ st_theme_context_class_init (StThemeContextClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
0, /* no default handler slot */ 0, /* no default handler slot */
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -469,12 +469,12 @@ get_background_position (StThemeNode *self,
gdouble scale_w, scale_h; gdouble scale_w, scale_h;
/* get the background image size */ /* get the background image size */
background_image_width = allocation->x2 - allocation->x1; background_image_width = cogl_texture_get_width (self->background_texture);
background_image_height = allocation->y2 - allocation->y1; background_image_height = cogl_texture_get_height (self->background_texture);
/* get the painting area size */ /* get the painting area size */
painting_area_width = cogl_texture_get_width (self->background_texture); painting_area_width = allocation->x2 - allocation->x1;
painting_area_height = cogl_texture_get_height (self->background_texture); painting_area_height = allocation->y2 - allocation->y1;
/* scale if requested */ /* scale if requested */
get_background_scale (self, get_background_scale (self,
@ -1445,35 +1445,7 @@ st_theme_node_render_resources (StThemeNode *node,
background_image_shadow_spec = st_theme_node_get_background_image_shadow (node); background_image_shadow_spec = st_theme_node_get_background_image_shadow (node);
if (background_image != NULL && !has_border && !has_border_radius) if (background_image != NULL && !has_border && !has_border_radius)
{ {
CoglHandle texture; node->background_texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
/* If no background position is specified, then we will automatically scale
* the background to fit within the node allocation. But, if a background
* position is specified, we won't scale the background, and it could
* potentially leak out of bounds. To prevent that, we subtexture from the
* in bounds area when necessary.
*/
if (node->background_position_set &&
(cogl_texture_get_width (texture) > width ||
cogl_texture_get_height (texture) > height))
{
CoglHandle subtexture;
subtexture = cogl_texture_new_from_sub_texture (texture,
0, 0,
width - node->background_position_x,
height - node->background_position_y);
cogl_handle_unref (texture);
node->background_texture = subtexture;
}
else
{
node->background_texture = texture;
}
node->background_material = _st_create_texture_material (node->background_texture); node->background_material = _st_create_texture_material (node->background_texture);
if (background_image_shadow_spec) if (background_image_shadow_spec)

View File

@ -454,8 +454,7 @@ st_theme_node_transition_class_init (StThemeNodeTransitionClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StThemeNodeTransitionClass, completed), G_STRUCT_OFFSET (StThemeNodeTransitionClass, completed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
signals[NEW_FRAME] = signals[NEW_FRAME] =
@ -463,7 +462,6 @@ st_theme_node_transition_class_init (StThemeNodeTransitionClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StThemeNodeTransitionClass, new_frame), G_STRUCT_OFFSET (StThemeNodeTransitionClass, new_frame),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }

View File

@ -35,7 +35,6 @@
#include "st-widget.h" #include "st-widget.h"
#include "st-label.h" #include "st-label.h"
#include "st-marshal.h"
#include "st-private.h" #include "st-private.h"
#include "st-texture-cache.h" #include "st-texture-cache.h"
#include "st-theme-context.h" #include "st-theme-context.h"
@ -995,8 +994,7 @@ st_widget_class_init (StWidgetClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StWidgetClass, style_changed), G_STRUCT_OFFSET (StWidgetClass, style_changed),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/** /**
@ -1011,8 +1009,7 @@ st_widget_class_init (StWidgetClass *klass)
G_TYPE_FROM_CLASS (klass), G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StWidgetClass, popup_menu), G_STRUCT_OFFSET (StWidgetClass, popup_menu),
NULL, NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
} }
@ -2441,7 +2438,7 @@ st_ui_root_destroyed (ClutterActor *actor,
} }
/** /**
* st_get_ui_root: * st_set_ui_root:
* @stage: a #ClutterStage * @stage: a #ClutterStage
* @container: (allow-none): the new UI root * @container: (allow-none): the new UI root
* *

View File

@ -1,3 +0,0 @@
VOID:OBJECT,OBJECT
VOID:OBJECT,STRING,LONG,LONG
VOID:OBJECT,LONG

View File

@ -34,8 +34,6 @@
#endif #endif
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include "na-marshal.h"
/* Signals */ /* Signals */
enum enum
{ {
@ -143,8 +141,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_added), G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_added),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
GTK_TYPE_SOCKET); GTK_TYPE_SOCKET);
@ -153,8 +150,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_removed), G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_removed),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
G_TYPE_NONE, 1, G_TYPE_NONE, 1,
GTK_TYPE_SOCKET); GTK_TYPE_SOCKET);
manager_signals[MESSAGE_SENT] = manager_signals[MESSAGE_SENT] =
@ -162,8 +158,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, message_sent), G_STRUCT_OFFSET (NaTrayManagerClass, message_sent),
NULL, NULL, NULL, NULL, NULL,
_na_marshal_VOID__OBJECT_STRING_LONG_LONG,
G_TYPE_NONE, 4, G_TYPE_NONE, 4,
GTK_TYPE_SOCKET, GTK_TYPE_SOCKET,
G_TYPE_STRING, G_TYPE_STRING,
@ -174,8 +169,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, message_cancelled), G_STRUCT_OFFSET (NaTrayManagerClass, message_cancelled),
NULL, NULL, NULL, NULL, NULL,
_na_marshal_VOID__OBJECT_LONG,
G_TYPE_NONE, 2, G_TYPE_NONE, 2,
GTK_TYPE_SOCKET, GTK_TYPE_SOCKET,
G_TYPE_LONG); G_TYPE_LONG);
@ -184,8 +178,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass), G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST, G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, lost_selection), G_STRUCT_OFFSET (NaTrayManagerClass, lost_selection),
NULL, NULL, NULL, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
#if defined (GDK_WINDOWING_X11) #if defined (GDK_WINDOWING_X11)