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
data/gnome-shell.desktop
data/gnome-shell.desktop.in
data/gnome-shell-extension-prefs.desktop
data/gnome-shell-extension-prefs.desktop.in
data/gschemas.compiled
data/org.gnome.shell.gschema.xml
data/org.gnome.shell.gschema.valid
@ -62,6 +64,7 @@ src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell
src/gnome-shell-calendar-server
src/gnome-shell-extension-tool
src/gnome-shell-extension-prefs
src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild
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
=====
* https://live.gnome.org/EveryDetailMatters

View File

@ -41,7 +41,7 @@
"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_API_VERSION 1
#define PLUGIN_API_VERSION 3
typedef struct {
GDBusProxy *proxy;
@ -262,11 +262,13 @@ NPP_Destroy(NPP instance,
/* =================== scripting interface =================== */
typedef struct {
NPObject parent;
NPP instance;
GDBusProxy *proxy;
NPObject *listener;
gint signal_id;
NPObject parent;
NPP instance;
GDBusProxy *proxy;
NPObject *listener;
NPObject *restart_listener;
gint signal_id;
guint watch_name_id;
} PluginObject;
static void
@ -284,7 +286,7 @@ on_shell_signal (GDBusProxy *proxy,
gint32 status;
gchar *error;
NPVariant args[3];
NPVariant result;
NPVariant result = { NPVariantType_Void };
g_variant_get (parameters, "(sis)", &uuid, &status, &error);
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 *
plugin_object_allocate (NPP instance,
NPClass *klass)
@ -312,6 +333,14 @@ plugin_object_allocate (NPP instance,
obj->signal_id = g_signal_connect (obj->proxy, "g-signal",
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");
return (NPObject*)obj;
@ -328,6 +357,9 @@ plugin_object_deallocate (NPObject *npobj)
if (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_slice_free (PluginObject, obj);
@ -341,7 +373,9 @@ static NPIdentifier enable_extension_id;
static NPIdentifier install_extension_id;
static NPIdentifier uninstall_extension_id;
static NPIdentifier onextension_changed_id;
static NPIdentifier onrestart_id;
static NPIdentifier get_errors_id;
static NPIdentifier launch_extension_prefs_id;
static bool
plugin_object_has_method (NPObject *npobj,
@ -352,7 +386,8 @@ plugin_object_has_method (NPObject *npobj,
name == enable_extension_id ||
name == install_extension_id ||
name == uninstall_extension_id ||
name == get_errors_id);
name == get_errors_id ||
name == launch_extension_prefs_id);
}
static inline gboolean
@ -457,7 +492,10 @@ plugin_enable_extension (PluginObject *obj,
{
gchar *uuid_str = g_strndup (uuid.UTF8Characters, uuid.UTF8Length);
if (!uuid_is_valid (uuid_str))
return FALSE;
{
g_free (uuid_str);
return FALSE;
}
g_dbus_proxy_call (obj->proxy,
(enabled ? "EnableExtension" : "DisableExtension"),
@ -616,6 +654,33 @@ plugin_get_errors (PluginObject *obj,
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
plugin_get_api_version (PluginObject *obj,
NPVariant *result)
@ -726,6 +791,14 @@ plugin_object_invoke (NPObject *npobj,
NPVARIANT_TO_STRING(args[0]),
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;
}
@ -735,6 +808,7 @@ plugin_object_has_property (NPObject *npobj,
NPIdentifier name)
{
return (name == onextension_changed_id ||
name == onrestart_id ||
name == api_version_id ||
name == shell_version_id);
}
@ -761,6 +835,33 @@ plugin_object_get_property (NPObject *npobj,
else
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;
}
@ -772,25 +873,13 @@ plugin_object_set_property (NPObject *npobj,
{
PluginObject *obj;
if (!plugin_object_has_property (npobj, name))
return FALSE;
obj = (PluginObject *)npobj;
if (name == onextension_changed_id)
{
obj = (PluginObject*) npobj;
if (obj->listener)
funcs.releaseobject (obj->listener);
return plugin_object_set_callback (&obj->listener, value);
obj->listener = NULL;
if (NPVARIANT_IS_OBJECT (*value))
{
obj->listener = NPVARIANT_TO_OBJECT (*value);
funcs.retainobject (obj->listener);
return TRUE;
}
else if (NPVARIANT_IS_NULL (*value))
return TRUE;
}
if (name == onrestart_id)
return plugin_object_set_callback (&obj->restart_listener, value);
return FALSE;
}
@ -824,7 +913,9 @@ init_methods_and_properties (void)
install_extension_id = funcs.getstringidentifier ("installExtension");
uninstall_extension_id = funcs.getstringidentifier ("uninstallExtension");
get_errors_id = funcs.getstringidentifier ("getExtensionErrors");
launch_extension_prefs_id = funcs.getstringidentifier ("launchExtensionPrefs");
onrestart_id = funcs.getstringidentifier ("onshellrestart");
onextension_changed_id = funcs.getstringidentifier ("onchange");
}

View File

@ -1,5 +1,5 @@
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_SRCDIR([src/shell-global.c])
@ -53,7 +53,7 @@ if $PKG_CONFIG --exists gstreamer-0.10 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes)
build_recorder=true
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
AC_MSG_RESULT(no)
fi
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.7.5
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.29.18
MUTTER_MIN_VERSION=3.3.3
MUTTER_MIN_VERSION=3.3.5
FOLKS_MIN_VERSION=0.5.2
GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.31.6
@ -117,6 +117,7 @@ AC_CHECK_FUNCS(JS_NewGlobalObject XFixesCreatePointerBarrier)
CFLAGS=$saved_CFLAGS
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(TRAY, gtk+-3.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
case " $CFLAGS " in
*[\ \ ]-Werror[\ \ ]*) ;;
*) CFLAGS="$CFLAGS -Werror" ;;
*) CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations" ;;
esac
fi
fi
@ -206,7 +207,7 @@ fi
changequote([,])dnl
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)
AC_MSG_CHECKING([location of system Certificate Authority list])

View File

@ -1,5 +1,5 @@
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
# file when built in a non-system prefix
@ -69,6 +69,7 @@ shaders_DATA = \
EXTRA_DIST = \
gnome-shell.desktop.in.in \
gnome-shell-extension-prefs.desktop.in.in \
$(menu_DATA) \
$(shaders_DATA) \
$(convert_DATA) \
@ -76,6 +77,7 @@ EXTRA_DIST = \
CLEANFILES = \
gnome-shell.desktop.in \
gnome-shell-extension-prefs.in \
$(desktop_DATA) \
$(gsettings_SCHEMAS) \
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/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="framerate" type="i">
<default>15</default>
<default>30</default>
<_summary>Framerate used for recording screencasts.</_summary>
<_description>
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
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'
'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.
</_description>

View File

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

View File

@ -7,8 +7,10 @@ nobase_dist_js_DATA = \
gdm/fingerprint.js \
gdm/loginDialog.js \
gdm/powerMenu.js \
extensionPrefs/main.js \
misc/config.js \
misc/docInfo.js \
misc/extensionUtils.js \
misc/fileUtils.js \
misc/format.js \
misc/gnomeSession.js \
@ -35,6 +37,7 @@ nobase_dist_js_DATA = \
ui/endSessionDialog.js \
ui/environment.js \
ui/extensionSystem.js \
ui/flashspot.js \
ui/iconGrid.js \
ui/keyboard.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@;
/* The system TLS CA list */
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.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.emit('notify::signal-quality');

View File

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

View File

@ -93,23 +93,30 @@ const Contact = new Lang.Class({
text = _("Busy");
iconName = 'user-busy';
break;
default:
case Folks.PresenceType.OFFLINE:
text = _("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,
style_class: 'contact-details-status' });
box.add(icon, { x_fill: true,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
if (iconName) {
let icon = new St.Icon({ icon_name: iconName,
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,
y_fill: false,

View File

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

View File

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

View File

@ -11,6 +11,7 @@ const Shell = imports.gi.Shell;
const Soup = imports.gi.Soup;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
const FileUtils = imports.misc.fileUtils;
const ModalDialog = imports.ui.modalDialog;
@ -29,11 +30,6 @@ const ExtensionState = {
UNINSTALLED: 99
};
const ExtensionType = {
SYSTEM: 1,
PER_USER: 2
};
const REPOSITORY_URL_BASE = 'https://extensions.gnome.org';
const REPOSITORY_URL_DOWNLOAD = REPOSITORY_URL_BASE + '/download-extension/%s.shell-extension.zip';
const REPOSITORY_URL_INFO = REPOSITORY_URL_BASE + '/extension-info/';
@ -57,19 +53,10 @@ function _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
var enabledExtensions;
// GFile for user extensions
var userExtensionsDir = null;
// Contains the order that extensions were enabled in.
const extensionOrder = [];
// We don't really have a class to add signals on. So, create
// 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 disconnect = Lang.bind(_signals, _signals.disconnect);
// UUID => Array of error messages
var errors = {};
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) {
let params = { uuid: uuid,
version_tag: version_tag,
@ -132,8 +86,8 @@ function installExtensionFromUUID(uuid, version_tag) {
}
function uninstallExtensionFromUUID(uuid) {
let meta = extensionMeta[uuid];
if (!meta)
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return false;
// Try to disable it -- if it's ERROR'd, we can't guarantee that,
@ -142,22 +96,17 @@ function uninstallExtensionFromUUID(uuid) {
disableExtension(uuid);
// Don't try to uninstall system extensions
if (meta.type != ExtensionType.PER_USER)
if (extension.type != ExtensionUtils.ExtensionType.PER_USER)
return false;
meta.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', meta);
delete extensionMeta[uuid];
// Importers are marked as PERMANENT, so we can't do this.
// delete extensions[uuid];
extensions[uuid] = undefined;
extension.state = ExtensionState.UNINSTALLED;
_signals.emit('extension-state-changed', extension);
delete ExtensionUtils.extensions[uuid];
delete extensionStateObjs[uuid];
delete errors[uuid];
FileUtils.recursivelyDeleteDir(Gio.file_new_for_path(meta.path));
FileUtils.recursivelyDeleteDir(Gio.file_new_for_path(extension.path));
return true;
}
@ -178,7 +127,7 @@ function gotExtensionZipFile(session, message, uuid) {
}
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);
stream.close(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);
}
loadExtension(dir, ExtensionType.PER_USER, true);
loadExtension(dir, ExtensionUtils.ExtensionType.PER_USER, true);
});
}
function disableExtension(uuid) {
let meta = extensionMeta[uuid];
if (!meta)
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return;
if (meta.state != ExtensionState.ENABLED)
if (extension.state != ExtensionState.ENABLED)
return;
let extensionState = extensionStateObjs[uuid];
@ -255,41 +204,45 @@ function disableExtension(uuid) {
extensionOrder.splice(orderIdx, 1);
meta.state = ExtensionState.DISABLED;
_signals.emit('extension-state-changed', meta);
extension.state = ExtensionState.DISABLED;
_signals.emit('extension-state-changed', extension);
}
function enableExtension(uuid) {
let meta = extensionMeta[uuid];
if (!meta)
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return;
if (meta.state == ExtensionState.INITIALIZED) {
loadExtension(meta.dir, meta.type, true);
if (extension.state == ExtensionState.INITIALIZED) {
loadExtension(extension.dir, extension.type, true);
return;
}
if (meta.state != ExtensionState.DISABLED)
if (extension.state != ExtensionState.DISABLED)
return;
let extensionState = extensionStateObjs[uuid];
extensionOrder.push(uuid);
try {
extensionState.enable();
extension.stateObj.enable();
} catch(e) {
logExtensionError(uuid, e.toString());
return;
}
meta.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', meta);
extension.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', extension);
}
function logExtensionError(uuid, message, state) {
if (!errors[uuid]) errors[uuid] = [];
errors[uuid].push(message);
let extension = ExtensionUtils.extensions[uuid];
if (!extension)
return;
if (!extension.errors)
extension.errors = [];
extension.errors.push(message);
global.logError('Extension "%s" had error: %s'.format(uuid, message));
state = state || ExtensionState.ERROR;
_signals.emit('extension-state-changed', { uuid: uuid,
@ -298,72 +251,31 @@ function logExtensionError(uuid, message, state) {
}
function loadExtension(dir, type, enabled) {
let info;
let uuid = dir.get_basename();
let extension;
let metadataFile = dir.get_child('metadata.json');
if (!metadataFile.query_exists(null)) {
logExtensionError(uuid, 'Missing metadata.json');
return;
if (ExtensionUtils.extensions[uuid] != undefined) {
throw new Error('extension already loaded');
}
let metadataContents;
try {
metadataContents = Shell.get_file_contents_utf8_sync(metadataFile.get_path());
} catch (e) {
logExtensionError(uuid, 'Failed to load metadata.json: ' + e);
extension = ExtensionUtils.createExtensionObject(uuid, dir, type);
} catch(e) {
logExtensionError(uuid, e.message);
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
meta.state = ExtensionState.ERROR;
extension.state = ExtensionState.ERROR;
if (!versionCheck(meta['shell-version'], Config.PACKAGE_VERSION) ||
(meta['js-version'] && !versionCheck(meta['js-version'], Config.GJS_VERSION))) {
if (ExtensionUtils.isOutOfDate(extension)) {
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;
}
if (!enabled) {
meta.state = ExtensionState.INITIALIZED;
extension.state = ExtensionState.INITIALIZED;
return;
}
@ -388,12 +300,12 @@ function loadExtension(dir, type, enabled) {
let extensionModule;
let extensionState = null;
try {
global.add_extension_importer('imports.ui.extensionSystem.extensions', meta.uuid, dir.get_path());
extensionModule = extensions[meta.uuid].extension;
ExtensionUtils.installImporter(extension);
extensionModule = extension.imports.extension;
} catch (e) {
if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath);
logExtensionError(uuid, e);
logExtensionError(uuid, '' + e);
return;
}
@ -403,7 +315,7 @@ function loadExtension(dir, type, enabled) {
}
try {
extensionState = extensionModule.init(meta);
extensionState = extensionModule.init(extension);
} catch (e) {
if (stylesheetPath != null)
theme.unload_stylesheet(stylesheetPath);
@ -413,7 +325,7 @@ function loadExtension(dir, type, enabled) {
if (!extensionState)
extensionState = extensionModule;
extensionStateObjs[uuid] = extensionState;
extension.stateObj = extensionState;
if (!extensionState.enable) {
logExtensionError(uuid, 'missing \'enable\' function');
@ -424,13 +336,13 @@ function loadExtension(dir, type, enabled) {
return;
}
meta.state = ExtensionState.DISABLED;
extension.state = ExtensionState.DISABLED;
enableExtension(uuid);
_signals.emit('extension-loaded', meta.uuid);
_signals.emit('extension-state-changed', meta);
global.log('Loaded extension ' + meta.uuid);
_signals.emit('extension-loaded', uuid);
_signals.emit('extension-state-changed', extension);
global.log('Loaded extension ' + uuid);
}
function onEnabledExtensionsChanged() {
@ -456,50 +368,17 @@ function onEnabledExtensionsChanged() {
}
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);
}
ExtensionUtils.init();
global.settings.connect('changed::' + ENABLED_EXTENSIONS_KEY, onEnabledExtensionsChanged);
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() {
let systemDataDirs = GLib.get_system_data_dirs();
for (let i = 0; i < systemDataDirs.length; i++) {
let dirPath = systemDataDirs[i] + '/gnome-shell/extensions';
let dir = Gio.file_new_for_path(dirPath);
if (dir.query_exists(null))
_loadExtensionsIn(dir, ExtensionType.SYSTEM);
}
_loadExtensionsIn(userExtensionsDir, ExtensionType.PER_USER);
ExtensionUtils.scanExtensions(function(uuid, dir, type) {
let enabled = enabledExtensions.indexOf(uuid) != -1;
loadExtension(dir, type, enabled);
});
}
const InstallExtensionDialog = new Lang.Class({
@ -545,13 +424,13 @@ const InstallExtensionDialog = new Lang.Class({
},
_onInstallButtonPressed: function(button, event) {
let meta = { uuid: this._uuid,
state: ExtensionState.DOWNLOADING,
error: '' };
let extension = { uuid: this._uuid,
state: ExtensionState.DOWNLOADING,
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,
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() {
let themeNode = this.actor.get_theme_node();
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();
},

View File

@ -15,6 +15,7 @@ const Mainloop = imports.mainloop;
const History = imports.misc.history;
const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionUtils = imports.misc.extensionUtils;
const Link = imports.ui.link;
const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener;
@ -728,7 +729,7 @@ const Extensions = new Lang.Class({
this._extensionsList.add(this._noExtensions);
this.actor.add(this._extensionsList);
for (let uuid in ExtensionSystem.extensionMeta)
for (let uuid in ExtensionUtils.extensions)
this._loadExtension(null, uuid);
ExtensionSystem.connect('extension-loaded',
@ -736,10 +737,10 @@ const Extensions = new Lang.Class({
},
_loadExtension: function(o, uuid) {
let extension = ExtensionSystem.extensionMeta[uuid];
let extension = ExtensionUtils.extensions[uuid];
// There can be cases where we create dummy extension metadata
// that's not really a proper extension. Don't bother with these.
if (!extension.name)
if (!extension.metadata.name)
return;
let extensionDisplay = this._createExtensionDisplay(extension);
@ -751,25 +752,24 @@ const Extensions = new Lang.Class({
},
_onViewSource: function (actor) {
let meta = actor._extensionMeta;
let file = Gio.file_new_for_path(meta.path);
let uri = file.get_uri();
let extension = actor._extension;
let uri = extension.dir.get_uri();
Gio.app_info_launch_default_for_uri(uri, global.create_app_launch_context());
Main.lookingGlass.close();
},
_onWebPage: function (actor) {
let meta = actor._extensionMeta;
Gio.app_info_launch_default_for_uri(meta.url, global.create_app_launch_context());
let extension = actor._extension;
Gio.app_info_launch_default_for_uri(extension.metadata.url, global.create_app_launch_context());
Main.lookingGlass.close();
},
_onViewErrors: function (actor) {
let meta = actor._extensionMeta;
let extension = actor._extension;
let shouldShow = !actor._isShowing;
if (shouldShow) {
let errors = ExtensionSystem.errors[meta.uuid];
let errors = extension.errors;
let errorDisplay = new St.BoxLayout({ vertical: true });
if (errors && errors.length) {
for (let i = 0; i < errors.length; i ++)
@ -809,36 +809,36 @@ const Extensions = new Lang.Class({
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 name = new St.Label({ style_class: 'lg-extension-name',
text: meta.name });
text: extension.metadata.name });
box.add(name, { expand: true });
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 });
let metaBox = new St.BoxLayout({ style_class: 'lg-extension-meta' });
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',
text: this._stateToString(meta.state) });
text: this._stateToString(extension.state) });
metaBox.add(state);
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));
metaBox.add(viewsource.actor);
if (meta.url) {
if (extension.metadata.url) {
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));
metaBox.add(webpage.actor);
}
let viewerrors = new Link.Link({ label: _("Show Errors") });
viewerrors.actor._extensionMeta = meta;
viewerrors.actor._extension = extension;
viewerrors.actor._parentBox = box;
viewerrors.actor._isShowing = false;
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._magView = null;
this._background = null;
this._uiGroupClone = null;
this._mouseSourceActor = mouseSourceActor;
this._mouseActor = null;
@ -565,12 +566,15 @@ const ZoomRegion = new Lang.Class({
this._viewPortX = 0;
this._viewPortY = 0;
this._viewPortWidth = global.screen_width;
this._viewPortWidth = global.screen_height;
this._viewPortHeight = global.screen_height;
this._xCenter = this._viewPortWidth / 2;
this._yCenter = this._viewPortHeight / 2;
this._xMagFactor = 1;
this._yMagFactor = 1;
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
// out of view (don't want to see desktop showing through).
let background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
mainGroup.add_actor(background);
this._background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
mainGroup.add_actor(this._background);
// Clone the group that contains all of UI on the screen. This is the
// chrome, the windows, etc.
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
mainGroup.add_actor(this._uiGroupClone);
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
// it.
@ -923,6 +927,7 @@ const ZoomRegion = new Lang.Class({
this._magView.destroy();
this._magView = null;
this._background = null;
this._uiGroupClone = null;
this._mouseActor = null;
this._crossHairsActor = null;
@ -1145,6 +1150,22 @@ const ZoomRegion = new Lang.Class({
this._crossHairsActor.set_position(xMagMouse - groupWidth / 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._clones = [];
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)
this._showSummaryBoxPointer();
} else if (this._summaryBoxPointerState == State.SHOWN) {
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary)
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer || mustHideSummary) {
this._hideSummaryBoxPointer();
if (wrongSummaryBoxPointer)
this._showSummaryBoxPointer();
}
}
// Tray itself
@ -2390,9 +2393,8 @@ const MessageTray = new Lang.Class({
}
this._summaryBoxPointerState = State.HIDING;
// Unset this._clickedSummaryItem if we are no longer showing the summary or if
// this._clickedSummaryItem is still the item associated with the currently showing box pointer
if (this._summaryState != State.SHOWN || this._summaryBoxPointerItem == this._clickedSummaryItem)
// Unset this._clickedSummaryItem if we are no longer showing the summary
if (this._summaryState != State.SHOWN)
this._unsetClickedSummaryItem();
this._focusGrabber.ungrabFocus();

View File

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

View File

@ -96,7 +96,7 @@ const Button = new Lang.Class({
Name: 'PanelMenuButton',
Extends: ButtonBox,
_init: function(menuAlignment, dontCreateMenu) {
_init: function(menuAlignment, nameText, dontCreateMenu) {
this.parent({ reactive: true,
can_focus: true,
track_hover: true });
@ -108,6 +108,24 @@ const Button = new Lang.Class({
this.menu = null;
else
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) {
@ -203,8 +221,8 @@ const SystemStatusButton = new Lang.Class({
Name: 'SystemStatusButton',
Extends: Button,
_init: function(iconName,tooltipText) {
this.parent(0.0);
_init: function(iconName, tooltipText, nameText) {
this.parent(0.0, nameText);
this._iconActor = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,

View File

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

View File

@ -389,6 +389,7 @@ const PopupMenuItem = new Lang.Class({
this.label = new St.Label({ text: text });
this.addActor(this.label);
this.actor.label_actor = this.label
}
});
@ -773,6 +774,12 @@ const PopupSwitchMenuItem = new Lang.Class({
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);
},
@ -869,6 +876,10 @@ const PopupMenuBase = new Lang.Class({
return menuItem;
},
isEmpty: function() {
return this.box.get_children().length == 0;
},
isChildMenu: function(menu) {
return this._childMenus.indexOf(menu) != -1;
},
@ -1194,6 +1205,9 @@ const PopupMenu = new Lang.Class({
if (this.isOpen)
return;
if (this.isEmpty())
return;
this.isOpen = true;
this._boxPointer.setPosition(this.sourceActor, this._arrowAlignment);
@ -1285,6 +1299,9 @@ const PopupSubMenu = new Lang.Class({
if (this.isOpen)
return;
if (this.isEmpty())
return;
this.isOpen = true;
this.actor.show();
@ -1428,6 +1445,7 @@ const PopupSubMenuMenuItem = new Lang.Class({
this.label = new St.Label({ text: text });
this.addActor(this.label);
this.actor.label_actor = this.label;
this._triangle = new St.Label({ text: '\u25B8' });
this.addActor(this._triangle, { align: St.Align.END });
@ -1528,6 +1546,9 @@ const PopupComboMenu = new Lang.Class({
if (this.isOpen)
return;
if (this.isEmpty())
return;
this.isOpen = true;
let [sourceX, sourceY] = this.sourceActor.get_transformed_position();

View File

@ -3,9 +3,12 @@
const Lang = imports.lang;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const Config = imports.misc.config;
const ExtensionSystem = imports.ui.extensionSystem;
const ExtensionUtils = imports.misc.extensionUtils;
const Flashspot = imports.ui.flashspot;
const Main = imports.ui.main;
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="width"/>
<arg type="i" direction="in" name="height"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="ScreenshotWindow">
<arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="Screenshot">
<arg type="b" direction="in" name="flash"/>
<arg type="s" direction="in" name="filename"/>
<arg type="b" direction="out" name="success"/>
</method>
@ -56,6 +62,9 @@ const GnomeShellIface = <interface name="org.gnome.Shell">
<arg type="s" direction="in" name="uuid"/>
<arg type="b" direction="out" name="success"/>
</method>
<method name="LaunchExtensionPrefs">
<arg type="s" direction="in" name="uuid"/>
</method>
<property name="OverviewActive" type="b" access="readwrite" />
<property name="ApiVersion" type="i" access="read" />
<property name="ShellVersion" type="s" access="read" />
@ -109,6 +118,16 @@ const GnomeShell = new Lang.Class({
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:
* @x: The X coordinate of the area
@ -123,12 +142,10 @@ const GnomeShell = new Lang.Class({
*
*/
ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, filename, callback] = params;
global.screenshot_area (x, y, width, height, filename,
function (obj, result) {
let retval = GLib.Variant.new('(b)', [result]);
invocation.return_value(retval);
});
let [x, y, width, height, flash, filename, callback] = params;
global.screenshot_area (x, y, width, height, filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
/**
@ -141,8 +158,11 @@ const GnomeShell = new Lang.Class({
* indicating whether the operation was successful or not.
*
*/
ScreenshotWindow : function (include_frame, filename) {
return global.screenshot_window (include_frame, filename);
ScreenshotWindowAsync : function (params, invocation) {
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) {
let [filename] = params;
global.screenshot(filename,
function (obj, result) {
let retval = GLib.Variant.new('(b)', [result]);
invocation.return_value(retval);
});
let [flash, filename] = params;
global.screenshot(filename,
Lang.bind(this, this._onScreenshotComplete,
flash, invocation));
},
ListExtensions: function() {
let out = {};
for (let uuid in ExtensionSystem.extensionMeta) {
for (let uuid in ExtensionUtils.extensions) {
let dbusObj = this.GetExtensionInfo(uuid);
out[uuid] = dbusObj;
}
@ -173,10 +191,23 @@ const GnomeShell = new Lang.Class({
},
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 = {};
for (let key in meta) {
let val = meta[key];
for (let key in obj) {
let val = obj[key];
let type;
switch (typeof val) {
case 'string':
@ -185,16 +216,27 @@ const GnomeShell = new Lang.Class({
case 'number':
type = 'd';
break;
case 'boolean':
type = 'b';
break;
default:
continue;
}
out[key] = GLib.Variant.new(type, val);
}
return out;
},
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) {
@ -219,6 +261,13 @@ const GnomeShell = new Lang.Class({
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() {
return Main.overview.visible;
},

View File

@ -211,6 +211,8 @@ const ShellMountQuestionDialog = new Lang.Class({
{ y_align: St.Align.START });
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,
{ y_fill: false,

View File

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

View File

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

View File

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

View File

@ -46,7 +46,6 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
<method name="GetPrimaryDevice">
<arg type="(susdut)" direction="out" />
</method>
<signal name="Changed" />
<property name="Icon" type="s" access="read" />
</interface>;
@ -57,7 +56,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_init: function() {
this.parent('battery-missing', null);
this.parent('battery-missing', null, _("Battery"));
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.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();
},

View File

@ -22,7 +22,7 @@ const Indicator = new Lang.Class({
Extends: PanelMenu.SystemStatusButton,
_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.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. */
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.addButton('reject', _("Reject"));
@ -1123,8 +1123,7 @@ const FileTransferNotification = new Lang.Class({
Extends: MessageTray.Notification,
_init: function(source, dispatchOp, channel, contact) {
this.parent(this,
source,
this.parent(source,
/* To translators: The first parameter is
* the contact's alias and the second one is the
* file name. The string will be something
@ -1197,7 +1196,7 @@ const SubscriptionRequestNotification = new Lang.Class({
Extends: MessageTray.Notification,
_init: function(source, contact) {
this.parent(this, source,
this.parent(source,
/* To translators: The parameter is the contact's alias */
_("%s would like permission to see when you are online").format(contact.get_alias()),
null, { customContent: true });

View File

@ -376,7 +376,8 @@ const IMStatusChooserItem = new Lang.Class({
if (sessionStatus == GnomeSession.PresenceStatus.IDLE) {
// Only change presence if the current one is "more present" than
// idle
if (this._currentPresence != Tp.ConnectionPresenceType.OFFLINE)
if (this._currentPresence != Tp.ConnectionPresenceType.OFFLINE &&
this._currentPresence != Tp.ConnectionPresenceType.HIDDEN)
return Tp.ConnectionPresenceType.EXTENDED_AWAY;
}
@ -466,6 +467,7 @@ const UserMenuButton = new Lang.Class({
}));
this._name = new St.Label();
this.actor.label_actor = this._name;
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._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUserName));
@ -611,7 +613,7 @@ const UserMenuButton = new Lang.Class({
this._statusChooser = item;
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._notificationsSwitch = item;

View File

@ -370,6 +370,7 @@ const WindowClone = new Lang.Class({
if (this._selected)
return;
let [x, y] = action.get_coords();
action.release();
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 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 ++) {
let targetBase = firstThumbY + (thumbHeight + spacing) * i;

View File

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

View File

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

View File

@ -1,2 +1,2 @@
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.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 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 ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2011-12-26 13:34+0000\n"
"PO-Revision-Date: 2011-12-31 18:57+0100\n"
"POT-Creation-Date: 2012-01-31 15:48+0000\n"
"PO-Revision-Date: 2012-01-31 17:14+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\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
#, 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 "
@ -95,21 +107,21 @@ msgid ""
"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."
"'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 ""
"Establece la tubería GStreamer usada para codificar grabaciones. Sigue la "
"sintaxis usada para gst-launch. La tubería debería tener un sumidero "
"(«sink») de ensamblaje/sesensamblaje donde el vídeo que se está grabando se "
"graba. Generalmente tendrá un origen de ensamblado/desensamblado; la salida "
"de ese punto se escibirá en el archivo de salida. No obstante la tubería "
"también puede tomar parte en su propia salida; esto se puede usar para "
"enviar la salida a un servidor «icecast» a través de shout2send o similar. "
"Cuando no está establecido o lo está a un valor vacío, se usará la tubería "
"predeterminada. Actualmente es «videorate ! vp8enc quality=10 speed=2 "
"threads=%T ! queue ! webmmux» y greba en WEBM usando el códec VP8. Se usa %T "
"como suposición para el número de hilos óptimos en el sistema."
"sintaxis usada para gst-launch. La tubería debería tener un sumidero («sink») "
"desconectado donde grabar el vídeo que se está grabando. Generalmente tendrá "
"un punto de origen desconectado; la salida de ese punto se escribirá en el "
"archivo de salida. Sin embargo, la tubería también puede tomar parte en su "
"propia salida; esto se puede usar para enviar la salida a un servidor "
"«icecast» a través de shout2send o similar. Cuando no está establecido o lo "
"está a un valor vacío, se usará la tubería predeterminada. Actualmente es "
"«'vp8enc quality=8 speed=6 threads=%T ! queue ! webmmux» y graba en WEBM "
"usando el códec VP8. Se usa %T como marcador de posición para el número de "
"hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
@ -186,45 +198,45 @@ msgstr "Qué teclado usar"
msgid "disabled OpenSearch providers"
msgstr "proveedores OpenSearch desactivados"
#: ../js/gdm/loginDialog.js:623
#: ../js/gdm/loginDialog.js:624
msgid "Session..."
msgstr "Sesión…"
#: ../js/gdm/loginDialog.js:785
#: ../js/gdm/loginDialog.js:786
msgctxt "title"
msgid "Sign In"
msgstr "Iniciar sesión"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)"
msgstr "(o pase el dedo)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:851
#: ../js/gdm/loginDialog.js:852
msgid "Not listed?"
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/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:1024
#: ../js/gdm/loginDialog.js:1025
msgctxt "button"
msgid "Sign In"
msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:1376
#: ../js/gdm/loginDialog.js:1377
msgid "Login Window"
msgstr "Ventana de inicio de sesión"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:581
#: ../js/ui/userMenu.js:583 ../js/ui/userMenu.js:652
msgid "Suspend"
msgstr "Suspender"
@ -445,8 +457,8 @@ msgstr "Esta semana"
msgid "Next week"
msgstr "La semana que viene"
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:466
#: ../js/ui/status/power.js:215 ../src/shell-app.c:394
#: ../js/ui/contactDisplay.js:63 ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215 ../src/shell-app.c:372
msgid "Unknown"
msgstr "Desconocido"
@ -466,7 +478,7 @@ msgstr "Ocupado"
msgid "Offline"
msgstr "Desconectado"
#: ../js/ui/contactDisplay.js:141
#: ../js/ui/contactDisplay.js:148
msgid "CONTACTS"
msgstr "CONTACTOS"
@ -474,58 +486,58 @@ msgstr "CONTACTOS"
msgid "Remove"
msgstr "Quitar"
#: ../js/ui/dateMenu.js:96
#: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:122
#: ../js/ui/dateMenu.js:123
msgid "Open Calendar"
msgstr "Abrir calendario"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S"
#: ../js/ui/dateMenu.js:181
#: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:185
#: ../js/ui/dateMenu.js:186
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:186
#: ../js/ui/dateMenu.js:187
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:193
#: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %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"
msgstr "%a %e de %b, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:198
#: ../js/ui/dateMenu.js:199
msgid "%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"
msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:210
#: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
@ -701,7 +713,7 @@ msgstr "Dar voz"
msgid "Mute"
msgstr "Silenciar"
#: ../js/ui/messageTray.js:2444
#: ../js/ui/messageTray.js:2446
msgid "System Information"
msgstr "Información del sistema"
@ -747,8 +759,8 @@ msgstr "La red inalámbrica requiere autenticación"
#: ../js/ui/networkAgent.js:322
#, c-format
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"'%s'."
"Passwords or encryption keys are required to access the wireless network '%"
"s'."
msgstr ""
"Se necesitan contraseñas o claves de cifrado para acceder a la red "
"inalámbrica «%s»."
@ -804,17 +816,17 @@ msgstr "Aplicaciones"
msgid "Dash"
msgstr "Tablero"
#: ../js/ui/panel.js:564
#: ../js/ui/panel.js:572
msgid "Quit"
msgstr "Salir"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:603
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:982
#: ../js/ui/panel.js:990
msgid "Top Bar"
msgstr "Barra superior"
@ -831,7 +843,7 @@ msgstr "Reintentar"
msgid "Connect to..."
msgstr "Conectar a…"
#: ../js/ui/placeDisplay.js:364
#: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS"
@ -864,7 +876,7 @@ msgstr "Contraseña:"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:719
#: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -900,6 +912,10 @@ msgstr "Ocultar texto"
msgid "Wrong password, please try again"
msgstr "Contraseña incorrecta; inténtelo de nuevo"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Accesibilidad"
#: ../js/ui/status/accessibility.js:52
msgid "Zoom"
msgstr "Ampliación"
@ -943,10 +959,10 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:35 ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -967,7 +983,7 @@ msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth"
#. 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"
msgstr "hardware desactivado"
@ -975,11 +991,11 @@ msgstr "hardware desactivado"
msgid "Connection"
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..."
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..."
msgstr "conectando…"
@ -1030,7 +1046,7 @@ msgstr "Conceder acceso siempre"
msgid "Grant this time only"
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"
msgstr "Rechazar"
@ -1083,119 +1099,127 @@ msgid "<unknown>"
msgstr "<desconocido>"
#. 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"
msgstr "desactivada"
#. 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)
#: ../js/ui/status/network.js:488
#: ../js/ui/status/network.js:489
msgid "unmanaged"
msgstr "no gestionada"
#. 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"
msgstr "se necesita autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:509
#: ../js/ui/status/network.js:510
msgid "firmware missing"
msgstr "falta el «firmware»"
#. 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"
msgstr "cable desconectado"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521
#: ../js/ui/status/network.js:522
msgid "unavailable"
msgstr "no disponible"
#: ../js/ui/status/network.js:523
#: ../js/ui/status/network.js:524
msgid "connection failed"
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..."
msgstr "Más…"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. 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)"
msgstr "Conectada (privada)"
#: ../js/ui/status/network.js:695
#: ../js/ui/status/network.js:696
msgid "Auto Ethernet"
msgstr "Ethernet automática"
#: ../js/ui/status/network.js:756
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Banda ancha automática"
#: ../js/ui/status/network.js:759
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Marcado automático"
#. 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
msgid "Auto %s"
msgstr "%s automática"
#: ../js/ui/status/network.js:880
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Bluetooth automático"
#: ../js/ui/status/network.js:1453
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
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"
msgstr "Activar red"
#: ../js/ui/status/network.js:1559
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Cableada"
#: ../js/ui/status/network.js:1570
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Inalámbrica"
#: ../js/ui/status/network.js:1580
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Banda ancha móvil"
#: ../js/ui/status/network.js:1590
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "Conexiones VPN"
#: ../js/ui/status/network.js:1601
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/network.js:1738
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1739
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
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"
msgstr "La red está desactivada"
#: ../js/ui/status/network.js:2113
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
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"
msgstr "Configuración de energía"
@ -1283,7 +1307,7 @@ msgstr "Tableta"
msgid "Computer"
msgstr "Equipo"
#: ../js/ui/status/volume.js:38
#: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:38
msgid "Volume"
msgstr "Volumen"
@ -1291,47 +1315,46 @@ msgstr "Volumen"
msgid "Microphone"
msgstr "Micrófono"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267
#: ../js/ui/telepathyClient.js:225
msgid "Invitation"
msgstr "Invitación"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:335
#: ../js/ui/telepathyClient.js:278
msgid "Call"
msgstr "Llamar"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:365
#: ../js/ui/telepathyClient.js:294
msgid "File Transfer"
msgstr "Transferencia de archivos"
#: ../js/ui/telepathyClient.js:446
#: ../js/ui/telepathyClient.js:376
msgid "Subscription request"
msgstr "Solicitud de suscripción"
#: ../js/ui/telepathyClient.js:482
#: ../js/ui/telepathyClient.js:412
msgid "Connection error"
msgstr "Error de conexión"
#: ../js/ui/telepathyClient.js:740
#: ../js/ui/telepathyClient.js:670
#, c-format
msgid "%s is online."
msgstr "%s está conectado/a."
#: ../js/ui/telepathyClient.js:745
#: ../js/ui/telepathyClient.js:674
#, c-format
msgid "%s is offline."
msgstr "%s está desconectado/a."
#: ../js/ui/telepathyClient.js:748
#: ../js/ui/telepathyClient.js:678
#, c-format
msgid "%s is away."
msgstr "%s está ausente."
#: ../js/ui/telepathyClient.js:751
#: ../js/ui/telepathyClient.js:681
#, c-format
msgid "%s is busy."
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.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:964
#: ../js/ui/telepathyClient.js:894
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</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",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970
#: ../js/ui/telepathyClient.js:900
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</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",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975
#: ../js/ui/telepathyClient.js:905
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %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
#. IM name.
#: ../js/ui/telepathyClient.js:1017
#: ../js/ui/telepathyClient.js:947
#, c-format
msgid "%s is now known as %s"
msgstr "Ahora %s se llama %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119
#: ../js/ui/telepathyClient.js:1049
#, c-format
msgid "Invitation to %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
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1127
#: ../js/ui/telepathyClient.js:1057
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s le está invitando a unirse a %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1236
msgid "Decline"
msgstr "Rechazar"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
msgid "Accept"
msgstr "Aceptar"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160
#: ../js/ui/telepathyClient.js:1090
#, c-format
msgid "Video call from %s"
msgstr "Videollamada de %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163
#: ../js/ui/telepathyClient.js:1093
#, c-format
msgid "Call from %s"
msgstr "Llamada de %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170
#: ../js/ui/telepathyClient.js:1100
msgid "Answer"
msgstr "Responder"
@ -1412,112 +1435,112 @@ msgstr "Responder"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1203
#: ../js/ui/telepathyClient.js:1132
#, c-format
msgid "%s is sending you %s"
msgstr "%s le está enviando %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1201
#, c-format
msgid "%s would like permission to see when you are online"
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"
msgstr "Error de la red"
#: ../js/ui/telepathyClient.js:1367
#: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed"
msgstr "Falló la autenticación"
#: ../js/ui/telepathyClient.js:1369
#: ../js/ui/telepathyClient.js:1298
msgid "Encryption error"
msgstr "Error de cifrado"
#: ../js/ui/telepathyClient.js:1371
#: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided"
msgstr "Certificado no proporcionado"
#: ../js/ui/telepathyClient.js:1373
#: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted"
msgstr "No se confía en el certificado"
#: ../js/ui/telepathyClient.js:1375
#: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired"
msgstr "Certificado caducado"
#: ../js/ui/telepathyClient.js:1377
#: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated"
msgstr "Certificado no activado"
#: ../js/ui/telepathyClient.js:1379
#: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch"
msgstr "El nombre del servidor dle certificado no coincide"
#: ../js/ui/telepathyClient.js:1381
#: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch"
msgstr "La huella del certificado no coincide"
#: ../js/ui/telepathyClient.js:1383
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed"
msgstr "Certificado autofirmado"
#: ../js/ui/telepathyClient.js:1385
#: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline"
msgstr "El estado está establecido a «desconectado»"
#: ../js/ui/telepathyClient.js:1387
#: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available"
msgstr "El cifrado no está disponible"
#: ../js/ui/telepathyClient.js:1389
#: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid"
msgstr "El certificado no es válido"
#: ../js/ui/telepathyClient.js:1391
#: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused"
msgstr "Se ha rechazado la conexión"
#: ../js/ui/telepathyClient.js:1393
#: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established"
msgstr "No se puede establecer la conexión"
#: ../js/ui/telepathyClient.js:1395
#: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost"
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"
msgstr "Este recurso ya está conectado al servidor"
#: ../js/ui/telepathyClient.js:1399
#: ../js/ui/telepathyClient.js:1328
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr ""
"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"
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"
msgstr ""
"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"
msgstr "Se ha revocado el certificado"
#: ../js/ui/telepathyClient.js:1407
#: ../js/ui/telepathyClient.js:1336
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"El certificado usa un algoritmo de cifrado inseguro o es criptográficamente "
"débil"
#: ../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"
@ -1528,20 +1551,20 @@ msgstr ""
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419
#: ../js/ui/telepathyClient.js:1348
#, c-format
msgid "Connection to %s failed"
msgstr "Falló la conexión a %s"
#: ../js/ui/telepathyClient.js:1428
#: ../js/ui/telepathyClient.js:1357
msgid "Reconnect"
msgstr "Reconectar"
#: ../js/ui/telepathyClient.js:1429
#: ../js/ui/telepathyClient.js:1358
msgid "Edit account"
msgstr "Editar cuenta"
#: ../js/ui/telepathyClient.js:1475
#: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason"
msgstr "Razón desconocida"
@ -1557,39 +1580,39 @@ msgstr "Inactivo"
msgid "Unavailable"
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..."
msgstr "Apagar…"
#: ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:615
msgid "Notifications"
msgstr "Notificaciones"
#: ../js/ui/userMenu.js:620
#: ../js/ui/userMenu.js:623
msgid "Online Accounts"
msgstr "Cuentas en línea"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:627
msgid "System Settings"
msgstr "Configuración del sistema"
#: ../js/ui/userMenu.js:631
#: ../js/ui/userMenu.js:634
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#: ../js/ui/userMenu.js:636
#: ../js/ui/userMenu.js:639
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:641
#: ../js/ui/userMenu.js:644
msgid "Log Out..."
msgstr "Cerrar la sesión…"
#: ../js/ui/userMenu.js:669
#: ../js/ui/userMenu.js:672
msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:670
#: ../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."
@ -1663,7 +1686,7 @@ msgstr "Imprimir versión"
msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para la pantalla de inicio"
#: ../src/shell-app.c:639
#: ../src/shell-app.c:617
#, c-format
msgid "Failed to launch '%s'"
msgstr "Falló al lanzar «%s»"
@ -1676,7 +1699,7 @@ msgstr "Reino Unido"
msgid "Default"
msgstr "Predeterminada"
#: ../src/shell-polkit-authentication-agent.c:334
#: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user"
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 "
#~ "in time."
#~ msgstr ""
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los "
#~ "segundos en la hora."
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos "
#~ "en la hora."
#~ msgid ""
#~ "This key specifies the format used by the panel clock when the format key "
@ -1992,19 +2015,18 @@ msgstr "%1$s: %2$s"
#~ msgid ""
#~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. "
#~ "1970-01-01. If set to \"custom\", the clock will display time according "
#~ "to the format specified in the custom_format key. Note that if set to "
#~ "either \"unix\" or \"custom\", the show_date and show_seconds keys are "
#~ "ignored."
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "format specified in the custom_format key. Note that if set to either "
#~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ msgstr ""
#~ "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 "
#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el "
#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). "
#~ "Si se establece a «custom» el reloj mostrará la hora según el formato "
#~ "especificado en la clave «custom_format». Note que si se establece a "
#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»."
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 horas), "
#~ "«unix» y «custom» (personalizado).Si se establece a «unix» el reloj mostrará "
#~ "la hora en segundos desde la época (1 de enero de 1970). Si se establece "
#~ "a «custom» el reloj mostrará la hora según el formato especificado en la "
#~ "clave «custom_format». Note que si se establece a «unix» o «custom» se "
#~ "ignoran las claves «show_date» y «show_seconds»."
#~ msgid "Clock Format"
#~ msgstr "Formato del reloj"

335
po/fi.po
View File

@ -21,8 +21,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-10 09:26+0100\n"
"PO-Revision-Date: 2012-01-09 16:54+0200\n"
"POT-Creation-Date: 2012-01-24 15:37+0200\n"
"PO-Revision-Date: 2012-01-22 14:10+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
"Language-Team: Finnish <>\n"
"Language: fi\n"
@ -43,11 +43,6 @@ msgid "Window management and application launching"
msgstr "Ikkunanhallinta ja sovelluksien käynnistäminen"
#: ../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 ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
@ -55,11 +50,20 @@ msgstr ""
"Salli pääsy sisäiseen vianselvitys- ja monitorointityökaluun Alt-F2-ikkunan "
"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
msgid "Uuids of extensions to enable"
msgstr "Käyttöön otettavien laajennosten UUID:t"
msgid "File extension used for storing the screencast"
msgstr "Tiedostopääte ruutunauhoitusten tallentamiseen"
#: ../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 ""
"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 "
@ -71,94 +75,31 @@ msgstr ""
"halutaan ladata, on oltava tässä luettelossa. Tätä luetteloa voi muokata "
"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
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"
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"
msgstr "Historia näyttölasi-ikkunalle"
#: ../data/org.gnome.shell.gschema.xml.in.h:12
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
#: ../data/org.gnome.shell.gschema.xml.in.h:8
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."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Framerate used for recording screencasts."
msgstr "Ruutunauhoitusten kuvataajuus."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true, display seconds in time."
msgstr "Jos tosi, näytä sekunnit ajassa."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
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:10
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:22
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Gstreamer-liukuhihna jolla ruutunauhoitukset pakataan"
#: ../data/org.gnome.shell.gschema.xml.in.h:11
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:24
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format
msgid ""
"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 "
"antavasta säiemäärästä järjestelmässä."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "File extension used for storing the screencast"
msgstr "Tiedostopääte ruutunauhoitusten tallentamiseen"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
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 ""
"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 "
@ -198,45 +153,90 @@ msgstr ""
"nykyisen päivämäärän ja tämän tiedostopäätteen mukaisesti. Tiedostopääte "
"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..."
msgstr "Istunto…"
#: ../js/gdm/loginDialog.js:785
#: ../js/gdm/loginDialog.js:786
msgctxt "title"
msgid "Sign In"
msgstr "Kirjaudu sisään"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)"
msgstr "(tai pyyhkäise sormella)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:851
#: ../js/gdm/loginDialog.js:852
msgid "Not listed?"
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/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Peru"
#: ../js/gdm/loginDialog.js:1024
#: ../js/gdm/loginDialog.js:1025
msgctxt "button"
msgid "Sign In"
msgstr "Kirjaudu sisään"
#: ../js/gdm/loginDialog.js:1376
#: ../js/gdm/loginDialog.js:1377
msgid "Login Window"
msgstr "Kirjautumisikkuna"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:581 ../js/ui/userMenu.js:650
msgid "Suspend"
msgstr "Valmiustila"
@ -460,7 +460,7 @@ msgid "Next week"
msgstr "Ensi viikolla"
#: ../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"
msgstr "Tuntematon"
@ -830,17 +830,17 @@ msgstr "Sovellukset"
msgid "Dash"
msgstr "Pikavalikko"
#: ../js/ui/panel.js:564
#: ../js/ui/panel.js:567
msgid "Quit"
msgstr "Lopeta"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:598
msgid "Activities"
msgstr "Toiminnot"
#: ../js/ui/panel.js:982
#: ../js/ui/panel.js:985
msgid "Top Bar"
msgstr "Yläpalkki"
@ -857,7 +857,7 @@ msgstr "Yritä uudelleen"
msgid "Connect to..."
msgstr "Yhdistä…"
#: ../js/ui/placeDisplay.js:364
#: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES"
msgstr "SIJAINNIT JA LAITTEET"
@ -1056,7 +1056,7 @@ msgstr "Salli pääsy aina"
msgid "Grant this time only"
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"
msgstr "Hylkää"
@ -1213,11 +1213,11 @@ msgstr "Yhteys epäonnistui"
msgid "Activation of network connection failed"
msgstr "Verkkoyhteyden aktivointi epäonnistui"
#: ../js/ui/status/network.js:1989
#: ../js/ui/status/network.js:1992
msgid "Networking is disabled"
msgstr "Verkko ei ole käytössä"
#: ../js/ui/status/network.js:2113
#: ../js/ui/status/network.js:2116
msgid "Network Manager"
msgstr "Verkon hallinta"
@ -1317,47 +1317,46 @@ msgstr "Äänenvoimakkuus"
msgid "Microphone"
msgstr "Mikrofoni"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267
#: ../js/ui/telepathyClient.js:225
msgid "Invitation"
msgstr "Kutsu"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:335
#: ../js/ui/telepathyClient.js:278
msgid "Call"
msgstr "Soita"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:365
#: ../js/ui/telepathyClient.js:294
msgid "File Transfer"
msgstr "Tiedostonsiirto"
#: ../js/ui/telepathyClient.js:446
#: ../js/ui/telepathyClient.js:376
msgid "Subscription request"
msgstr "Tilauspyyntö"
#: ../js/ui/telepathyClient.js:482
#: ../js/ui/telepathyClient.js:412
msgid "Connection error"
msgstr "Yhteysvirhe"
#: ../js/ui/telepathyClient.js:740
#: ../js/ui/telepathyClient.js:670
#, c-format
msgid "%s is online."
msgstr "%s on linjoilla."
#: ../js/ui/telepathyClient.js:745
#: ../js/ui/telepathyClient.js:674
#, c-format
msgid "%s is offline."
msgstr "%s on poissa linjoilta."
#: ../js/ui/telepathyClient.js:748
#: ../js/ui/telepathyClient.js:678
#, c-format
msgid "%s is away."
msgstr "%s on poissa."
#: ../js/ui/telepathyClient.js:751
#: ../js/ui/telepathyClient.js:681
#, c-format
msgid "%s is busy."
msgstr "%s on kiireinen."
@ -1365,35 +1364,35 @@ msgstr "%s on kiireinen."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:964
#: ../js/ui/telepathyClient.js:894
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</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",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970
#: ../js/ui/telepathyClient.js:900
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</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",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975
#: ../js/ui/telepathyClient.js:905
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</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
#. IM name.
#: ../js/ui/telepathyClient.js:1017
#: ../js/ui/telepathyClient.js:947
#, c-format
msgid "%s is now known as %s"
msgstr "%s on nyt nimeltään %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119
#: ../js/ui/telepathyClient.js:1049
#, c-format
msgid "Invitation to %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
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1127
#: ../js/ui/telepathyClient.js:1057
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s kutsuu sinut huoneeseen %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
msgid "Decline"
msgstr "Kieltäydy"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1140
#: ../js/ui/telepathyClient.js:1238
msgid "Accept"
msgstr "Hyväksy"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160
#: ../js/ui/telepathyClient.js:1090
#, c-format
msgid "Video call from %s"
msgstr "Videopuhelu käyttäjältä %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163
#: ../js/ui/telepathyClient.js:1093
#, c-format
msgid "Call from %s"
msgstr "Puhelu käyttäjältä %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170
#: ../js/ui/telepathyClient.js:1100
msgid "Answer"
msgstr "Vastaa"
@ -1438,108 +1437,108 @@ msgstr "Vastaa"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1203
#: ../js/ui/telepathyClient.js:1133
#, c-format
msgid "%s is sending you %s"
msgstr "%s on lähettämässä sinulle tiedostoa %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1202
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s haluaisi saada luvan nähdä, milloin olet linjoilla"
#: ../js/ui/telepathyClient.js:1365
#: ../js/ui/telepathyClient.js:1295
msgid "Network error"
msgstr "Verkkovirhe"
#: ../js/ui/telepathyClient.js:1367
#: ../js/ui/telepathyClient.js:1297
msgid "Authentication failed"
msgstr "Tunnistautuminen epäonnistui"
#: ../js/ui/telepathyClient.js:1369
#: ../js/ui/telepathyClient.js:1299
msgid "Encryption error"
msgstr "Salausvirhe"
#: ../js/ui/telepathyClient.js:1371
#: ../js/ui/telepathyClient.js:1301
msgid "Certificate not provided"
msgstr "Varmennetta ei annettu"
#: ../js/ui/telepathyClient.js:1373
#: ../js/ui/telepathyClient.js:1303
msgid "Certificate untrusted"
msgstr "Varmenteeseen ei luoteta"
#: ../js/ui/telepathyClient.js:1375
#: ../js/ui/telepathyClient.js:1305
msgid "Certificate expired"
msgstr "Varmenne on vanhentunut"
#: ../js/ui/telepathyClient.js:1377
#: ../js/ui/telepathyClient.js:1307
msgid "Certificate not activated"
msgstr "Varmennetta ei ole aktivoitu"
#: ../js/ui/telepathyClient.js:1379
#: ../js/ui/telepathyClient.js:1309
msgid "Certificate hostname mismatch"
msgstr "Varmenteen konenimiristiriita"
#: ../js/ui/telepathyClient.js:1381
#: ../js/ui/telepathyClient.js:1311
msgid "Certificate fingerprint mismatch"
msgstr "Varmenteen sormenjälkiristiriita"
#: ../js/ui/telepathyClient.js:1383
#: ../js/ui/telepathyClient.js:1313
msgid "Certificate self-signed"
msgstr "Varmenne on itseallekirjoitettu"
#: ../js/ui/telepathyClient.js:1385
#: ../js/ui/telepathyClient.js:1315
msgid "Status is set to offline"
msgstr "Tilaksi on asetettu ”poissa linjoilta”"
#: ../js/ui/telepathyClient.js:1387
#: ../js/ui/telepathyClient.js:1317
msgid "Encryption is not available"
msgstr "Salaus ei ole käytettävissä"
#: ../js/ui/telepathyClient.js:1389
#: ../js/ui/telepathyClient.js:1319
msgid "Certificate is invalid"
msgstr "Varmenne ei kelpaa"
#: ../js/ui/telepathyClient.js:1391
#: ../js/ui/telepathyClient.js:1321
msgid "Connection has been refused"
msgstr "Yhteys on evätty"
#: ../js/ui/telepathyClient.js:1393
#: ../js/ui/telepathyClient.js:1323
msgid "Connection can't be established"
msgstr "Yhteyttä ei voida muodostaa"
#: ../js/ui/telepathyClient.js:1395
#: ../js/ui/telepathyClient.js:1325
msgid "Connection has been lost"
msgstr "Yhteys on katkennut"
#: ../js/ui/telepathyClient.js:1397
#: ../js/ui/telepathyClient.js:1327
msgid "This resource is already connected to the server"
msgstr "Tämä resurssi on jo yhteydessä palvelimeen"
#: ../js/ui/telepathyClient.js:1399
#: ../js/ui/telepathyClient.js:1329
msgid ""
"Connection has been replaced by a new connection using the same resource"
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"
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"
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"
msgstr "Varmenne on kumottu"
#: ../js/ui/telepathyClient.js:1407
#: ../js/ui/telepathyClient.js:1337
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "Varmenne käyttää turvatonta salausmenetelmää"
#: ../js/ui/telepathyClient.js:1409
#: ../js/ui/telepathyClient.js:1339
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library"
@ -1548,20 +1547,20 @@ msgstr ""
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419
#: ../js/ui/telepathyClient.js:1349
#, c-format
msgid "Connection to %s failed"
msgstr "Yhteys kohteeseen %s katkesi"
#: ../js/ui/telepathyClient.js:1428
#: ../js/ui/telepathyClient.js:1358
msgid "Reconnect"
msgstr "Yhdistä uudelleen"
#: ../js/ui/telepathyClient.js:1429
#: ../js/ui/telepathyClient.js:1359
msgid "Edit account"
msgstr "Muokkaa tiliä"
#: ../js/ui/telepathyClient.js:1475
#: ../js/ui/telepathyClient.js:1405
msgid "Unknown reason"
msgstr "Tuntematon syy"
@ -1577,39 +1576,39 @@ msgstr "Jouten"
msgid "Unavailable"
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..."
msgstr "Sammuta…"
#: ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:613
msgid "Notifications"
msgstr "Ilmoitukset"
#: ../js/ui/userMenu.js:620
#: ../js/ui/userMenu.js:621
msgid "Online Accounts"
msgstr "Verkkotilit"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:625
msgid "System Settings"
msgstr "Järjestelmän asetukset"
#: ../js/ui/userMenu.js:631
#: ../js/ui/userMenu.js:632
msgid "Lock Screen"
msgstr "Lukitse näyttö"
#: ../js/ui/userMenu.js:636
#: ../js/ui/userMenu.js:637
msgid "Switch User"
msgstr "Vaihda käyttäjää"
#: ../js/ui/userMenu.js:641
#: ../js/ui/userMenu.js:642
msgid "Log Out..."
msgstr "Kirjaudu ulos…"
#: ../js/ui/userMenu.js:669
#: ../js/ui/userMenu.js:670
msgid "Your chat status will be set to busy"
msgstr "Pikaviestitilaksi asetetaan ”kiireinen”"
#: ../js/ui/userMenu.js:670
#: ../js/ui/userMenu.js:671
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."
@ -1642,7 +1641,7 @@ msgstr ""
#: ../js/ui/wanda.js:128
#, c-format
msgid "%s the Oracle says"
msgstr ""
msgstr "%s, sanoo oraakkeli"
#: ../js/ui/wanda.js:168
msgid "Your favorite Easter Egg"
@ -1683,7 +1682,7 @@ msgstr "Tulosta versio"
msgid "Mode used by GDM for login screen"
msgstr "GDM:n kirjautumisruudussa käyttämä tila"
#: ../src/shell-app.c:639
#: ../src/shell-app.c:616
#, c-format
msgid "Failed to launch '%s'"
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 ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-12-30 10:49+0200\n"
"PO-Revision-Date: 2011-12-30 10:50+0200\n"
"POT-Creation-Date: 2012-01-28 11:25+0200\n"
"PO-Revision-Date: 2012-01-28 11:25+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
"Language: he\n"
@ -130,30 +130,30 @@ msgstr "באיזו מקלדת להשתמש"
msgid "disabled OpenSearch providers"
msgstr "disabled OpenSearch providers"
#: ../js/gdm/loginDialog.js:623
#: ../js/gdm/loginDialog.js:624
msgid "Session..."
msgstr "הפעלה..."
#: ../js/gdm/loginDialog.js:785
#: ../js/gdm/loginDialog.js:786
msgctxt "title"
msgid "Sign In"
msgstr "כניסה"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)"
msgstr "(או להעביר אצבע)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:851
#: ../js/gdm/loginDialog.js:852
msgid "Not listed?"
msgstr "לא רשום?"
#: ../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/polkitAuthenticationAgent.js:175
@ -161,19 +161,19 @@ msgstr "לא רשום?"
msgid "Cancel"
msgstr "ביטול"
#: ../js/gdm/loginDialog.js:1024
#: ../js/gdm/loginDialog.js:1025
msgctxt "button"
msgid "Sign In"
msgstr "כניסה"
#: ../js/gdm/loginDialog.js:1376
#: ../js/gdm/loginDialog.js:1377
msgid "Login Window"
msgstr "חלון כניסה"
#: ../js/gdm/powerMenu.js:113
#: ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580
#: ../js/ui/userMenu.js:649
#: ../js/ui/userMenu.js:582
#: ../js/ui/userMenu.js:651
msgid "Suspend"
msgstr "השהיה"
@ -395,9 +395,9 @@ msgid "Next week"
msgstr "בשבוע הבא"
#: ../js/ui/contactDisplay.js:63
#: ../js/ui/notificationDaemon.js:466
#: ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215
#: ../src/shell-app.c:394
#: ../src/shell-app.c:372
msgid "Unknown"
msgstr "לא ידוע"
@ -420,7 +420,7 @@ msgstr "עסוק"
msgid "Offline"
msgstr "מנותק"
#: ../js/ui/contactDisplay.js:141
#: ../js/ui/contactDisplay.js:148
msgid "CONTACTS"
msgstr "אנשי קשר"
@ -429,58 +429,58 @@ msgstr "אנשי קשר"
msgid "Remove"
msgstr "הסרה"
#: ../js/ui/dateMenu.js:96
#: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings"
msgstr "הגדרות תאריך ושעה"
#: ../js/ui/dateMenu.js:122
#: ../js/ui/dateMenu.js:123
msgid "Open Calendar"
msgstr "פתיחת היומן"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:181
msgid "%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"
msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:185
#: ../js/ui/dateMenu.js:186
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:186
#: ../js/ui/dateMenu.js:187
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:193
#: ../js/ui/dateMenu.js:194
msgid "%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"
msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:198
#: ../js/ui/dateMenu.js:199
msgid "%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"
msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:210
#: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y"
msgstr "%A ה־%e ב%B, %Y"
@ -661,7 +661,7 @@ msgstr "ביטול ההשתקה"
msgid "Mute"
msgstr "השתקה"
#: ../js/ui/messageTray.js:2444
#: ../js/ui/messageTray.js:2446
msgid "System Information"
msgstr "פרטי המערכת"
@ -763,17 +763,17 @@ msgstr "יישומים"
msgid "Dash"
msgstr "חלונית"
#: ../js/ui/panel.js:564
#: ../js/ui/panel.js:572
msgid "Quit"
msgstr "יציאה"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:603
msgid "Activities"
msgstr "פעילויות"
#: ../js/ui/panel.js:982
#: ../js/ui/panel.js:990
msgid "Top Bar"
msgstr "הסרגל העליון"
@ -790,7 +790,7 @@ msgstr "ניסיון חוזר"
msgid "Connect to..."
msgstr "התחברות אל..."
#: ../js/ui/placeDisplay.js:364
#: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים"
@ -823,7 +823,7 @@ msgstr "ססמה:"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:719
#: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -859,6 +859,10 @@ msgstr "הסתרת טקסט"
msgid "Wrong password, please try again"
msgstr "ססמה שגויה, נא לנסות שוב"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "נגישות"
#: ../js/ui/status/accessibility.js:52
msgid "Zoom"
msgstr "תקריב"
@ -902,13 +906,14 @@ msgstr "ניגודיות גבוהה"
msgid "Large Text"
msgstr "טקסט גדול"
#: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892
#: ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -930,7 +935,7 @@ msgstr "הגדרות Bluetooth"
#. 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/network.js:256
msgid "hardware disabled"
msgstr "מנוטרל חומרתית"
@ -939,12 +944,12 @@ msgid "Connection"
msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:214
#: ../js/ui/status/network.js:490
#: ../js/ui/status/network.js:491
msgid "disconnecting..."
msgstr "בהליכי ניתוק..."
#: ../js/ui/status/bluetooth.js:227
#: ../js/ui/status/network.js:496
#: ../js/ui/status/network.js:497
msgid "connecting..."
msgstr "בהתחברות..."
@ -997,7 +1002,7 @@ msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:382
#: ../js/ui/telepathyClient.js:1168
#: ../js/ui/telepathyClient.js:1098
msgid "Reject"
msgstr "סירוב"
@ -1051,121 +1056,129 @@ msgid "<unknown>"
msgstr "<לא ידוע>"
#. 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"
msgstr "מנוטרל"
#. 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)
#: ../js/ui/status/network.js:488
#: ../js/ui/status/network.js:489
msgid "unmanaged"
msgstr "לא מנוהל"
#. 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"
msgstr "נדרש אימות"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:509
#: ../js/ui/status/network.js:510
msgid "firmware missing"
msgstr "הקושחה חסרה"
#. 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"
msgstr "הכבל מנותק"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521
#: ../js/ui/status/network.js:522
msgid "unavailable"
msgstr "לא זמין"
#: ../js/ui/status/network.js:523
#: ../js/ui/status/network.js:524
msgid "connection failed"
msgstr "החיבור נכשל"
#: ../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..."
msgstr "עוד..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. 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)"
msgstr "מחובר (פרטי)"
#: ../js/ui/status/network.js:695
#: ../js/ui/status/network.js:696
msgid "Auto Ethernet"
msgstr "אתרנט אוטומטי"
#: ../js/ui/status/network.js:756
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "פס רחב אוטומטי"
#: ../js/ui/status/network.js:759
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "חיוג אוטומטי"
#. 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
msgid "Auto %s"
msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:880
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Bluetooth אוטומטי"
#: ../js/ui/status/network.js:1453
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
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"
msgstr "הפעלת תכונת הרשת"
#: ../js/ui/status/network.js:1559
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "קווי"
#: ../js/ui/status/network.js:1570
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "אלחוטי"
#: ../js/ui/status/network.js:1580
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "פס־רחב נייד"
#: ../js/ui/status/network.js:1590
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "חיבורי VPN"
#: ../js/ui/status/network.js:1601
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "הגדרות הרשת"
#: ../js/ui/status/network.js:1738
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "ההתחברות נכשל"
#: ../js/ui/status/network.js:1739
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "הפעלת חיבור הרשת נכשלה"
#: ../js/ui/status/network.js:1989
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "תכונת הרשת מנוטרלת"
#: ../js/ui/status/network.js:2113
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
msgstr "מנהל הרשתות"
#: ../js/ui/status/power.js:60
msgid "Battery"
msgstr "סוללה"
#: ../js/ui/status/power.js:77
msgid "Power Settings"
msgstr "הגדרות צריכת החשמל"
@ -1259,6 +1272,7 @@ msgstr "טבלת שליטה"
msgid "Computer"
msgstr "מחשב"
#: ../js/ui/status/volume.js:25
#: ../js/ui/status/volume.js:38
msgid "Volume"
msgstr "עצמה"
@ -1267,47 +1281,46 @@ msgstr "עצמה"
msgid "Microphone"
msgstr "מיקרופון"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267
#: ../js/ui/telepathyClient.js:225
msgid "Invitation"
msgstr "הזמנה"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:335
#: ../js/ui/telepathyClient.js:278
msgid "Call"
msgstr "התקשרות"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:365
#: ../js/ui/telepathyClient.js:294
msgid "File Transfer"
msgstr "העברת קבצים"
#: ../js/ui/telepathyClient.js:446
#: ../js/ui/telepathyClient.js:376
msgid "Subscription request"
msgstr "בקשת הרשמה"
#: ../js/ui/telepathyClient.js:482
#: ../js/ui/telepathyClient.js:412
msgid "Connection error"
msgstr "שגיאת התחברות"
#: ../js/ui/telepathyClient.js:740
#: ../js/ui/telepathyClient.js:670
#, c-format
msgid "%s is online."
msgstr "%s התחבר/ה."
#: ../js/ui/telepathyClient.js:745
#: ../js/ui/telepathyClient.js:674
#, c-format
msgid "%s is offline."
msgstr "%s התנתק/ה."
#: ../js/ui/telepathyClient.js:748
#: ../js/ui/telepathyClient.js:678
#, c-format
msgid "%s is away."
msgstr "'%s' מרוחק/ת."
#: ../js/ui/telepathyClient.js:751
#: ../js/ui/telepathyClient.js:681
#, c-format
msgid "%s is busy."
msgstr "%s עסוק/ה."
@ -1315,35 +1328,35 @@ msgstr "%s עסוק/ה."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:964
#: ../js/ui/telepathyClient.js:894
#, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "נשלח ב־<b>%X</b> בשעה <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970
#: ../js/ui/telepathyClient.js:900
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "נשלח ב<b>%A</b>, <b>ה־%d ב%B</b>"
#. 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.
#: ../js/ui/telepathyClient.js:975
#: ../js/ui/telepathyClient.js:905
#, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</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
#. IM name.
#: ../js/ui/telepathyClient.js:1017
#: ../js/ui/telepathyClient.js:947
#, c-format
msgid "%s is now known as %s"
msgstr "השם של %s הוחלף ל־%s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119
#: ../js/ui/telepathyClient.js:1049
#, c-format
msgid "Invitation to %s"
msgstr "הזמנה ל־%s"
@ -1351,37 +1364,37 @@ msgstr "הזמנה ל־%s"
#. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1127
#: ../js/ui/telepathyClient.js:1057
#, c-format
msgid "%s is inviting you to join %s"
msgstr "הוזמנת על ידי %s להצטרף אל %s"
#: ../js/ui/telepathyClient.js:1129
#: ../js/ui/telepathyClient.js:1209
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1059
#: ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1236
msgid "Decline"
msgstr "דחייה"
#: ../js/ui/telepathyClient.js:1130
#: ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1060
#: ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
msgid "Accept"
msgstr "אישור"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160
#: ../js/ui/telepathyClient.js:1090
#, c-format
msgid "Video call from %s"
msgstr "שיחת וידאו מאת %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163
#: ../js/ui/telepathyClient.js:1093
#, c-format
msgid "Call from %s"
msgstr "שיחה מאת %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170
#: ../js/ui/telepathyClient.js:1100
msgid "Answer"
msgstr "מענה"
@ -1390,125 +1403,125 @@ msgstr "מענה"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1203
#: ../js/ui/telepathyClient.js:1132
#, c-format
msgid "%s is sending you %s"
msgstr "%s שולח/ת אליך %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1201
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
#: ../js/ui/telepathyClient.js:1365
#: ../js/ui/telepathyClient.js:1294
msgid "Network error"
msgstr "שגיאת רשת"
#: ../js/ui/telepathyClient.js:1367
#: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed"
msgstr "האימות נכשל"
#: ../js/ui/telepathyClient.js:1369
#: ../js/ui/telepathyClient.js:1298
msgid "Encryption error"
msgstr "שגיאת הצפנה"
#: ../js/ui/telepathyClient.js:1371
#: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided"
msgstr "לא סופק אישור"
#: ../js/ui/telepathyClient.js:1373
#: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted"
msgstr "האישור אינו מהימן"
#: ../js/ui/telepathyClient.js:1375
#: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired"
msgstr "האישור פג"
#: ../js/ui/telepathyClient.js:1377
#: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated"
msgstr "האישור לא מופעל"
#: ../js/ui/telepathyClient.js:1379
#: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch"
msgstr "שם המארח באישור אינו תואם"
#: ../js/ui/telepathyClient.js:1381
#: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch"
msgstr "חוסר התאמה בטביעת האצבע של האישור"
#: ../js/ui/telepathyClient.js:1383
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed"
msgstr "אישור בחתימה עצמית"
#: ../js/ui/telepathyClient.js:1385
#: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline"
msgstr "המצב הוגדר ל'מנותק'"
#: ../js/ui/telepathyClient.js:1387
#: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available"
msgstr "ההצפנה אינה זמינה"
#: ../js/ui/telepathyClient.js:1389
#: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid"
msgstr "האישור אינו תקף"
#: ../js/ui/telepathyClient.js:1391
#: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused"
msgstr "ההתחברות נשללה"
#: ../js/ui/telepathyClient.js:1393
#: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established"
msgstr "לא ניתן להפעיל את החיבור"
#: ../js/ui/telepathyClient.js:1395
#: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost"
msgstr "החיבור אבד"
#: ../js/ui/telepathyClient.js:1397
#: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server"
msgstr "משאב זה כבר מחובר לשרת"
#: ../js/ui/telepathyClient.js:1399
#: ../js/ui/telepathyClient.js:1328
msgid "Connection has been replaced by a new connection using the same resource"
msgstr "החיבור הוחלף בחיבור חדש באמצעות אותו המשאב"
#: ../js/ui/telepathyClient.js:1401
#: ../js/ui/telepathyClient.js:1330
msgid "The account already exists on the server"
msgstr "החשבון כבר קיים בשרת"
#: ../js/ui/telepathyClient.js:1403
#: ../js/ui/telepathyClient.js:1332
msgid "Server is currently too busy to handle the connection"
msgstr "השרת עסוק ברגע זה מכדי לטפל בחיבור"
#: ../js/ui/telepathyClient.js:1405
#: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked"
msgstr "האישור נשלל"
#: ../js/ui/telepathyClient.js:1407
#: ../js/ui/telepathyClient.js:1336
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
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"
msgstr "אורך אישור השרת, או עומק שרשרת אישור השרת, חורגים מהמגבלות שנכפו על ידי ספריית ההצפנה"
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419
#: ../js/ui/telepathyClient.js:1348
#, c-format
msgid "Connection to %s failed"
msgstr "החיבור אל %s נכשל"
#: ../js/ui/telepathyClient.js:1428
#: ../js/ui/telepathyClient.js:1357
msgid "Reconnect"
msgstr "התחברות מחדש"
#: ../js/ui/telepathyClient.js:1429
#: ../js/ui/telepathyClient.js:1358
msgid "Edit account"
msgstr "עריכת חשבון"
#: ../js/ui/telepathyClient.js:1475
#: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason"
msgstr "סיבה לא ידועה"
@ -1524,41 +1537,41 @@ msgstr "בהמתנה"
msgid "Unavailable"
msgstr "לא זמין"
#: ../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..."
msgstr "כיבוי..."
#: ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:614
msgid "Notifications"
msgstr "התרעות"
#: ../js/ui/userMenu.js:620
#: ../js/ui/userMenu.js:622
msgid "Online Accounts"
msgstr "חשבונות מקוונים"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:626
msgid "System Settings"
msgstr "הגדרות המערכת"
#: ../js/ui/userMenu.js:631
#: ../js/ui/userMenu.js:633
msgid "Lock Screen"
msgstr "נעילת המסך"
#: ../js/ui/userMenu.js:636
#: ../js/ui/userMenu.js:638
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/userMenu.js:641
#: ../js/ui/userMenu.js:643
msgid "Log Out..."
msgstr "ניתוק..."
#: ../js/ui/userMenu.js:669
#: ../js/ui/userMenu.js:671
msgid "Your chat status will be set to busy"
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."
msgstr "ההתרעות כבויות כעת, לרבות הודעות צ׳אט. המצב המקוון שלך הותאם כדי לבשר לאחרים שיתכן שהודעותיהם לא יתקבלו באופן מיידי."
@ -1630,7 +1643,7 @@ msgstr "Print version"
msgid "Mode used by GDM for login screen"
msgstr "המצב בו GDM יעשה שימוש לצורך מסך הכניסה"
#: ../src/shell-app.c:639
#: ../src/shell-app.c:617
#, c-format
msgid "Failed to launch '%s'"
msgstr "אירע כשל בטעינת '%s'"
@ -1643,7 +1656,7 @@ msgstr "בריטניה"
msgid "Default"
msgstr "בררת מחדל"
#: ../src/shell-polkit-authentication-agent.c:334
#: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user"
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"

265
po/nb.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 3.3.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-06 21:16+0100\n"
"PO-Revision-Date: 2012-01-06 21:18+0100\n"
"POT-Creation-Date: 2012-01-28 15:53+0100\n"
"PO-Revision-Date: 2012-01-28 15:53+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\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 "
"oppbevaringsformat."
#: ../js/gdm/loginDialog.js:623
#: ../js/gdm/loginDialog.js:624
msgid "Session..."
msgstr "Økt …"
#: ../js/gdm/loginDialog.js:785
#: ../js/gdm/loginDialog.js:786
msgctxt "title"
msgid "Sign In"
msgstr "Logg inn"
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/loginDialog.js:830
#: ../js/gdm/loginDialog.js:831
msgid "(or swipe finger)"
msgstr "(eller dra finger)"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:851
#: ../js/gdm/loginDialog.js:852
msgid "Not listed?"
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/polkitAuthenticationAgent.js:175 ../js/ui/status/bluetooth.js:462
msgid "Cancel"
msgstr "Avbryt"
#: ../js/gdm/loginDialog.js:1024
#: ../js/gdm/loginDialog.js:1025
msgctxt "button"
msgid "Sign In"
msgstr "Logg inn"
#: ../js/gdm/loginDialog.js:1376
#: ../js/gdm/loginDialog.js:1377
msgid "Login Window"
msgstr "Innloggingsvindu"
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:578
#: ../js/ui/userMenu.js:580 ../js/ui/userMenu.js:649
#: ../js/gdm/powerMenu.js:113 ../js/ui/userMenu.js:580
#: ../js/ui/userMenu.js:582 ../js/ui/userMenu.js:651
msgid "Suspend"
msgstr "Hvilemodus"
@ -433,7 +433,7 @@ msgid "Next week"
msgstr "Neste uke"
#: ../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"
msgstr "Ukjent"
@ -453,7 +453,7 @@ msgstr "Opptatt"
msgid "Offline"
msgstr "Frakoblet"
#: ../js/ui/contactDisplay.js:141
#: ../js/ui/contactDisplay.js:148
msgid "CONTACTS"
msgstr "KONTAKTER"
@ -461,58 +461,58 @@ msgstr "KONTAKTER"
msgid "Remove"
msgstr "Fjern"
#: ../js/ui/dateMenu.js:96
#: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:122
#: ../js/ui/dateMenu.js:123
msgid "Open Calendar"
msgstr "Åpne kalender"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S"
#: ../js/ui/dateMenu.js:181
#: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R"
msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:185
#: ../js/ui/dateMenu.js:186
msgid "%a %R:%S"
msgstr "%a %R.%S"
#: ../js/ui/dateMenu.js:186
#: ../js/ui/dateMenu.js:187
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:193
#: ../js/ui/dateMenu.js:194
msgid "%a %b %e, %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"
msgstr "%a %e %b, %l.%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:198
#: ../js/ui/dateMenu.js:199
msgid "%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"
msgstr "%a %l.%M %p"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:210
#: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y"
@ -689,7 +689,7 @@ msgstr "Fjern demping"
msgid "Mute"
msgstr "Demp"
#: ../js/ui/messageTray.js:2444
#: ../js/ui/messageTray.js:2446
msgid "System Information"
msgstr "Systeminformasjon"
@ -792,17 +792,17 @@ msgstr "Programmer"
msgid "Dash"
msgstr "Favoritter"
#: ../js/ui/panel.js:564
#: ../js/ui/panel.js:572
msgid "Quit"
msgstr "Avslutt"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:603
msgid "Activities"
msgstr "Aktiviteter"
#: ../js/ui/panel.js:982
#: ../js/ui/panel.js:990
msgid "Top Bar"
msgstr "Topp-panel"
@ -819,7 +819,7 @@ msgstr "Prøv igjen"
msgid "Connect to..."
msgstr "Koble til …"
#: ../js/ui/placeDisplay.js:364
#: ../js/ui/placeDisplay.js:367
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
@ -852,7 +852,7 @@ msgstr "Passord:"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:719
#: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -888,6 +888,10 @@ msgstr "Skjul tekst"
msgid "Wrong password, please try again"
msgstr "Feil passord. Prøv igjen"
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Tilgjengelighet"
#: ../js/ui/status/accessibility.js:52
msgid "Zoom"
msgstr "Zoom"
@ -931,10 +935,10 @@ msgstr "Høy kontrast"
msgid "Large Text"
msgstr "Stor tekst"
#: ../js/ui/status/bluetooth.js:35 ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407 ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892
#: ../js/ui/status/bluetooth.js:31 ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258 ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371 ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436 ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -955,7 +959,7 @@ msgid "Bluetooth Settings"
msgstr "Innstillinger for Bluetooth"
#. 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"
msgstr "maskinvare slått av"
@ -963,11 +967,11 @@ msgstr "maskinvare slått av"
msgid "Connection"
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..."
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..."
msgstr "kobler til …"
@ -1018,7 +1022,7 @@ msgstr "Alltid gi tilgang"
msgid "Grant this time only"
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"
msgstr "Avvis"
@ -1071,118 +1075,126 @@ msgid "<unknown>"
msgstr "<ukjent>"
#. 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"
msgstr "slått av"
#. 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)
#: ../js/ui/status/network.js:488
#: ../js/ui/status/network.js:489
msgid "unmanaged"
msgstr "ikke håndtert"
#. 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"
msgstr "autentisering kreves"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:509
#: ../js/ui/status/network.js:510
msgid "firmware missing"
msgstr "fastvare mangler"
#. 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"
msgstr "kabel koblet fra"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521
#: ../js/ui/status/network.js:522
msgid "unavailable"
msgstr "ikke tilgjengelig"
#: ../js/ui/status/network.js:523
#: ../js/ui/status/network.js:524
msgid "connection failed"
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..."
msgstr "Mer …"
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. 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)"
msgstr "Tilkoblet (privat)"
#: ../js/ui/status/network.js:695
#: ../js/ui/status/network.js:696
msgid "Auto Ethernet"
msgstr "Automatisk Ethernet"
#: ../js/ui/status/network.js:756
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Automatisk bredbånd"
#: ../js/ui/status/network.js:759
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Automatisk oppringt"
#. 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
msgid "Auto %s"
msgstr "Automatisk %s"
#: ../js/ui/status/network.js:880
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Automatisk Bluetooth"
#: ../js/ui/status/network.js:1453
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
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"
msgstr "Slå på nettverk"
#: ../js/ui/status/network.js:1559
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Kablet"
#: ../js/ui/status/network.js:1570
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Trådløst"
#: ../js/ui/status/network.js:1580
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Mobilt bredbånd"
#: ../js/ui/status/network.js:1590
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "VPN-tilkoblinger"
#: ../js/ui/status/network.js:1601
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Innstillinger for nettverk"
#: ../js/ui/status/network.js:1738
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Tilkobling feilet"
#: ../js/ui/status/network.js:1739
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "Aktivering av nettverkstilkobling feilet"
#: ../js/ui/status/network.js:1989
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "Nettverk er slått av"
#: ../js/ui/status/network.js:2113
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
msgstr "Nettverkshåndtering"
#: ../js/ui/status/power.js:60
msgid "Battery"
msgstr "Batteri"
#: ../js/ui/status/power.js:77
msgid "Power Settings"
msgstr "Innstillinger for strøm"
@ -1271,7 +1283,7 @@ msgstr "Nettbrett"
msgid "Computer"
msgstr "Datamaskin"
#: ../js/ui/status/volume.js:38
#: ../js/ui/status/volume.js:25 ../js/ui/status/volume.js:38
msgid "Volume"
msgstr "Volum"
@ -1279,47 +1291,46 @@ msgstr "Volum"
msgid "Microphone"
msgstr "Mikrofon"
#. We got the TpContact
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/telepathyClient.js:267
#: ../js/ui/telepathyClient.js:225
msgid "Invitation"
msgstr "Invitasjon"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:335
#: ../js/ui/telepathyClient.js:278
msgid "Call"
msgstr "Ring"
#. We got the TpContact
#: ../js/ui/telepathyClient.js:365
#: ../js/ui/telepathyClient.js:294
msgid "File Transfer"
msgstr "Filoverføring"
#: ../js/ui/telepathyClient.js:446
#: ../js/ui/telepathyClient.js:376
msgid "Subscription request"
msgstr "Forespørsel om abbonering"
#: ../js/ui/telepathyClient.js:482
#: ../js/ui/telepathyClient.js:412
msgid "Connection error"
msgstr "Feil ved tilkobling"
#: ../js/ui/telepathyClient.js:740
#: ../js/ui/telepathyClient.js:670
#, c-format
msgid "%s is online."
msgstr "%s er tilkoblet."
#: ../js/ui/telepathyClient.js:745
#: ../js/ui/telepathyClient.js:674
#, c-format
msgid "%s is offline."
msgstr "%s er frakoblet."
#: ../js/ui/telepathyClient.js:748
#: ../js/ui/telepathyClient.js:678
#, c-format
msgid "%s is away."
msgstr "«%s» er borte."
#: ../js/ui/telepathyClient.js:751
#: ../js/ui/telepathyClient.js:681
#, c-format
msgid "%s is busy."
msgstr "%s er opptatt."
@ -1327,35 +1338,35 @@ msgstr "%s er opptatt."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:964
#: ../js/ui/telepathyClient.js:894
#, no-c-format
msgid "Sent at <b>%X</b> on <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",
#. shown when you get a chat message in the same year.
#: ../js/ui/telepathyClient.js:970
#: ../js/ui/telepathyClient.js:900
#, no-c-format
msgid "Sent on <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",
#. shown when you get a chat message in a different year.
#: ../js/ui/telepathyClient.js:975
#: ../js/ui/telepathyClient.js:905
#, no-c-format
msgid "Sent on <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
#. IM name.
#: ../js/ui/telepathyClient.js:1017
#: ../js/ui/telepathyClient.js:947
#, c-format
msgid "%s is now known as %s"
msgstr "%s er nå kjent som %s"
#. translators: argument is a room name like
#. * room@jabber.org for example.
#: ../js/ui/telepathyClient.js:1119
#: ../js/ui/telepathyClient.js:1049
#, c-format
msgid "Invitation to %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
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example.
#: ../js/ui/telepathyClient.js:1127
#: ../js/ui/telepathyClient.js:1057
#, c-format
msgid "%s is inviting you to join %s"
msgstr "%s inviterer deg til å bli med i %s"
#: ../js/ui/telepathyClient.js:1129 ../js/ui/telepathyClient.js:1209
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1059 ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1236
msgid "Decline"
msgstr "Avslå"
#: ../js/ui/telepathyClient.js:1130 ../js/ui/telepathyClient.js:1210
#: ../js/ui/telepathyClient.js:1308
#: ../js/ui/telepathyClient.js:1060 ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
msgid "Accept"
msgstr "Godta"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1160
#: ../js/ui/telepathyClient.js:1090
#, c-format
msgid "Video call from %s"
msgstr "Videosamtale fra %s"
#. translators: argument is a contact name like Alice for example.
#: ../js/ui/telepathyClient.js:1163
#: ../js/ui/telepathyClient.js:1093
#, c-format
msgid "Call from %s"
msgstr "Samtale fra %s"
#. translators: this is a button label (verb), not a noun
#: ../js/ui/telepathyClient.js:1170
#: ../js/ui/telepathyClient.js:1100
msgid "Answer"
msgstr "Svar"
@ -1400,110 +1411,110 @@ msgstr "Svar"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1203
#: ../js/ui/telepathyClient.js:1132
#, c-format
msgid "%s is sending you %s"
msgstr "%s sender deg %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1272
#: ../js/ui/telepathyClient.js:1201
#, c-format
msgid "%s would like permission to see when you are online"
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"
msgstr "Nettverksfeil"
#: ../js/ui/telepathyClient.js:1367
#: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed"
msgstr "Autentisering feilet"
#: ../js/ui/telepathyClient.js:1369
#: ../js/ui/telepathyClient.js:1298
msgid "Encryption error"
msgstr "Feil ved kryptering"
#: ../js/ui/telepathyClient.js:1371
#: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided"
msgstr "Sertifikat ikke oppgitt"
#: ../js/ui/telepathyClient.js:1373
#: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted"
msgstr "Stoler ikke på sertifikatet"
#: ../js/ui/telepathyClient.js:1375
#: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired"
msgstr "Sertifikatet er utløpt"
#: ../js/ui/telepathyClient.js:1377
#: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated"
msgstr "Sertifikatet er ikke aktivert"
#: ../js/ui/telepathyClient.js:1379
#: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch"
msgstr "Feil vertsnavn for sertifikat"
#: ../js/ui/telepathyClient.js:1381
#: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch"
msgstr "Feil fingeravtrykk for sertifikat"
#: ../js/ui/telepathyClient.js:1383
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed"
msgstr "Sertifikatet er selvsignert"
#: ../js/ui/telepathyClient.js:1385
#: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline"
msgstr "Status er satt til frakoblet"
#: ../js/ui/telepathyClient.js:1387
#: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available"
msgstr "Kryptering er ikke tilgjengelig"
#: ../js/ui/telepathyClient.js:1389
#: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid"
msgstr "Sertifikatet er ugyldig"
#: ../js/ui/telepathyClient.js:1391
#: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused"
msgstr "Tilkobling ble nektet"
#: ../js/ui/telepathyClient.js:1393
#: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established"
msgstr "Tilkobling kan ikke etableres"
#: ../js/ui/telepathyClient.js:1395
#: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost"
msgstr "Tilkobling tapt"
#: ../js/ui/telepathyClient.js:1397
#: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server"
msgstr "Denne ressursen er allerede koblet til tjeneren"
#: ../js/ui/telepathyClient.js:1399
#: ../js/ui/telepathyClient.js:1328
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr ""
"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"
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"
msgstr "Tjener er for opptatt til å håndtere tilkoblingen"
#: ../js/ui/telepathyClient.js:1405
#: ../js/ui/telepathyClient.js:1334
msgid "Certificate has been revoked"
msgstr "Sertifikatet er tilbaketrukket"
#: ../js/ui/telepathyClient.js:1407
#: ../js/ui/telepathyClient.js:1336
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Sertifikatet bruker en usikker sifferalgoritme eller er krytografisk svakt"
#: ../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"
@ -1513,20 +1524,20 @@ msgstr ""
#. translators: argument is the account name, like
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1419
#: ../js/ui/telepathyClient.js:1348
#, c-format
msgid "Connection to %s failed"
msgstr "Tilkobling til %s feilet"
#: ../js/ui/telepathyClient.js:1428
#: ../js/ui/telepathyClient.js:1357
msgid "Reconnect"
msgstr "Koble til på nytt"
#: ../js/ui/telepathyClient.js:1429
#: ../js/ui/telepathyClient.js:1358
msgid "Edit account"
msgstr "Rediger konto"
#: ../js/ui/telepathyClient.js:1475
#: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason"
msgstr "Ukjent årsak"
@ -1542,39 +1553,39 @@ msgstr "Ledig"
msgid "Unavailable"
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..."
msgstr "Slå av …"
#: ../js/ui/userMenu.js:612
#: ../js/ui/userMenu.js:614
msgid "Notifications"
msgstr "Varslinger"
#: ../js/ui/userMenu.js:620
#: ../js/ui/userMenu.js:622
msgid "Online Accounts"
msgstr "Kontoer på nettet"
#: ../js/ui/userMenu.js:624
#: ../js/ui/userMenu.js:626
msgid "System Settings"
msgstr "Systeminnstillinger"
#: ../js/ui/userMenu.js:631
#: ../js/ui/userMenu.js:633
msgid "Lock Screen"
msgstr "Lås skjerm"
#: ../js/ui/userMenu.js:636
#: ../js/ui/userMenu.js:638
msgid "Switch User"
msgstr "Bytt bruker"
#: ../js/ui/userMenu.js:641
#: ../js/ui/userMenu.js:643
msgid "Log Out..."
msgstr "Logg ut …"
#: ../js/ui/userMenu.js:669
#: ../js/ui/userMenu.js:671
msgid "Your chat status will be set to busy"
msgstr "Din pratestatus vil bli satt til opptatt"
#: ../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."
@ -1648,7 +1659,7 @@ msgstr "Skriv ut versjon"
msgid "Mode used by GDM for login screen"
msgstr "Modus som brukes av GDM for innloggingsskjermen"
#: ../src/shell-app.c:639
#: ../src/shell-app.c:617
#, c-format
msgid "Failed to launch '%s'"
msgstr "Klarte ikke å starte «%s»"
@ -1661,7 +1672,7 @@ msgstr "Storbritannia"
msgid "Default"
msgstr "Forvalg"
#: ../src/shell-polkit-authentication-agent.c:334
#: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user"
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 ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-01-15 01:35+0000\n"
"PO-Revision-Date: 2012-01-15 13:44+0100\n"
"POT-Creation-Date: 2012-02-02 13:31+0000\n"
"PO-Revision-Date: 2012-02-02 20:58+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\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
#, 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."
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."
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=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
msgid "Show date in clock"
@ -171,9 +171,9 @@ msgid "Login Window"
msgstr "Prijavno okno"
#: ../js/gdm/powerMenu.js:113
#: ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:581
#: ../js/ui/userMenu.js:650
#: ../js/ui/userMenu.js:583
#: ../js/ui/userMenu.js:652
msgid "Suspend"
msgstr "Zaustavi"
@ -397,7 +397,7 @@ msgstr "Naslednji teden"
#: ../js/ui/contactDisplay.js:63
#: ../js/ui/notificationDaemon.js:486
#: ../js/ui/status/power.js:215
#: ../src/shell-app.c:394
#: ../src/shell-app.c:372
msgid "Unknown"
msgstr "Neznano"
@ -420,7 +420,7 @@ msgstr "Zaposleno"
msgid "Offline"
msgstr "Nepovezano"
#: ../js/ui/contactDisplay.js:141
#: ../js/ui/contactDisplay.js:148
msgid "CONTACTS"
msgstr "Stiki"
@ -429,58 +429,58 @@ msgstr "Stiki"
msgid "Remove"
msgstr "Odstrani"
#: ../js/ui/dateMenu.js:96
#: ../js/ui/dateMenu.js:97
msgid "Date and Time Settings"
msgstr "Nastavitve časa in datuma"
#: ../js/ui/dateMenu.js:122
#: ../js/ui/dateMenu.js:123
msgid "Open Calendar"
msgstr "Odpri koledar"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:181
msgid "%a %b %e, %R:%S"
msgstr "%a. %e. %b., %R:%S"
#: ../js/ui/dateMenu.js:181
#: ../js/ui/dateMenu.js:182
msgid "%a %b %e, %R"
msgstr "%a, %e. %b., %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:185
#: ../js/ui/dateMenu.js:186
msgid "%a %R:%S"
msgstr "%a. %R:%S"
#: ../js/ui/dateMenu.js:186
#: ../js/ui/dateMenu.js:187
msgid "%a %R"
msgstr "%a. %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:193
#: ../js/ui/dateMenu.js:194
msgid "%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"
msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:198
#: ../js/ui/dateMenu.js:199
msgid "%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"
msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#.
#: ../js/ui/dateMenu.js:210
#: ../js/ui/dateMenu.js:211
msgid "%A %B %e, %Y"
msgstr "%a, %e. %b., %R"
@ -665,7 +665,7 @@ msgstr "Povrni glasnost"
msgid "Mute"
msgstr "Utišaj"
#: ../js/ui/messageTray.js:2444
#: ../js/ui/messageTray.js:2446
msgid "System Information"
msgstr "Podrobnosti sistema"
@ -767,17 +767,17 @@ msgstr "Programi"
msgid "Dash"
msgstr "Armaturna plošča"
#: ../js/ui/panel.js:564
#: ../js/ui/panel.js:572
msgid "Quit"
msgstr "Končaj"
#. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:603
msgid "Activities"
msgstr "Dejavnosti"
#: ../js/ui/panel.js:982
#: ../js/ui/panel.js:990
msgid "Top Bar"
msgstr "Vrhnja vrstica"
@ -827,7 +827,7 @@ msgstr "Geslo:"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:719
#: ../js/ui/popupMenu.js:720
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -859,10 +859,14 @@ msgstr "Pokaži besedilo"
msgid "Hide Text"
msgstr "Skrij besedilo"
#: ../js/ui/shellMountOperation.js:269
#: ../js/ui/shellMountOperation.js:271
msgid "Wrong password, please try again"
msgstr "Napačno geslo; poskusite znova."
#: ../js/ui/status/accessibility.js:47
msgid "Accessibility"
msgstr "Dostopnost"
#: ../js/ui/status/accessibility.js:52
msgid "Zoom"
msgstr "Približanje"
@ -906,13 +910,14 @@ msgstr "Visok kontrast"
msgid "Large Text"
msgstr "Veliko besedilo"
#: ../js/ui/status/bluetooth.js:31
#: ../js/ui/status/bluetooth.js:35
#: ../js/ui/status/bluetooth.js:258
#: ../js/ui/status/bluetooth.js:341
#: ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:407
#: ../js/ui/status/bluetooth.js:436
#: ../js/ui/status/network.js:892
#: ../js/ui/status/network.js:893
msgid "Bluetooth"
msgstr "Bluetooth"
@ -934,7 +939,7 @@ msgstr "Nastavitve za Bluetooth"
#. 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/network.js:256
msgid "hardware disabled"
msgstr "strojno onemogočen"
@ -943,12 +948,12 @@ msgid "Connection"
msgstr "Povezava"
#: ../js/ui/status/bluetooth.js:214
#: ../js/ui/status/network.js:490
#: ../js/ui/status/network.js:491
msgid "disconnecting..."
msgstr "prekinjanje povezave ..."
#: ../js/ui/status/bluetooth.js:227
#: ../js/ui/status/network.js:496
#: ../js/ui/status/network.js:497
msgid "connecting..."
msgstr "povezovanje ..."
@ -1055,122 +1060,130 @@ msgid "<unknown>"
msgstr "<neznano>"
#. 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"
msgstr "onemogočeno"
#. 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)
#: ../js/ui/status/network.js:488
#: ../js/ui/status/network.js:489
msgid "unmanaged"
msgstr "neupravljano"
#. 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"
msgstr "zahtevana je overitev"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing
#: ../js/ui/status/network.js:509
#: ../js/ui/status/network.js:510
msgid "firmware missing"
msgstr "manjka strojna programska oprema"
#. 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"
msgstr "kabel ni priklopljen"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:521
#: ../js/ui/status/network.js:522
msgid "unavailable"
msgstr "ni na voljo"
#: ../js/ui/status/network.js:523
#: ../js/ui/status/network.js:524
msgid "connection failed"
msgstr "povezovanje je spodletelo"
#: ../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..."
msgstr "Več ..."
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
#. 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)"
msgstr "Povezano (zasebna povezava)"
#: ../js/ui/status/network.js:695
#: ../js/ui/status/network.js:696
msgid "Auto Ethernet"
msgstr "Samodejni eternet"
#: ../js/ui/status/network.js:756
#: ../js/ui/status/network.js:757
msgid "Auto broadband"
msgstr "Samodejni širokopasovni dostop"
#: ../js/ui/status/network.js:759
#: ../js/ui/status/network.js:760
msgid "Auto dial-up"
msgstr "Samodejni klicni dostop"
#. 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
msgid "Auto %s"
msgstr "Samodejna povezava z %s"
#: ../js/ui/status/network.js:880
#: ../js/ui/status/network.js:881
msgid "Auto bluetooth"
msgstr "Samodejna povezava z Bluetooth"
#: ../js/ui/status/network.js:1453
#: ../js/ui/status/network.js:1454
msgid "Auto wireless"
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"
msgstr "Omogoči omrežje"
#: ../js/ui/status/network.js:1559
#: ../js/ui/status/network.js:1560
msgid "Wired"
msgstr "Žično"
#: ../js/ui/status/network.js:1570
#: ../js/ui/status/network.js:1571
msgid "Wireless"
msgstr "Brezžično"
#: ../js/ui/status/network.js:1580
#: ../js/ui/status/network.js:1581
msgid "Mobile broadband"
msgstr "Mobilni širokopasovni dostop"
#: ../js/ui/status/network.js:1590
#: ../js/ui/status/network.js:1591
msgid "VPN Connections"
msgstr "Povezave VPN"
#: ../js/ui/status/network.js:1601
#: ../js/ui/status/network.js:1602
msgid "Network Settings"
msgstr "Omrežne nastavitve"
#: ../js/ui/status/network.js:1738
#: ../js/ui/status/network.js:1739
msgid "Connection failed"
msgstr "Povezava je spodletela"
#: ../js/ui/status/network.js:1739
#: ../js/ui/status/network.js:1740
msgid "Activation of network connection failed"
msgstr "Omogočanje omrežne povezave je spodletelo."
#: ../js/ui/status/network.js:1989
#: ../js/ui/status/network.js:1993
msgid "Networking is disabled"
msgstr "Omrežje je onemogočeno"
#: ../js/ui/status/network.js:2113
#: ../js/ui/status/network.js:2117
msgid "Network Manager"
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"
msgstr "Upravljanje napajanja"
@ -1267,6 +1280,7 @@ msgstr "Tablični računalnik"
msgid "Computer"
msgstr "Računalnik"
#: ../js/ui/status/volume.js:25
#: ../js/ui/status/volume.js:38
msgid "Volume"
msgstr "Glasnost"
@ -1364,14 +1378,14 @@ msgid "%s is inviting you to join %s"
msgstr "%s vas vabi, da se pridružite v %s"
#: ../js/ui/telepathyClient.js:1059
#: ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
#: ../js/ui/telepathyClient.js:1138
#: ../js/ui/telepathyClient.js:1236
msgid "Decline"
msgstr "Zavrni"
#: ../js/ui/telepathyClient.js:1060
#: ../js/ui/telepathyClient.js:1140
#: ../js/ui/telepathyClient.js:1238
#: ../js/ui/telepathyClient.js:1139
#: ../js/ui/telepathyClient.js:1237
msgid "Accept"
msgstr "Sprejmi"
@ -1397,125 +1411,125 @@ msgstr "Odgovori"
#. * file name. The string will be something
#. * like: "Alice is sending you test.ogg"
#.
#: ../js/ui/telepathyClient.js:1133
#: ../js/ui/telepathyClient.js:1132
#, c-format
msgid "%s is sending you %s"
msgstr "%s pošilja %s"
#. To translators: The parameter is the contact's alias
#: ../js/ui/telepathyClient.js:1202
#: ../js/ui/telepathyClient.js:1201
#, c-format
msgid "%s would like permission to see when you are online"
msgstr "%s želi dovoljenje za pogled dosegljivosti"
#: ../js/ui/telepathyClient.js:1295
#: ../js/ui/telepathyClient.js:1294
msgid "Network error"
msgstr "Napaka omrežja"
#: ../js/ui/telepathyClient.js:1297
#: ../js/ui/telepathyClient.js:1296
msgid "Authentication failed"
msgstr "Overitev je spodletela"
#: ../js/ui/telepathyClient.js:1299
#: ../js/ui/telepathyClient.js:1298
msgid "Encryption error"
msgstr "Napaka šifriranja"
#: ../js/ui/telepathyClient.js:1301
#: ../js/ui/telepathyClient.js:1300
msgid "Certificate not provided"
msgstr "Potrdilo ni na voljo"
#: ../js/ui/telepathyClient.js:1303
#: ../js/ui/telepathyClient.js:1302
msgid "Certificate untrusted"
msgstr "Potrdilo ni zaupljivo"
#: ../js/ui/telepathyClient.js:1305
#: ../js/ui/telepathyClient.js:1304
msgid "Certificate expired"
msgstr "Potrdilo je preteklo"
#: ../js/ui/telepathyClient.js:1307
#: ../js/ui/telepathyClient.js:1306
msgid "Certificate not activated"
msgstr "Potrdilo ni potrjeno"
#: ../js/ui/telepathyClient.js:1309
#: ../js/ui/telepathyClient.js:1308
msgid "Certificate hostname mismatch"
msgstr "Neustrezno ime gostitelja potrdila"
#: ../js/ui/telepathyClient.js:1311
#: ../js/ui/telepathyClient.js:1310
msgid "Certificate fingerprint mismatch"
msgstr "Neustrezen prstni odtis potrdila"
#: ../js/ui/telepathyClient.js:1313
#: ../js/ui/telepathyClient.js:1312
msgid "Certificate self-signed"
msgstr "Potrdilo je samo-podpisano"
#: ../js/ui/telepathyClient.js:1315
#: ../js/ui/telepathyClient.js:1314
msgid "Status is set to offline"
msgstr "Stanje je nastavljeno na brez povezave"
#: ../js/ui/telepathyClient.js:1317
#: ../js/ui/telepathyClient.js:1316
msgid "Encryption is not available"
msgstr "Šifriranje ni na voljo."
#: ../js/ui/telepathyClient.js:1319
#: ../js/ui/telepathyClient.js:1318
msgid "Certificate is invalid"
msgstr "Potrdilo je neveljavno."
#: ../js/ui/telepathyClient.js:1321
#: ../js/ui/telepathyClient.js:1320
msgid "Connection has been refused"
msgstr "Povezava je zavrnjena."
#: ../js/ui/telepathyClient.js:1323
#: ../js/ui/telepathyClient.js:1322
msgid "Connection can't be established"
msgstr "Povezave ni mogoče vzpostaviti."
#: ../js/ui/telepathyClient.js:1325
#: ../js/ui/telepathyClient.js:1324
msgid "Connection has been lost"
msgstr "Povezava je prekinjena."
#: ../js/ui/telepathyClient.js:1327
#: ../js/ui/telepathyClient.js:1326
msgid "This resource is already connected to the server"
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"
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"
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"
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"
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"
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"
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
#. * name@jabber.org for example.
#: ../js/ui/telepathyClient.js:1349
#: ../js/ui/telepathyClient.js:1348
#, c-format
msgid "Connection to %s failed"
msgstr "Povezava z %s je spodletela"
#: ../js/ui/telepathyClient.js:1358
#: ../js/ui/telepathyClient.js:1357
msgid "Reconnect"
msgstr "Ponovno se poveži"
#: ../js/ui/telepathyClient.js:1359
#: ../js/ui/telepathyClient.js:1358
msgid "Edit account"
msgstr "Uredi račun"
#: ../js/ui/telepathyClient.js:1405
#: ../js/ui/telepathyClient.js:1404
msgid "Unknown reason"
msgstr "Neznan vzrok"
@ -1531,41 +1545,41 @@ msgstr "Nedejavno"
msgid "Unavailable"
msgstr "Nedostopno"
#: ../js/ui/userMenu.js:577
#: ../js/ui/userMenu.js:581
#: ../js/ui/userMenu.js:651
#: ../js/ui/userMenu.js:579
#: ../js/ui/userMenu.js:583
#: ../js/ui/userMenu.js:653
msgid "Power Off..."
msgstr "Izklop ..."
#: ../js/ui/userMenu.js:613
#: ../js/ui/userMenu.js:615
msgid "Notifications"
msgstr "Obvestila"
#: ../js/ui/userMenu.js:621
#: ../js/ui/userMenu.js:623
msgid "Online Accounts"
msgstr "Spletni računi"
#: ../js/ui/userMenu.js:625
#: ../js/ui/userMenu.js:627
msgid "System Settings"
msgstr "Sistemske nastavitve"
#: ../js/ui/userMenu.js:632
#: ../js/ui/userMenu.js:634
msgid "Lock Screen"
msgstr "Zakleni zaslon"
#: ../js/ui/userMenu.js:637
#: ../js/ui/userMenu.js:639
msgid "Switch User"
msgstr "Preklopi uporabnika"
#: ../js/ui/userMenu.js:642
#: ../js/ui/userMenu.js:644
msgid "Log Out..."
msgstr "Odjava ..."
#: ../js/ui/userMenu.js:670
#: ../js/ui/userMenu.js:672
msgid "Your chat status will be set to busy"
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."
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"
msgstr "Način uporabljen v GDM za prijavni naslov"
#: ../src/shell-app.c:639
#: ../src/shell-app.c:617
#, c-format
msgid "Failed to launch '%s'"
msgstr "Zaganjanje '%s' je spodletelo"
@ -1652,7 +1666,7 @@ msgstr "Velika Britanija"
msgid "Default"
msgstr "Privzeto"
#: ../src/shell-polkit-authentication-agent.c:334
#: ../src/shell-polkit-authentication-agent.c:332
msgid "Authentication dialog was dismissed by the user"
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-enum-types.h \
st-enum-types.c \
st-marshal.h \
st-marshal.c
st-enum-types.c
BUILT_SOURCES += $(st_built_sources)
EXTRA_DIST += \
st/test-theme.css \
st/st-marshal.list \
st/st-enum-types.h.in \
st/st-enum-types.c.in
CLEANFILES += stamp-st-marshal.h 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
CLEANFILES += stamp-st-enum-types.h
st-enum-types.h: stamp-st-enum-types.h Makefile
@true

View File

@ -5,14 +5,8 @@ tray_cflags = \
$(TRAY_CFLAGS) \
$(NULL)
tray_built_sources = \
na-marshal.h \
na-marshal.c
BUILT_SOURCES += $(tray_built_sources)
TRAY_STAMP_FILES = stamp-na-marshal.h
# please, keep this sorted alphabetically
tray_source = \
tray/na-tray-child.c \
@ -21,26 +15,6 @@ tray_source = \
tray/na-tray-manager.h \
$(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
libtray_la_LIBADD = $(TRAY_LIBS)
@ -52,6 +26,3 @@ libtray_la_CPPFLAGS = $(tray_cflags)
libtray_la_LDFLAGS = $(LDADD)
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)
bin_SCRIPTS += gnome-shell-extension-tool
EXTRA_DIST += gnome-shell-extension-tool.in
bin_SCRIPTS += gnome-shell-extension-tool gnome-shell-extension-prefs
EXTRA_DIST += gnome-shell-extension-tool.in gnome-shell-extension-prefs.in
bin_PROGRAMS = gnome-shell-real
if USE_JHBUILD_WRAPPER_SCRIPT
@ -48,15 +48,17 @@ uninstall-hook:
rm -f $(DESTDIR)$(bindir)/gnome-shell
generated_script_substitutions = \
-e "s|@bindir[@]|$(bindir)|" \
-e "s|@datadir[@]|$(datadir)|" \
-e "s|@libexecdir[@]|$(libexecdir)|" \
-e "s|@libdir[@]|$(libdir)|" \
-e "s|@JHBUILD_TYPELIBDIR[@]|$(JHBUILD_TYPELIBDIR)|" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
-e "s|@PYTHON[@]|$(PYTHON)|" \
-e "s|@VERSION[@]|$(VERSION)|" \
-e "s|@sysconfdir[@]|$(sysconfdir)|"
-e "s|@bindir[@]|$(bindir)|g" \
-e "s|@datadir[@]|$(datadir)|g" \
-e "s|@libexecdir[@]|$(libexecdir)|g" \
-e "s|@libdir[@]|$(libdir)|g" \
-e "s|@pkglibdir[@]|$(pkglibdir)|g" \
-e "s|@JHBUILD_TYPELIBDIR[@]|$(JHBUILD_TYPELIBDIR)|g" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|g" \
-e "s|@PYTHON[@]|$(PYTHON)|g" \
-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
$(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
$(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)
include Makefile-st.am
@ -86,16 +91,13 @@ gnome_shell_cflags = \
-DJSDIR=\"$(pkgdatadir)/js\"
privlibdir = $(pkglibdir)
privlib_LTLIBRARIES = libgnome-shell.la
privlib_LTLIBRARIES = libgnome-shell.la libgnome-shell-js.la
shell_built_sources = \
shell-marshal.h \
shell-marshal.c \
shell-enum-types.h \
shell-enum-types.c
BUILT_SOURCES += $(shell_built_sources)
EXTRA_DIST += shell-marshal.list
shell_public_headers_h = \
shell-app.h \
@ -111,6 +113,7 @@ shell_public_headers_h = \
shell-mount-operation.h \
shell-network-agent.h \
shell-perf-log.h \
shell-screen-grabber.h \
shell-slicer.h \
shell-stack.h \
shell-tp-client.h \
@ -158,6 +161,7 @@ libgnome_shell_la_SOURCES = \
shell-perf-log.c \
shell-polkit-authentication-agent.h \
shell-polkit-authentication-agent.c \
shell-screen-grabber.c \
shell-slicer.c \
shell-stack.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.c \
shell-recorder.h
@ -206,6 +227,8 @@ test_recorder_LDADD = $(TEST_SHELL_RECORDER_LIBS)
test_recorder_SOURCES = \
$(shell_recorder_sources) $(shell_recorder_private_sources) \
shell-screen-grabber.c \
shell-screen-grabber.h \
test-recorder.c
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
@true
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
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_INCLUDES = Clutter-1.0 Gtk-3.0
St_1_0_gir_CFLAGS = $(st_cflags) -DST_COMPILATION

View File

@ -150,7 +150,7 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
appointment_sources_changed),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
NULL,
G_TYPE_NONE,
0);
@ -162,7 +162,7 @@ calendar_sources_class_init (CalendarSourcesClass *klass)
task_sources_changed),
NULL,
NULL,
g_cclosure_marshal_VOID__VOID,
NULL,
G_TYPE_NONE,
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcChannelMapClass, volume_changed),
NULL, NULL,
g_cclosure_marshal_VOID__BOOLEAN,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, state_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [STREAM_ADDED] =
g_signal_new ("stream-added",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, stream_added),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [STREAM_REMOVED] =
g_signal_new ("stream-removed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, stream_removed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [CARD_ADDED] =
g_signal_new ("card-added",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, card_added),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [CARD_REMOVED] =
g_signal_new ("card-removed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, card_removed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [DEFAULT_SINK_CHANGED] =
g_signal_new ("default-sink-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, default_sink_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
signals [DEFAULT_SOURCE_CHANGED] =
g_signal_new ("default-source-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GvcMixerControlClass, default_source_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
NULL, NULL, NULL,
G_TYPE_NONE, 1, G_TYPE_UINT);
g_type_class_add_private (klass, sizeof (GvcMixerControlPrivate));

View File

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

View File

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

View File

@ -75,6 +75,7 @@ struct _ShellApp
char *name_collation_key;
char *casefolded_description;
char *casefolded_exec;
char **casefolded_keywords;
};
enum {
@ -1299,6 +1300,7 @@ shell_app_init_search_data (ShellApp *app)
const char *name;
const char *exec;
const char *comment;
const char * const *keywords;
char *normalized_exec;
GDesktopAppInfo *appinfo;
@ -1313,6 +1315,25 @@ shell_app_init_search_data (ShellApp *app)
normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (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;
}
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)
return current_match;
@ -1464,6 +1502,7 @@ shell_app_finalize (GObject *object)
g_free (app->name_collation_key);
g_free (app->casefolded_description);
g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords);
G_OBJECT_CLASS(shell_app_parent_class)->finalize (object);
}
@ -1481,8 +1520,7 @@ shell_app_class_init(ShellAppClass *klass)
SHELL_TYPE_APP,
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
/**

View File

@ -320,8 +320,7 @@ shell_doc_system_class_init(ShellDocSystemClass *klass)
SHELL_TYPE_DOC_SYSTEM,
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[DELETED] =
@ -329,8 +328,7 @@ shell_doc_system_class_init(ShellDocSystemClass *klass)
SHELL_TYPE_DOC_SYSTEM,
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__BOXED,
NULL, NULL, NULL,
G_TYPE_NONE, 1, GTK_TYPE_RECENT_INFO);
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_SIGNAL_RUN_LAST,
0,
NULL, NULL,
gi_cclosure_marshal_generic,
NULL, NULL, NULL,
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_SIGNAL_RUN_LAST,
0,
NULL, NULL,
gi_cclosure_marshal_generic,
NULL, NULL, NULL,
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_SIGNAL_RUN_LAST,
0,
NULL, NULL,
gi_cclosure_marshal_generic,
NULL, NULL, NULL,
G_TYPE_NONE, 2, CLUTTER_TYPE_ACTOR_BOX, CLUTTER_TYPE_ALLOCATION_FLAGS);
g_type_class_add_private (gobject_class, sizeof (ShellGenericContainerPrivate));

View File

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

View File

@ -25,6 +25,7 @@
#include <girepository.h>
#include <meta/display.h>
#include <meta/util.h>
#include <meta/meta-shaped-texture.h>
/* Memory report bits */
#ifdef HAVE_MALLINFO
@ -34,8 +35,8 @@
#include "shell-enum-types.h"
#include "shell-global-private.h"
#include "shell-jsapi-compat-private.h"
#include "shell-marshal.h"
#include "shell-perf-log.h"
#include "shell-screen-grabber.h"
#include "shell-window-tracker.h"
#include "shell-wm.h"
#include "st.h"
@ -311,8 +312,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_shell_marshal_VOID__INT_INT,
NULL, NULL, NULL,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
/* 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_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
/* 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_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
shell_global_signals[NOTIFY_ERROR] =
@ -340,8 +338,7 @@ shell_global_class_init (ShellGlobalClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
gi_cclosure_marshal_generic,
NULL, NULL, NULL,
G_TYPE_NONE, 2,
G_TYPE_STRING,
G_TYPE_STRING);
@ -1180,70 +1177,6 @@ shell_global_destroy_pointer_barrier (ShellGlobal *global, guint32 barrier)
#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.
*
* Authors: Padraig O'Briain, Matthias Clasen, Lennart Poettering
@ -1965,25 +1898,67 @@ shell_global_launch_calendar_server (ShellGlobal *global)
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
grab_screenshot (ClutterActor *stage,
_screenshot_data *screenshot_data)
{
MetaScreen *screen = shell_global_get_screen (screenshot_data->global);
cairo_status_t status;
cairo_surface_t *image;
guchar *data;
int width, height;
GSimpleAsyncResult *result;
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();
cogl_read_pixels (0, 0, width, height, COGL_READ_PIXELS_COLOR_BUFFER, CLUTTER_CAIRO_FORMAT_ARGB32, data);
cairo_surface_mark_dirty (image);
do_grab_screenshot (screenshot_data, 0, 0, width, height);
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_destroy (screen_region);
cr = cairo_create (image);
cr = cairo_create (screenshot_data->image);
for (i = 0; i < cairo_region_num_rectangles (stage_region); i++)
{
@ -2023,41 +1998,34 @@ grab_screenshot (ClutterActor *stage,
cairo_region_destroy (stage_region);
}
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);
screenshot_data->screenshot_area.x = 0;
screenshot_data->screenshot_area.y = 0;
screenshot_data->screenshot_area.width = width;
screenshot_data->screenshot_area.height = height;
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
grab_area_screenshot (ClutterActor *stage,
_screenshot_data *screenshot_data)
{
cairo_status_t status;
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);
GSimpleAsyncResult *result;
cogl_flush();
cogl_read_pixels (screenshot_data->x, screenshot_data->y, screenshot_data->width, screenshot_data->height,
COGL_READ_PIXELS_COLOR_BUFFER, CLUTTER_CAIRO_FORMAT_ARGB32, data);
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);
do_grab_screenshot (screenshot_data,
screenshot_data->screenshot_area.x,
screenshot_data->screenshot_area.y,
screenshot_data->screenshot_area.width,
screenshot_data->screenshot_area.height);
g_signal_handlers_disconnect_by_func (stage, (void *)grab_area_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_area_screenshot);
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
shell_global_screenshot (ShellGlobal *global,
const char *filename,
ShellGlobalScreenshotCallback callback)
const char *filename,
ShellGlobalScreenshotCallback callback)
{
ClutterActor *stage;
_screenshot_data *data = g_new0 (_screenshot_data, 1);
@ -2119,10 +2087,10 @@ shell_global_screenshot_area (ShellGlobal *global,
data->global = global;
data->filename = g_strdup (filename);
data->x = x;
data->y = y;
data->width = width;
data->height = height;
data->screenshot_area.x = x;
data->screenshot_area.y = y;
data->screenshot_area.width = width;
data->screenshot_area.height = height;
data->callback = callback;
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
*
* @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)
* in @filename as png image.
*
* Return value: success or failure.
*/
gboolean
void
shell_global_screenshot_window (ShellGlobal *global,
gboolean include_frame,
const char *filename)
const char *filename,
ShellGlobalScreenshotCallback callback)
{
CoglHandle texture;
cairo_surface_t *image;
guchar *data;
GSimpleAsyncResult *result;
_screenshot_data *screenshot_data = g_new0 (_screenshot_data, 1);
MetaScreen *screen = meta_plugin_get_screen (global->plugin);
MetaDisplay *display = meta_screen_get_display (screen);
MetaWindow *window = meta_display_get_focus_window (display);
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));
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);
texture = cogl_texture_new_from_sub_texture (texture,
window_rect->x,
window_rect->y,
window_rect->width,
window_rect->height);
meta_window_get_outer_rect (window, &rect);
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
window_rect->width,
window_rect->height);
screenshot_data->screenshot_area.x = rect.x;
screenshot_data->screenshot_area.y = rect.y;
clip.x = rect.x - (gint) actor_x;
clip.y = rect.y - (gint) actor_y;
}
else
image = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
clutter_actor_get_width (window_actor),
clutter_actor_get_height (window_actor));
{
rect = *meta_window_get_rect (window);
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);
status = cairo_surface_write_to_png (image, filename);
cairo_surface_destroy (image);
stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor)));
screenshot_data->image = meta_shaped_texture_get_image (stex, &clip);
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 */
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);
GAppLaunchContext *
@ -146,7 +140,9 @@ void shell_global_reexec_self (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,
int x,
@ -156,9 +152,10 @@ void shell_global_screenshot_area (ShellGlobal *global,
const char *filename,
ShellGlobalScreenshotCallback callback);
gboolean shell_global_screenshot_window (ShellGlobal *global,
void shell_global_screenshot_window (ShellGlobal *global,
gboolean include_frame,
const char *filename);
const char *filename,
ShellGlobalScreenshotCallback callback);
void shell_global_screenshot (ShellGlobal *global,
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_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
0, NULL, NULL, NULL,
G_TYPE_NONE, 0);
g_type_class_add_private (klass, sizeof (ShellMountOperationPrivate));

View File

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

View File

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

View File

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

View File

@ -12,6 +12,7 @@
#include "shell-recorder-src.h"
#include "shell-recorder.h"
#include "shell-screen-grabber.h"
#include <clutter/x11/clutter-x11.h>
#include <X11/extensions/Xfixes.h>
@ -47,6 +48,8 @@ struct _ShellRecorder {
int stage_width;
int stage_height;
ShellScreenGrabber *grabber;
gboolean have_pointer;
int pointer_x;
int pointer_y;
@ -74,6 +77,7 @@ struct _ShellRecorder {
GSList *pipelines; /* all pipelines */
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 */
/* GSource IDs for different timeouts and idles */
@ -114,14 +118,12 @@ enum {
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
/* The number of frames per second we configure for the GStreamer pipeline.
* (the number of frames we actually write into the GStreamer pipeline is
* based entirely on how fast clutter is drawing.) Using 60fps seems high
* but the observed smoothness is a lot better than for 30fps when encoding
* as theora for a minimal size increase. This may be an artifact of the
* encoding process.
/* The default value of the target frame rate; we'll never record more
* than this many frames per second, though we may record less if the
* screen isn't being redrawn. 30 is a compromise between smoothness
* and the size of the recording.
*/
#define DEFAULT_FRAMES_PER_SECOND 15
#define DEFAULT_FRAMES_PER_SECOND 30
/* The time (in milliseconds) between querying the server for the cursor
* 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
* 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
*/
@ -265,6 +267,8 @@ shell_recorder_init (ShellRecorder *recorder)
recorder->recording_icon = create_recording_icon ();
recorder->memory_target = get_memory_target();
recorder->grabber = shell_screen_grabber_new ();
recorder->state = RECORDER_STATE_CLOSED;
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
}
@ -296,6 +300,8 @@ shell_recorder_finalize (GObject *object)
recorder_set_pipeline (recorder, NULL);
recorder_set_filename (recorder, NULL);
g_object_unref (recorder->grabber);
cogl_handle_unref (recorder->recording_icon);
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
@ -518,21 +524,35 @@ recorder_record_frame (ShellRecorder *recorder)
GstBuffer *buffer;
guint8 *data;
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;
data = g_malloc (size);
data = shell_screen_grabber_grab (recorder->grabber,
0, 0, recorder->stage_width, recorder->stage_height);
buffer = gst_buffer_new();
GST_BUFFER_SIZE(buffer) = size;
GST_BUFFER_MALLOCDATA(buffer) = GST_BUFFER_DATA(buffer) = data;
GST_BUFFER_TIMESTAMP(buffer) = get_wall_time() - recorder->start_time;
cogl_read_pixels (0, 0,
recorder->stage_width, recorder->stage_height,
COGL_READ_PIXELS_COLOR_BUFFER,
CLUTTER_CAIRO_FORMAT_ARGB32,
data);
GST_BUFFER_TIMESTAMP(buffer) = now - recorder->start_time;
recorder_draw_cursor (recorder, buffer);
@ -1558,9 +1578,15 @@ shell_recorder_new (ClutterStage *stage)
* @recorder: the #ShellRecorder
* @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
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
* 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
shell_recorder_set_pipeline (ShellRecorder *recorder,
@ -1662,6 +1688,7 @@ shell_recorder_record (ShellRecorder *recorder)
* pause
*/
recorder->start_time = recorder->start_time + (get_wall_time() - recorder->pause_time);
recorder->last_frame_time = 0;
}
else
{
@ -1669,6 +1696,7 @@ shell_recorder_record (ShellRecorder *recorder)
return FALSE;
recorder->start_time = get_wall_time();
recorder->last_frame_time = 0;
}
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_added),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
NULL, NULL, NULL,
G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR);
shell_tray_manager_signals[TRAY_ICON_REMOVED] =
@ -166,8 +165,7 @@ shell_tray_manager_class_init (ShellTrayManagerClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (ShellTrayManagerClass, tray_icon_removed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
NULL, NULL, NULL,
G_TYPE_NONE, 1,
CLUTTER_TYPE_ACTOR);

View File

@ -678,18 +678,6 @@ shell_get_file_contents_utf8_sync (const char *path,
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:
* @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,
GError **error);
void shell_breakpoint (void);
gboolean shell_parse_search_provider (const char *data,
char **name,
char **url,

View File

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

View File

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

View File

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

View File

@ -34,7 +34,6 @@
#include <clutter/clutter.h>
#include "st-adjustment.h"
#include "st-marshal.h"
#include "st-private.h"
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StAdjustmentClass, changed),
NULL, NULL,
_st_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

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

View File

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

View File

@ -62,7 +62,6 @@
#include "st-icon.h"
#include "st-widget.h"
#include "st-texture-cache.h"
#include "st-marshal.h"
#include "st-clipboard.h"
#include "st-private.h"
@ -548,38 +547,6 @@ st_entry_pick (ClutterActor *actor,
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
st_entry_clipboard_callback (StClipboard *clipboard,
const gchar *text,
@ -695,8 +662,6 @@ st_entry_class_init (StEntryClass *klass)
actor_class->allocate = st_entry_allocate;
actor_class->paint = st_entry_paint;
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_focus_in = st_entry_key_focus_in;
@ -735,8 +700,7 @@ st_entry_class_init (StEntryClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StEntryClass, primary_icon_clicked),
NULL, NULL,
_st_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
/**
* StEntry::secondary-icon-clicked:
@ -748,8 +712,7 @@ st_entry_class_init (StEntryClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StEntryClass, secondary_icon_clicked),
NULL, NULL,
_st_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

@ -88,12 +88,15 @@ st_im_text_dispose (GObject *object)
{
StIMTextPrivate *priv = ST_IM_TEXT (object)->priv;
g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_commit_cb,
object);
if (priv->im_context != NULL)
{
g_signal_handlers_disconnect_by_func (priv->im_context,
(void *) st_im_text_commit_cb,
object);
g_object_unref (priv->im_context);
priv->im_context = NULL;
g_object_unref (priv->im_context);
priv->im_context = NULL;
}
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);
}
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
st_label_class_init (StLabelClass *klass)
{
@ -291,8 +271,6 @@ st_label_class_init (StLabelClass *klass)
actor_class->allocate = st_label_allocate;
actor_class->get_preferred_width = st_label_get_preferred_width;
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->get_accessible_type = st_label_accessible_get_type;
@ -481,12 +459,24 @@ st_label_accessible_init (StLabelAccessible *self)
/* 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
st_label_accessible_initialize (AtkObject *obj,
gpointer 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;
}

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-bin.h"
#include "st-marshal.h"
#include "st-enum-types.h"
#include "st-private.h"
#include "st-button.h"
@ -243,36 +242,12 @@ st_scroll_bar_pick (ClutterActor *actor,
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
st_scroll_bar_unmap (ClutterActor *actor)
{
StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
CLUTTER_ACTOR_CLASS (st_scroll_bar_parent_class)->unmap (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
@ -688,7 +663,6 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
actor_class->paint = st_scroll_bar_paint;
actor_class->pick = st_scroll_bar_pick;
actor_class->scroll_event = st_scroll_bar_scroll_event;
actor_class->map = st_scroll_bar_map;
actor_class->unmap = st_scroll_bar_unmap;
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StScrollBarClass, scroll_start),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[SCROLL_STOP] =
@ -723,8 +696,7 @@ st_scroll_bar_class_init (StScrollBarClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StScrollBarClass, scroll_stop),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

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

View File

@ -41,7 +41,6 @@
#include <clutter/clutter.h>
#include "st-enum-types.h"
#include "st-marshal.h"
#include "st-private.h"
#include "st-table-child.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_SIGNAL_RUN_LAST,
0, /* no default handler slot */
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

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

View File

@ -469,12 +469,12 @@ get_background_position (StThemeNode *self,
gdouble scale_w, scale_h;
/* get the background image size */
background_image_width = allocation->x2 - allocation->x1;
background_image_height = allocation->y2 - allocation->y1;
background_image_width = cogl_texture_get_width (self->background_texture);
background_image_height = cogl_texture_get_height (self->background_texture);
/* get the painting area size */
painting_area_width = cogl_texture_get_width (self->background_texture);
painting_area_height = cogl_texture_get_height (self->background_texture);
painting_area_width = allocation->x2 - allocation->x1;
painting_area_height = allocation->y2 - allocation->y1;
/* scale if requested */
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);
if (background_image != NULL && !has_border && !has_border_radius)
{
CoglHandle texture;
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_texture = st_texture_cache_load_file_to_cogl_texture (texture_cache, background_image);
node->background_material = _st_create_texture_material (node->background_texture);
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_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StThemeNodeTransitionClass, completed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[NEW_FRAME] =
@ -463,7 +462,6 @@ st_theme_node_transition_class_init (StThemeNodeTransitionClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StThemeNodeTransitionClass, new_frame),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}

View File

@ -35,7 +35,6 @@
#include "st-widget.h"
#include "st-label.h"
#include "st-marshal.h"
#include "st-private.h"
#include "st-texture-cache.h"
#include "st-theme-context.h"
@ -995,8 +994,7 @@ st_widget_class_init (StWidgetClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StWidgetClass, style_changed),
NULL, NULL,
_st_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
/**
@ -1011,8 +1009,7 @@ st_widget_class_init (StWidgetClass *klass)
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StWidgetClass, popup_menu),
NULL, NULL,
_st_marshal_VOID__VOID,
NULL, NULL, NULL,
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
* @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
#include <gtk/gtk.h>
#include "na-marshal.h"
/* Signals */
enum
{
@ -143,8 +141,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_added),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
NULL, NULL, NULL,
G_TYPE_NONE, 1,
GTK_TYPE_SOCKET);
@ -153,8 +150,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, tray_icon_removed),
NULL, NULL,
g_cclosure_marshal_VOID__OBJECT,
NULL, NULL, NULL,
G_TYPE_NONE, 1,
GTK_TYPE_SOCKET);
manager_signals[MESSAGE_SENT] =
@ -162,8 +158,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, message_sent),
NULL, NULL,
_na_marshal_VOID__OBJECT_STRING_LONG_LONG,
NULL, NULL, NULL,
G_TYPE_NONE, 4,
GTK_TYPE_SOCKET,
G_TYPE_STRING,
@ -174,8 +169,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, message_cancelled),
NULL, NULL,
_na_marshal_VOID__OBJECT_LONG,
NULL, NULL, NULL,
G_TYPE_NONE, 2,
GTK_TYPE_SOCKET,
G_TYPE_LONG);
@ -184,8 +178,7 @@ na_tray_manager_class_init (NaTrayManagerClass *klass)
G_OBJECT_CLASS_TYPE (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (NaTrayManagerClass, lost_selection),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
#if defined (GDK_WINDOWING_X11)