Compare commits

...

102 Commits

Author SHA1 Message Date
d2052a885e NetworkMenu: use async initialization for libnm-glib objects
NMClient recently got more heavyweight, with a property holding supported
connections. As fully initializing a NMObject is a recursive operation
and requires multiple DBus calls, switch to async initalization for NMClient
and NMRemoteSettings.

https://bugzilla.gnome.org/show_bug.cgi?id=683288
2012-11-02 14:11:10 +01:00
afcc1b7b52 Try to do more async initialization
Synchronous calls in the main loop are a performance killer, especially
at login.
2012-11-02 14:11:10 +01:00
a6b4d68a1d Port to GDBus 2
The GDBus bindings in gjs have been updated to leverage metaclasses
and gobject inheritance, which should result in cleaner and more
maintainable code.
2012-11-02 14:11:10 +01:00
aef9b733e5 loginDialog: drop spurious parameter
_onNotListed had an unusued, incorrect parameter.

This commit drops it.

https://bugzilla.gnome.org/show_bug.cgi?id=660660
2012-11-01 14:24:45 -04:00
348208617b Use the correct icon in the restart dialog
It currently uses system-shutdown-symbolic. view-refresh-symbolic
is a better fit in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=670687
2012-11-01 16:21:52 +00:00
2c34c8e20f Overview search box is too subtle
When it isn't focused, the search box can be quite hard to see.

The text/icon/border color is changed to be brighter in order to increase
contrast with the dark background and this works well with various
wallpapers.

https://bugzilla.gnome.org/show_bug.cgi?id=686479
2012-11-01 11:32:40 +00:00
d19fa731d6 Updated Polish translation 2012-10-31 19:15:34 +01:00
59bb1cc387 Add a setting to force the 'Log out' menuitem
I've heard quite a bit of feedback from people who want to log out,
even if they are the sole user on their system. It doesn't seem worth
alienating them over this; so add a setting to make the 'Log out' item
always show up.
https://bugzilla.gnome.org/show_bug.cgi?id=686057
2012-10-31 12:46:49 -04:00
56909d0646 Show 'Log out' in more situations
When the current user is a remote account, or a we are logged in
as root, we should always show 'Log out'.

https://bugzilla.gnome.org/show_bug.cgi?id=686736
2012-10-31 12:45:08 -04:00
04da29c939 appMenu: Update on icon theme changes
While we recreate icons on style changes elsewhere, the faded
icon in the application menu will stick around after icon theme
changes until another application is focused.

https://bugzilla.gnome.org/show_bug.cgi?id=687224
2012-10-31 00:06:46 +01:00
307f7a3024 IM status menu: adjust the combo popup background
The transparent background for available/unavailable IM status menu
makes the text difficult to read.

Simplifies that by using the default combo-popup background instead of a
custom one.

https://bugzilla.gnome.org/show_bug.cgi?id=658091
2012-10-30 22:51:50 +00:00
e80bfa39f5 userMenu: Use "offline" instead of "unavailable"
https://bugzilla.gnome.org/show_bug.cgi?id=687226
2012-10-30 23:01:22 +01:00
29714922ea calendar: Drop unnecessary libedataserverui dependency
The libedataserverui dependency is a relic of the old E-D-S API.
As of 3.6.0, E-D-S now centralizes authentication prompts so clients
don't have to display their own.  This also allows trading the GTK+
main loop for a plain GMainLoop in gnome-shell-calendar-server.c.

https://bugzilla.gnome.org/show_bug.cgi?id=687189
2012-10-30 14:18:39 -04:00
88192114ac NetworkAgent: cancel requests when disabling component
When the NetworkAgent is disabled (for example because the lock screen
is being activated), cancel all modal dialogs.

https://bugzilla.gnome.org/show_bug.cgi?id=685239
2012-10-30 16:34:13 +01:00
9d78208b76 NetworkMenu: don't use a global switch for all VPN connections
Stop pretending that VPN is a NMDevice, and split the useful bits into
a NMConnectionBased interface.
Make each connection have its own switch menu item and handle its own
status, and remove the VPN section title, which is no longer needed.

https://bugzilla.gnome.org/show_bug.cgi?id=682929
2012-10-30 16:08:33 +01:00
d817bf0395 theme: standardize the run dialog text styles a bit
Use the standard color for dialog headings, and use the standard
text style for the entry field. These tweaks make the dialog easier
to read.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
4d51056226 runDialog: Remove "Run" button again
While not in the mockups, it was introduced during review of commit
0c807bddaf after discussion on IRC, but the designers disagree;
remove it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
a607174a25 runDialog: Add entry to focus chain
Currently the entry takes the intial key focus, but is not actually
part of the focus chain. Fix that, even though keynav does not work
too well for the dialog anyway, due to the entry consuming tab for
command completion.

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-30 15:50:05 +01:00
37d6a624b7 Improve the button insensitive style
The current insensitive style for buttons needs to be improved. Right
now we just change the text color: this doesn't make it clear that the
button is actually insensitive.

Instead of just changing the text color, we make the button background
almost transparent. We also make the text color the same as the border
color, use a thinner border.

This patch also simplifies some border rule overwrites to emphasis
only the border width is changed on focus, and makes the button look
closer to the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=687110
2012-10-30 12:35:48 +00:00
0c807bddaf runDialog: Better match style of other modal dialogs
Update the run dialog to
 - use a proper title
 - use dialog buttons
 - use the standard entry style

https://bugzilla.gnome.org/show_bug.cgi?id=687127
2012-10-29 19:12:12 +01:00
a0470bfc66 UnlockDialog: clear the password on failure
It is wrong, and the user can't correct it because it's obfuscated.
Just let him type it again.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
b9463d23e8 ShellUserVerifier: fix fail counter
If it is updated after checking, it counts the number of failures
not including the current one, so it allows one extra attempt. Instead,
by updating it before checking, we get the expected result of dropping the
curtain at the third password.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:12 +01:00
04debd1623 LoginDialog: clear previous auth failed messages when trying again
When the user has the entered the password for the second time
and clicked OK, clear messages from the previous attempt, so any
new failure is shown clearly.

https://bugzilla.gnome.org/show_bug.cgi?id=687132
2012-10-29 17:54:11 +01:00
9d31576cf5 App search: Match GenericName too
This is making shell search results more useful in many cases,
such as 'web', 'browser', spreadsheet'.
https://bugzilla.gnome.org/show_bug.cgi?id=687121
2012-10-29 11:24:36 -04:00
8daca28a90 Updated Slovak translation 2012-10-28 19:50:05 +00:00
9899604261 Updated Slovak translation 2012-10-28 18:27:51 +00:00
687e1eabed Overview: Resize the window title labels on content change
Reposition the window overlay when the title changes, using the current
transformed size of the window clone.
Includes a test that changes title to a string of random length every 3 seconds.

Based on a patch by Alex Hultman <alexhultman@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=620874
2012-10-27 18:18:48 +02:00
eb09f34114 recorder: save recorded video as recent item
Often the first thing a user wants to do after making a recording
is post it somewhere.

This commit adds the video to recently used items, so that it shows
up prominently in open file choosers.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
fbeb446ed7 recorder: rename "filename" property to "file-template"
The filename property is actually a template string with
substitution variables, not a filename.

This commit renames for clarity.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
92033ce0f5 recorder: keep test-recorder alive until done recording
Recording continues for some time after the recorder object
is closed, since closing isn't a synchronous operation.

This commit defers quiting the test-recorder application until
the recording is finished.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
9171bab5e5 recorder: keep recorder object alive until pipeline finishes
We want to make sure the recorder isn't finalized until the
saved recording hits disk.  This means the pipeline object needs
a hard reference on the recorder.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
f9819eb7b0 recorder: Clean up stage lifetime handling
The stage is a floating object. We don't own a reference
to it, so we shouldn't unref it.

This commit removes the erroneous unref call and makes sure
we call clutter_actor_destroy on the stage when we're done
with it.

https://bugzilla.gnome.org/show_bug.cgi?id=680647
2012-10-26 13:29:30 -04:00
85728f0d15 layout: Use a MetaBackgroundActor, not a custom ClutterX11TexturePixmap
While looking at how the plymouth implementation was built, I was so
short-sighted and focused on the string "_XROOTPMAP_ID" that I didn't
realize it was the name of the standard background on the root window.
Remove our own implementation, and switch to using a standard mutter
MetaBackgroundActor.

https://bugzilla.gnome.org/show_bug.cgi?id=682428
2012-10-26 11:54:25 -04:00
9396849d56 message-tray: Restore Fittsability of summary items
The reactive area of tray items should extend to the screen edge. This
regressed when implementing the new tray design, make it work again.

https://bugzilla.gnome.org/show_bug.cgi?id=686474
2012-10-26 16:32:07 +02:00
6f5e5672bb panelMenu: Fix exception when destroying menuless button
There's explicit API to create PanelMenu.Buttons with no menu, so
guard against this case in destroy().

https://bugzilla.gnome.org/show_bug.cgi?id=686763
2012-10-26 15:49:26 +02:00
b936e60876 screenShield: Tweak curtain animation timings
Rationale:
 - Getting something out of the way should be quick;

 - Very few things in the real world move linearly so, linear
   animations, especially for something as big and visible as this,
   felt too artificial;

 - Moving the curtain out should start slower to make it feel like
   having weight (it fills the whole screen after all) but quickly
   accelerate towards the end to make it snappy too.

https://bugzilla.gnome.org/show_bug.cgi?id=686745
2012-10-26 12:56:17 +02:00
fa4bd91213 build: Stop linking gnome-desktop
Since commit 80eac7370e removed the last build-time dependency ages
ago, we only use GnomeDesktop via introspection.
2012-10-26 12:37:33 +02:00
81eeef7d3c messageTray: Hide summary notification immediately when closing the tray
When the summary notification is open when the tray is closed, we end
up with two concurrent animations: the notification fading out, and the
tray moving away from underneath it. Sliding out the tray should be the
primary transition here, so hide the notification immediately to not
draw the user's attention away from it.

https://bugzilla.gnome.org/show_bug.cgi?id=686888
2012-10-25 22:45:36 +02:00
a7b5134820 messageTray: Hide notification close button immediately on click
Having the close button move away from under the pointer after
clicking it is confusing and distracts from the main transition,
which is hiding the notification. Just hide it immediately.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
92a01c67ba messageTray: Don't destroy the notification when clicking on the close button
Clicking on the close button should simply hide the notification.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:32 +02:00
71c23613b5 messageTray: Only hide the notification stack on clicking close
Rather than destroying the entire source, which is unintuitive, simply
close the notification. Removing the entire source is still possible
by right-clicking on the summary item and choosing "Remove".

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 22:41:05 +02:00
4f876995de messageTray: make SummaryItem._closeButton public
Use this to show/hide the close button instead of closeButtonVisible.

https://bugzilla.gnome.org/show_bug.cgi?id=682237
2012-10-25 21:45:18 +02:00
9cf4a76196 po: Enforce RTL in fa/ug for messages that might end up as LTR
See commit 8b796d80a7.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-25 20:12:25 +02:00
9efe5287e4 gdm: Move logo into the panel
GDM has a 'logo' key in its schema to allow distributors to add
some branding. It is currently placed above the user list, which
no longer works too well since the login screen lost its dialog
window. Display the logo in the top-left corner instead of the
Activities button instead.

https://bugzilla.gnome.org/show_bug.cgi?id=685852
2012-10-25 18:31:16 +02:00
8c4b34de4e messageTray: Fix close button position in RTL locales 2012-10-25 18:31:16 +02:00
93e3559dc3 style: Adjust close button overlap
After changing the button size, we need to adjust the x-offset by
1px (apparently the y-offset already assumed the correct size).
2012-10-25 18:31:16 +02:00
caa0f63e1f style: Fix close button size
The image is actually 32px, so we end up with a slightly fuzzy
button when scaling up to 34px. Don't do that.

Spotted by lamefun.xOr<at>gmail.com

https://bugzilla.gnome.org/show_bug.cgi?id=686574
2012-10-25 18:27:59 +02:00
a4e29e1244 calendar: Handle calendar-server errors
The current code assumes that the GetEvents call will always
receive, causing an exception in the error case.

https://bugzilla.gnome.org/show_bug.cgi?id=686805
2012-10-24 18:26:03 +02:00
599f2f43e3 Revert "screenShield: Connect to the actor's show signal instead of using BEFORE_REDRAW"
This reverts commit bdeb7d86b6.

git bz PEBKAC
2012-10-24 10:17:43 -04:00
3a453c5f73 messageTray: Fix lightbox
Commit 448517032e accidentally reverted the condition for showing
the lightbox. Fix that.

https://bugzilla.gnome.org/show_bug.cgi?id=686728
2012-10-24 09:03:12 +02:00
98b313c75f popupMenu: Overwrite ongoing animations when calling close repeatedly
Currently close() is a no-op when the menu has already been closed.
However, repeated calls could pass different animation parameters.
For instance in the user menu, we try to hide the menu immediately
before locking the screen, to avoid the popup jumping across the
screen while fading out - as we do this from the corresponding
item's activate handler, the closing is still animated if the menu's
own handler (which requests a full animation) is run first.
Fix this by changing close() to overwrite ongoing animations before
bailing out early.

https://bugzilla.gnome.org/show_bug.cgi?id=686484
2012-10-23 22:21:45 +02:00
8b796d80a7 po: Enforce RTL in he for messages that might end up as LTR
As the messages start with a string placeholder that might be
untranslated, we need an explicit mark to ensure that the string
does not end up as LTR.

https://bugzilla.gnome.org/show_bug.cgi?id=686630
2012-10-23 22:21:45 +02:00
719a8908a6 Release 3.7.1
Update NEWS
2012-10-23 21:14:10 +02:00
fed007ecae userMenu: Use LoginManager for suspend
https://bugzilla.gnome.org/show_bug.cgi?id=686482
2012-10-23 21:14:10 +02:00
990443465f powerMenu: Use LoginManager for suspend
https://bugzilla.gnome.org/show_bug.cgi?id=686482
2012-10-23 21:14:10 +02:00
1f183b8a4e loginManager: Add support for suspend()
Logind provides a Suspend method, which we should use instead of
the UPower API when available. Expose this in loginManager, using
the UPower API for the ConsoleKit implementation.

https://bugzilla.gnome.org/show_bug.cgi?id=686482
2012-10-23 21:14:10 +02:00
96556eb959 workspacesView: Add some more spacing between window and workspace thumbs
https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-10-23 15:12:45 -04:00
3ffeeac577 overview: Reduce space between window picker and dash
Do this in a hacky way by hardcoding this, for now. When we land
search rework, we can fix this.

https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-10-23 15:12:45 -04:00
d7929a2340 workspacesView: Don't conform to aspect ratio
We want the window picker to use the full height of the area it's given.

https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-10-23 15:12:45 -04:00
667019a8c1 workspace: Don't relayout windows when zooming workspace thumbnails
It looks ugly and busy to have windows shuffle around when I just wanted
to look at my workspaces.

https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-10-23 15:12:45 -04:00
d9b46b4782 workspace: Use all available space for windows in window selector
Change the layout strategy to be more like the mockups. With less than
two rows of windows, we try to fit every window in a non-aligned situation;
with more than three rows of windows, we try to fit every window in an
aligned situation.

Based heavily on a patch from Pierre-Eric Pelloux-Prayer <pelloux@gmail.com>

https://bugzilla.gnome.org/show_bug.cgi?id=582650
2012-10-23 15:12:45 -04:00
e249218a9d Allow testing GDM login dialog from the session
Check an environment variable, GDM_GREETER_TEST. If 1, LoginDialog will
skip anything that fails outside a GDM session.
It is therefore possible to test the GDM greeter without installing it
system-wide, by attempting login as the already logged in user (uses the
same code path as the unlock dialog).

https://bugzilla.gnome.org/show_bug.cgi?id=683725
2012-10-23 19:09:00 +02:00
a2b1946b01 workspacesView: Fix updating when number of workspaces changes
Ouch. This went unnoticed for a long time as by default (using
dynamic workspaces) only one workspace is added at a time, which
happens to work fine.

https://bugzilla.gnome.org/show_bug.cgi?id=686487
2012-10-23 18:27:07 +02:00
96a80f7ba0 workspacesView: Fix typo
We want to check for a setting, not the existence of a function.

https://bugzilla.gnome.org/show_bug.cgi?id=686487
2012-10-23 18:27:07 +02:00
9955fbf4f8 Updated Greek translation 2012-10-23 15:41:32 +03:00
14966b0cd0 Telepathy: Set empathy-chat as prefered handler when delegating channels
https://bugzilla.gnome.org/show_bug.cgi?id=686296
2012-10-23 12:37:05 +02:00
6e1a8f16a8 build: Bump gnome-desktop required version for GnomeIdleMonitor 2012-10-23 09:19:03 +02:00
d106191e6a Port to GnomeIdleMonitor
https://bugzilla.gnome.org/show_bug.cgi?id=682224
2012-10-22 12:06:45 -04:00
418cf6281e screenShield: explicitly load gnome-screensaver in fallback mode.
When running gnome-shell from lightDM, gnome-screensaver is no
longer auto-loaded. As a result the dbus calls for Lock user etc
will fail.

https://bugzilla.gnome.org/show_bug.cgi?id=683060
Bug-Ubuntu: https://launchpad.net/bugs/1064354
2012-10-22 11:21:18 -04:00
bdeb7d86b6 screenShield: Connect to the actor's show signal instead of using BEFORE_REDRAW
This should make sure that we grab at the right time while at the same time
not break focus handling.

https://bugzilla.gnome.org/show_bug.cgi?id=684650
2012-10-22 11:20:30 -04:00
a0e0cc1038 workspacesView: Simplify extraWorkspaces handling
https://bugzilla.gnome.org/show_bug.cgi?id=686002
2012-10-21 18:53:48 -04:00
78f6dec73b workspacesView: Don't show workspace switcher when it doesn't make sense
Hide workspace switcher if dynamic workspaces is disabled and number of
workspaces is set to one only, since the user is bound to only one workspace
and showing the switcher is redundant.

Signed-off-by: Seif Lotfy <seif@lotfy.com>
2012-10-20 01:39:52 +02:00
f6458f215f userMenu: Hide menu immediately before suspending
The same logic as for commit 1f30670c1d applies to the case
where we lock the screen before suspending - we don't want the
menu to jump to the opposite screen side to fade out, so remove
the animation altogether.

https://bugzilla.gnome.org/show_bug.cgi?id=686484
2012-10-19 19:09:41 +02:00
c7e0d547c4 Add missing translations for GSetting schema
These are showing in the UI of gnome-tweak-tool.

https://bugzilla.gnome.org/show_bug.cgi?id=686413
2012-10-18 22:58:51 +02:00
fa54cfa0c3 Updated slovak translation 2012-10-18 20:41:36 +02:00
31ea3f737c messageTray: Remove hack for the lack of negative units in libcroco
libcroco now has native support for negative units.

https://bugzilla.gnome.org/show_bug.cgi?id=686240
2012-10-18 12:50:49 -04:00
2a8a8065a8 ScreenShield: implement o.g.ScreenSaver.GetActiveTime
Part of the old gnome-screensaver interface, returns the number of seconds
that the screensaver has been active for.

https://bugzilla.gnome.org/show_bug.cgi?id=686064
2012-10-18 15:30:40 +02:00
d3ba002313 st: Remove unused methods
This reverts commits cd024e21f0 and dc9ad8df80.

https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:25:56 +02:00
f18fd8d959 userMenu: Rely on automatic texture changes
This reverts commit 6f3cf0ae50.

https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:25:56 +02:00
d54f7b13fb st-widget: Keep background-image and border-image updated
Currently we miss changes to a file referenced in background-image
or border-image.
Connect to the StTextureCache::texture-file-changed signal to keep
up with file changes and update the drawing state if necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:25:56 +02:00
9c8b75206c st-texture-cache: Add texture-file-changed signal
For textures loaded from files, the cache might hide image changes
by keeping the data of a previous version around indefinitely. For
instance AccountsService will notify of avatar changes, but as new
image is copied over the old one, we will continue to use the old
image data.
Install a file monitor for each file resource we load and clear
the corresponding data from the cache on changes, emitting the
new StTextureCache::texture-file-changed signal.

https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:25:56 +02:00
15273c7f22 st: Canonicalize URLs in stylesheets
Make _st_theme_resolve_url() a bit smarter by canonicalizing the
resulting path (e.g. resolving references to /./ and /../).

https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:25:56 +02:00
0ea8217c55 st: Fix handling of file:// URIs in _st_theme_resolve_uri()
https://bugzilla.gnome.org/show_bug.cgi?id=679268
2012-10-17 23:03:07 +02:00
1735f28f5a Remove use of deprecated g_type_init () ...
... and bump GObject requirement accordingly.

https://bugzilla.gnome.org/show_bug.cgi?id=686318
2012-10-17 22:49:32 +02:00
8de4070f7f autorunManager: Stop erring on the side of caution for network mounts
Every mount that we care about that's local should have a GVolume
associated with it.

https://bugzilla.gnome.org/show_bug.cgi?id=686241
2012-10-17 12:24:45 -04:00
45e64f453f runDialog: Use a symbolic icon
Another fallout from the St.IconType changes

https://bugzilla.gnome.org/show_bug.cgi?id=686233
2012-10-17 12:04:28 -04:00
62dc5f2ac6 Updated Serbian translation 2012-10-17 10:09:46 +02:00
86c85a752e loginScreen: Add support for 'disable-restart-buttons'
GDM's GSettings schema contains a 'disable-restart-buttons' key
that currently is only supported by the fallback greeter.
Implement support in the shell greeter as well.

https://bugzilla.gnome.org/show_bug.cgi?id=686247
2012-10-16 22:57:37 +02:00
3de0ebf7fd messageTray: Change timestamp string formats
The timestamps before contained unnecessary information.
Additionally, align the timestamps to be in the middle of the
bubble for design reasons.

https://bugzilla.gnome.org/show_bug.cgi?id=680989
2012-10-16 22:35:10 +02:00
1496ba0bbd messageTray: Clean up "TODO" code
The code here says to remove it after the GNOME3 release. Better late
than never.
2012-10-16 12:20:46 -04:00
f5974f6793 messageTray: Primarily use a GIcon to drive the source's icon
This is a bit of a cleanup since we ported notification icons/secondary
icons to be in the same situation.

https://bugzilla.gnome.org/show_bug.cgi?id=680426
2012-10-16 12:14:16 -04:00
928ea3bb01 messageTray: Use a GIcon for a notification's icon/secondary icon
Using a GIcon instead of an actor means that we can always create
a new icon with the right size from an old icon.

https://bugzilla.gnome.org/show_bug.cgi?id=680426
2012-10-16 12:14:16 -04:00
b7acb1d488 st-texture-cache: Remove load_icon_name
With the St.Icon bug fixed, we have removed the last use of load_icon_name.
Celebration time!
2012-10-16 11:01:25 -04:00
360d94dd67 modalDialog: Remove the fade in buttons code
Due to a typo, it never worked correctly. After a fix-up to the appropriate
method, the behavior is suboptimal, as the buttons only fade in the first time
the modal dialog is constructed. Just remove the fade-in behavior, rather than
keeping this non-working code around.

https://bugzilla.gnome.org/show_bug.cgi?id=677426
2012-10-16 10:49:20 -04:00
671a813135 Updated Japanese translation 2012-10-16 23:30:05 +09:00
c005417f9b Updated Galician translations 2012-10-16 14:22:21 +02:00
b5ec68bda3 Updated Spanish translation 2012-10-16 11:11:40 +02:00
b4ed29094d Updated Belarusian translation. 2012-10-16 12:05:56 +03:00
284ab031b8 Updated Slovenian translation 2012-10-16 08:34:57 +02:00
6ad5064c09 Updated Indonesian translation 2012-10-16 07:15:32 +07:00
3a8e723a36 data: Expose '<Super>F10' shortcut in System Settings
https://bugzilla.gnome.org/show_bug.cgi?id=672909
2012-10-16 01:38:12 +02:00
dd3484b93f dash: Open 'Show Apps' with Super+A
This is a workaround for power users for the "Show Apps" button
placement being too inconvenient to press at the bottom of the
dash favorites list.

Unity also uses Super+A to show the Apps lens.

https://bugzilla.gnome.org/show_bug.cgi?id=685738
2012-10-16 01:38:12 +02:00
83 changed files with 4487 additions and 3784 deletions

30
NEWS
View File

@ -1,3 +1,33 @@
3.7.1
=====
* Add shortcut to open application view directly [Jeremy; #685738]
* Expose '<Super>F10' shortcut in System Settings [Florian; #672909]
* Clean up timestamp format in chat notifications [Carlos; #680989]
* loginScreen: Add support for 'disable-restart-buttons' [Florian; #686247]
* Update textures automatically on file changes [Florian; #679268]
* Implement org.gnome.ScreenSaver.GetActiveTime [Giovanni; #686064]
* Add missing translations for GSetting schema [Giovanni; #686413]
* Hide workspace switcher completely when it's not necessary [Seif; #686483]
* Explicitly load gnome-screensaver when not running GDM [Tim; #683060]
* Port to GnomeIdleMonitor [Jasper; #682224]
* Set Empathy as preferred handler when delegating channels [Xavier; #686296]
* Allow testing GDM login dialog from the session [Giovanni; #683725]
* Use all available space for windows in window picker [Jasper, Pierre-Eric;
#582650]
* Use logind for suspend if available [Florian; #686482]
* Misc. fixes and cleanups [Jasper, Florian, Adel, Rui; #677426, #680426,
#686233, #686241, #686318, #686240, #686484, #686002, #684650, #686487]
Contributors:
Jeremy Bicha, Giovanni Campagna, Xavier Claessens, Adel Gadllah, Seif Lotfy,
Tim Lunn, Rui Matos, Florian Müllner, Pierre-Eric Pelloux-Prayer,
Carlos Soriano, Jasper St. Pierre
Translations:
Andika Triwidada [id], Matej Urbančič [sl], Ihar Hrachyshka [be],
Daniel Mustieles [es], Fran Diéguez [gl], Takayuki KUSANO [ja],
Мирослав Николић [sr, sr@latin], Dušan Kazik [sk], Tom Tryfonidis [el]
3.6.1 3.6.1
===== =====
* dash: Make padding even on the top/bottom of the dash [Jasper; #684619] * dash: Make padding even on the top/bottom of the dash [Jasper; #684619]

View File

@ -153,8 +153,6 @@ NP_Initialize(NPNetscapeFuncs *pfuncs, NPPluginFuncs *plugin)
/* global initialization routine, called once when plugin /* global initialization routine, called once when plugin
is loaded */ is loaded */
g_type_init ();
g_debug ("plugin loaded"); g_debug ("plugin loaded");
memcpy (&funcs, pfuncs, sizeof (funcs)); memcpy (&funcs, pfuncs, sizeof (funcs));

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.6.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.7.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@ -52,7 +52,7 @@ AC_MSG_CHECKING([for GStreamer (needed for recording functionality)])
if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then if $PKG_CONFIG --exists gstreamer-1.0 '>=' $GSTREAMER_MIN_VERSION ; then
AC_MSG_RESULT(yes) AC_MSG_RESULT(yes)
build_recorder=true build_recorder=true
recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11" recorder_modules="gstreamer-1.0 gstreamer-base-1.0 x11 gtk+-3.0"
PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl) PKG_CHECK_MODULES(TEST_SHELL_RECORDER, $recorder_modules clutter-1.0 xfixes gl)
else else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
@ -63,9 +63,9 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.11.11 CLUTTER_MIN_VERSION=1.11.11
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.33.2 GJS_MIN_VERSION=1.33.2
MUTTER_MIN_VERSION=3.6.1 MUTTER_MIN_VERSION=3.7.1
GTK_MIN_VERSION=3.3.9 GTK_MIN_VERSION=3.3.9
GIO_MIN_VERSION=2.31.6 GIO_MIN_VERSION=2.35.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3
LIBEDATASERVER_MIN_VERSION=3.5.3 LIBEDATASERVER_MIN_VERSION=3.5.3
LIBEDATASERVERUI_MIN_VERSION=3.5.3 LIBEDATASERVERUI_MIN_VERSION=3.5.3
@ -74,7 +74,7 @@ TELEPATHY_LOGGER_MIN_VERSION=0.2.4
POLKIT_MIN_VERSION=0.100 POLKIT_MIN_VERSION=0.100
STARTUP_NOTIFICATION_MIN_VERSION=0.11 STARTUP_NOTIFICATION_MIN_VERSION=0.11
GCR_MIN_VERSION=3.3.90 GCR_MIN_VERSION=3.3.90
GNOME_DESKTOP_REQUIRED_VERSION=3.5.1 GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
GNOME_MENUS_REQUIRED_VERSION=3.5.3 GNOME_MENUS_REQUIRED_VERSION=3.5.3
# Collect more than 20 libraries for a prize! # Collect more than 20 libraries for a prize!
@ -97,8 +97,7 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
libnm-glib libnm-util gnome-keyring-1 libnm-glib libnm-util gnome-keyring-1
gcr-3 >= $GCR_MIN_VERSION gcr-3 >= $GCR_MIN_VERSION)
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
@ -120,7 +119,7 @@ CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS LIBS=$saved_LIBS
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION) PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.2 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.4) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.4)
@ -139,7 +138,7 @@ PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
AC_SUBST([HAVE_BLUETOOTH],[0]) AC_SUBST([HAVE_BLUETOOTH],[0])
AC_MSG_RESULT([no])]) AC_MSG_RESULT([no])])
PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION libedataserverui-3.0 >= $LIBEDATASERVERUI_MIN_VERSION gio-2.0) PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedataserver-1.2 >= $LIBEDATASERVER_MIN_VERSION gio-2.0)
AC_SUBST(CALENDAR_SERVER_CFLAGS) AC_SUBST(CALENDAR_SERVER_CFLAGS)
AC_SUBST(CALENDAR_SERVER_LIBS) AC_SUBST(CALENDAR_SERVER_LIBS)

View File

@ -8,5 +8,11 @@
<KeyListEntry name="toggle-message-tray" <KeyListEntry name="toggle-message-tray"
_description="Show the message tray"/> _description="Show the message tray"/>
<KeyListEntry name="toggle-application-view"
_description="Show all applications"/>
<KeyListEntry name="open-application-menu"
_description="Open the application menu"/>
</KeyListEntries> </KeyListEntries>

View File

@ -57,6 +57,14 @@ value here is from the TpConnectionPresenceType enumeration.</_summary>
<_summary>Internally used to store the last session presence status for the user. The <_summary>Internally used to store the last session presence status for the user. The
value here is from the GsmPresenceStatus enumeration.</_summary> value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
<key name="always-show-log-out" type="b">
<default>false</default>
<_summary>Always show the 'Log out' menuitem in the user menu.</_summary>
<_description>
This key overrides the automatic hiding of the 'Log out'
menuitem in single-user, single-session situations.
</_description>
</key>
<child name="calendar" schema="org.gnome.shell.calendar"/> <child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/> <child name="recorder" schema="org.gnome.shell.recorder"/>
<child name="keybindings" schema="org.gnome.shell.keybindings"/> <child name="keybindings" schema="org.gnome.shell.keybindings"/>
@ -83,6 +91,14 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
Keybinding to open the application menu. Keybinding to open the application menu.
</_description> </_description>
</key> </key>
<key name="toggle-application-view" type="as">
<default>["&lt;Super&gt;a"]</default>
<_summary>Keybinding to open the "Show Applications" view</_summary>
<_description>
Keybinding to open the "Show Applications" view of the Activities
Overview.
</_description>
</key>
<key name="toggle-message-tray" type="as"> <key name="toggle-message-tray" type="as">
<default>["&lt;Super&gt;m"]</default> <default>["&lt;Super&gt;m"]</default>
<_summary>Keybinding to toggle the visibility of the message tray</_summary> <_summary>Keybinding to toggle the visibility of the message tray</_summary>
@ -148,47 +164,48 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
</key> </key>
</schema> </schema>
<schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"> <schema id="org.gnome.shell.overrides" path="/org/gnome/shell/overrides/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="attach-modal-dialogs" type="b"> <key name="attach-modal-dialogs" type="b">
<default>true</default> <default>true</default>
<summary>Attach modal dialog to the parent window</summary> <_summary>Attach modal dialog to the parent window</_summary>
<description> <_description>
This key overrides the key in org.gnome.mutter when running This key overrides the key in org.gnome.mutter when running
GNOME Shell. GNOME Shell.
</description> </_description>
</key> </key>
<key name="button-layout" type="s"> <key name="button-layout" type="s">
<default>":close"</default> <default>":close"</default>
<summary>Arrangement of buttons on the titlebar</summary> <_summary>Arrangement of buttons on the titlebar</_summary>
<description> <_description>
This key overrides the key in org.gnome.desktop.wm.preferences when This key overrides the key in org.gnome.desktop.wm.preferences when
running GNOME Shell. running GNOME Shell.
</description> </_description>
</key> </key>
<key name="edge-tiling" type="b"> <key name="edge-tiling" type="b">
<default>true</default> <default>true</default>
<summary>Enable edge tiling when dropping windows on screen edges</summary> <_summary>Enable edge tiling when dropping windows on screen edges</_summary>
<description> <_description>
This key overrides the key in org.gnome.mutter when running GNOME Shell. This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description> </_description>
</key> </key>
<key name="dynamic-workspaces" type="b"> <key name="dynamic-workspaces" type="b">
<default>true</default> <default>true</default>
<summary>Workspaces are managed dynamically</summary> <_summary>Workspaces are managed dynamically</_summary>
<description> <_description>
This key overrides the key in org.gnome.mutter when running GNOME Shell. This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description> </_description>
</key> </key>
<key name="workspaces-only-on-primary" type="b"> <key name="workspaces-only-on-primary" type="b">
<default>true</default> <default>true</default>
<summary>Workspaces only on primary monitor</summary> <_summary>Workspaces only on primary monitor</_summary>
<description> <_description>
This key overrides the key in org.gnome.mutter when running GNOME Shell. This key overrides the key in org.gnome.mutter when running GNOME Shell.
</description> </_description>
</key> </key>
<key name="focus-change-on-pointer-rest" type="b"> <key name="focus-change-on-pointer-rest" type="b">

View File

@ -39,7 +39,6 @@ stage {
/* small */ /* small */
.app-well-menu, .app-well-menu,
.contact-details-status, .contact-details-status,
.run-dialog-label,
.run-dialog-error-label { .run-dialog-error-label {
font-size: 9pt; font-size: 9pt;
} }
@ -311,7 +310,7 @@ StScrollBar StButton#vhandle:active {
.notification-icon-button:focus, .notification-icon-button:focus,
.hotplug-notification-item:focus, .hotplug-notification-item:focus,
.modal-dialog-button:focus { .modal-dialog-button:focus {
border: 2px solid #8b8b8b; border-width: 2px;
} }
.dash-search-button:active, .dash-search-button:active,
@ -326,17 +325,20 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: rgba(255, 255, 255, 0.2); background-gradient-end: rgba(255, 255, 255, 0.2);
} }
.notification-button:insensitive,
.notification-icon-button:insensitive, .notification-icon-button:insensitive,
.notification-button:insensitive { .modal-dialog-button:insensitive {
border-color: #666666;
color: #9f9f9f; color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
} }
/* Entries */ /* Entries */
#searchEntry, #searchEntry,
.notification StEntry, .notification StEntry,
.login-dialog-prompt-entry, .modal-dialog StEntry {
.prompt-dialog-password-entry {
color: rgb(64, 64, 64); color: rgb(64, 64, 64);
caret-color: rgb(64, 64, 64); caret-color: rgb(64, 64, 64);
font-size: 12pt; font-size: 12pt;
@ -346,6 +348,7 @@ StScrollBar StButton#vhandle:active {
} }
#searchEntry, #searchEntry,
.run-dialog-entry,
.notification StEntry { .notification StEntry {
border: 2px solid rgba(245,245,245,0.2); border: 2px solid rgba(245,245,245,0.2);
background-gradient-start: rgba(5,5,6,0.1); background-gradient-start: rgba(5,5,6,0.1);
@ -358,8 +361,7 @@ StScrollBar StButton#vhandle:active {
#searchEntry:focus, #searchEntry:focus,
#searchEntry:hover, #searchEntry:hover,
.notification StEntry:focus, .notification StEntry:focus,
.login-dialog-prompt-entry, .modal-dialog StEntry {
.prompt-dialog-password-entry {
border: 2px solid rgb(136,138,133); border: 2px solid rgb(136,138,133);
background-gradient-start: rgb(200,200,200); background-gradient-start: rgb(200,200,200);
background-gradient-end: white; background-gradient-end: white;
@ -368,12 +370,17 @@ StScrollBar StButton#vhandle:active {
} }
.notification StEntry:focus, .notification StEntry:focus,
.prompt-dialog-password-entry:focus, .modal-dialog StEntry:focus {
.login-dialog-prompt-entry:focus {
border: 2px solid #3465a4; border: 2px solid #3465a4;
} }
#searchEntry { #searchEntry {
border-color: rgba(245,245,245,0.3);
color: rgb(192, 192, 192);
caret-color: rgb(192, 192, 192);
}
#searchEntry:hover {
color: rgb(128, 128, 128); color: rgb(128, 128, 128);
caret-color: rgb(128, 128, 128); caret-color: rgb(128, 128, 128);
} }
@ -386,8 +393,7 @@ StScrollBar StButton#vhandle:active {
} }
.notification StEntry, .notification StEntry,
.prompt-dialog-password-entry, .modal-dialog StEntry {
.login-dialog-prompt-entry {
border-radius: 5px; border-radius: 5px;
padding: 4px 4px; padding: 4px 4px;
} }
@ -551,7 +557,6 @@ StScrollBar StButton#vhandle:active {
} }
.status-chooser-combo.popup-combo-menu { .status-chooser-combo.popup-combo-menu {
background-color: rgba(0,0,0,0.7);
padding: .4em 0em; padding: .4em 0em;
border-radius: 4px; border-radius: 4px;
border: 1px solid #5f5f5f; border: 1px solid #5f5f5f;
@ -569,7 +574,7 @@ StScrollBar StButton#vhandle:active {
/* Overview */ /* Overview */
#overview { #overview {
spacing: 12px; spacing: 40px;
} }
.window-caption { .window-caption {
@ -614,9 +619,9 @@ StScrollBar StButton#vhandle:active {
.window-close, .notification-close { .window-close, .notification-close {
background-image: url("close-window.svg"); background-image: url("close-window.svg");
background-size: 34px; background-size: 32px;
height: 34px; height: 32px;
width: 34px; width: 32px;
} }
.window-close { .window-close {
@ -627,19 +632,31 @@ StScrollBar StButton#vhandle:active {
/* we start out in the top right of the /* we start out in the top right of the
* notification, inset. * notification, inset.
* *
* center is 32px/2 = 17px * center is 32px/2 = 16px
* *
* adjust left 2px * adjust left 2px
* adjust down 8px */ * adjust down 8px */
-shell-close-overlap-x: 15px; -shell-close-overlap-x: 14px;
-shell-close-overlap-y: 12px; -shell-close-overlap-y: -12px;
}
.notification-close:rtl {
/* as above, but starting out in the top left of the
* notification. */
-shell-close-overlap-x: -14px;
} }
.window-close:rtl { .window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5); -st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
} }
.window-picker {
-horizontal-spacing: 40px;
-vertical-spacing: 40px;
}
/* Dash */ /* Dash */
#dash { #dash {
@ -677,6 +694,11 @@ StScrollBar StButton#vhandle:active {
.search-entry-icon { .search-entry-icon {
icon-size: 1em; icon-size: 1em;
color: #c0c0c0;
}
#searchEntry:hover .search-entry-icon,
#searchEntry:focus .search-entry-icon {
color: #8d8f8a; color: #8d8f8a;
} }
@ -1188,7 +1210,6 @@ StScrollBar StButton#vhandle:active {
background: #2e3436 url(message-tray-background.png); background: #2e3436 url(message-tray-background.png);
background-repeat: repeat; background-repeat: repeat;
transition-duration: 250; transition-duration: 250;
height: 72px;
} }
#message-tray:keyboard { #message-tray:keyboard {
@ -1198,7 +1219,7 @@ StScrollBar StButton#vhandle:active {
#message-tray:overview { #message-tray:overview {
background: rgba(0, 0, 0, 0.1); background: rgba(0, 0, 0, 0.1);
border-top: 1px solid rgba(128, 128, 128, 0.3); outline: 1px solid rgba(128, 128, 128, 0.3);
} }
.notification { .notification {
@ -1420,28 +1441,34 @@ StScrollBar StButton#vhandle:active {
} }
#summary-mode { #summary-mode {
padding: 0px 6px 0px 6px; /* same as the values in .summary-source */ height: 72px;
height: 60px;
spacing: 10px;
} }
.summary-source-button { .summary-source-button {
border-radius: 4px; padding: 6px 3px 6px 3px;
transition-duration: 100;
} }
.summary-source-button:hover { .summary-source-button:last-child:ltr {
padding-right: 6px;
}
.summary-source-button:last-child:rtl {
padding-left: 6px;
}
.summary-source-button:hover .summary-source {
background-color: rgba(255,255,255,0.1); background-color: rgba(255,255,255,0.1);
} }
.summary-source-button:focus, .summary-source-button:focus .summary-source,
.summary-source-button:selected { .summary-source-button:selected .summary-source {
background-color: rgba(255,255,255,0.33); background-color: rgba(255,255,255,0.33);
} }
.summary-source { .summary-source {
padding-right: 6px; border-radius: 4px;
padding-left: 6px; padding: 0 6px 0 6px;
transition-duration: 100;
} }
.summary-source-counter { .summary-source-counter {
@ -1619,35 +1646,26 @@ StScrollBar StButton#vhandle:active {
padding: 4px 32px 5px; padding: 4px 32px 5px;
} }
.modal-dialog-button:insensitive {
color: rgb(60, 60, 60);
}
.modal-dialog-button:focus { .modal-dialog-button:focus {
padding: 3px 31px 4px; padding: 3px 31px 4px;
} }
/* Run Dialog */ /* Run Dialog */
.run-dialog-label {
font-size: 12pt;
font-weight: bold;
color: #999999;
padding-bottom: .4em;
}
.run-dialog-error-box { .run-dialog-error-box {
padding-top: 15px; padding-top: 15px;
spacing: 5px; spacing: 5px;
} }
.run-dialog-entry { .modal-dialog .run-dialog-entry {
font-weight: bold; width: 20em;
width: 23em;
selection-background-color: white;
selected-color: black;
}
.run-dialog {
border-radius: 16px;
padding-right: 21px;
padding-left: 21px;
padding-bottom: 15px;
padding-top: 15px;
} }
.lightbox { .lightbox {
@ -2173,24 +2191,20 @@ StScrollBar StButton#vhandle:active {
height: .75em; height: .75em;
} }
.login-dialog .modal-dialog-button { .login-dialog .modal-dialog-button {
border: 1px solid #666666;
border-radius: 5px; border-radius: 5px;
padding: 3px 18px; padding: 3px 18px;
} }
.login-dialog .modal-dialog-button:focus { .login-dialog .modal-dialog-button:focus {
padding: 2px 17px; padding: 2px 17px;
border: 2px solid #8b8b8b;
} }
.login-dialog .modal-dialog-button:default { .login-dialog .modal-dialog-button:default {
background-gradient-start: #6793c4; background-gradient-start: #6793c4;
background-gradient-end: #335d8f; background-gradient-end: #335d8f;
background-gradient-direction: vertical; background-gradient-direction: vertical;
padding: 2px 17px; border-color: #16335d;
border: 2px solid #16335d;
} }
.login-dialog .modal-dialog-button:default:focus { .login-dialog .modal-dialog-button:default:focus {
@ -2208,6 +2222,13 @@ StScrollBar StButton#vhandle:active {
background-gradient-end: #74a0d0; background-gradient-end: #74a0d0;
} }
.login-dialog .modal-dialog-button:default:insensitive {
border-color: #666666;
color: #9f9f9f;
background-gradient-direction: none;
background-color: rgba(102, 102, 102, 0.15);
}
.login-dialog-message-warning { .login-dialog-message-warning {
color: orange; color: orange;
} }

View File

@ -21,7 +21,16 @@ const GnomeShellIface = <interface name="org.gnome.Shell.Extensions">
</signal> </signal>
</interface>; </interface>;
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface); const GnomeShellProxy = new Gio.DBusProxyClass({
Name: 'GnomeShellProxy',
Interface: GnomeShellIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell',
g_object_path: '/org/gnome/Shell' });
}
});
function stripPrefix(string, prefix) { function stripPrefix(string, prefix) {
if (string.slice(0, prefix.length) == prefix) if (string.slice(0, prefix.length) == prefix)
@ -191,7 +200,8 @@ const Application = new Lang.Class({
this._extensionPrefsBin.add(label); this._extensionPrefsBin.add(label);
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell'); this._shellProxy = new GnomeShellProxy();
this._shellProxy.init(null);
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) { this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
if (ExtensionUtils.extensions[uuid] !== undefined) if (ExtensionUtils.extensions[uuid] !== undefined)
this._scanExtensions(); this._scanExtensions();

View File

@ -11,16 +11,14 @@ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
</method> </method>
</interface>; </interface>;
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface); const FprintManager = new Gio.DBusProxyClass({
Name: 'FprintManager',
Interface: FprintManagerIface,
function FprintManager() { _init: function() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_interface_name: FprintManagerInfo.name, g_name: 'net.reactivated.Fprint',
g_interface_info: FprintManagerInfo, g_object_path: '/net/reactivated/Fprint/Manager',
g_name: 'net.reactivated.Fprint', g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
g_object_path: '/net/reactivated/Fprint/Manager', }
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) }); });
self.init(null);
return self;
}

View File

@ -39,13 +39,14 @@ const GdmUtil = imports.gdm.util;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const PanelMenu = imports.ui.panelMenu;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const UserMenu = imports.ui.userMenu; const UserMenu = imports.ui.userMenu;
const _RESIZE_ANIMATION_TIME = 0.25; const _RESIZE_ANIMATION_TIME = 0.25;
const _SCROLL_ANIMATION_TIME = 0.5; const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_NAME_SIZE = 48; const _LOGO_ICON_HEIGHT = 16;
let _loginDialog = null; let _loginDialog = null;
@ -82,6 +83,36 @@ function _smoothlyResizeActor(actor, width, height) {
return hold; return hold;
} }
const LogoMenuButton = new Lang.Class({
Name: 'LogoMenuButton',
Extends: PanelMenu.Button,
_init: function() {
this.parent(0.0, null, true);
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._iconBin = new St.Bin();
this.actor.add_actor(this._iconBin);
this._updateLogo();
},
_updateLogo: function() {
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
let icon = null;
if (path) {
let file = Gio.file_new_for_path(path);
let cache = St.TextureCache.get_default();
icon = cache.load_uri_async(file.get_uri(), -1, _LOGO_ICON_HEIGHT);
}
this._iconBin.set_child(icon);
}
});
const UserListItem = new Lang.Class({ const UserListItem = new Lang.Class({
Name: 'UserListItem', Name: 'UserListItem',
@ -638,15 +669,17 @@ const LoginDialog = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default() this._userManager = AccountsService.UserManager.get_default()
this._greeterClient = new Gdm.Client(); this._greeterClient = new Gdm.Client();
this._greeter = this._greeterClient.get_greeter_sync(null); if (GLib.getenv('GDM_GREETER_TEST') != '1') {
this._greeter = this._greeterClient.get_greeter_sync(null);
this._greeter.connect('default-session-name-changed', this._greeter.connect('default-session-name-changed',
Lang.bind(this, this._onDefaultSessionChanged)); Lang.bind(this, this._onDefaultSessionChanged));
this._greeter.connect('session-opened', this._greeter.connect('session-opened',
Lang.bind(this, this._onSessionOpened)); Lang.bind(this, this._onSessionOpened));
this._greeter.connect('timed-login-requested', this._greeter.connect('timed-login-requested',
Lang.bind(this, this._onTimedLoginRequested)); Lang.bind(this, this._onTimedLoginRequested));
}
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient); this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
@ -657,17 +690,11 @@ const LoginDialog = new Lang.Class({
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.LOGO_KEY,
Lang.bind(this, this._updateLogo));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY, this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_TEXT_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
this._logoBox = new St.Bin({ style_class: 'login-dialog-logo-box' });
this.contentLayout.add(this._logoBox);
this._updateLogo();
this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner', this._bannerLabel = new St.Label({ style_class: 'login-dialog-banner',
text: '' }); text: '' });
this.contentLayout.add(this._bannerLabel); this.contentLayout.add(this._bannerLabel);
@ -768,20 +795,6 @@ const LoginDialog = new Lang.Class({
}, },
_updateLogo: function() {
this._logoBox.child = null;
let path = this._settings.get_string(GdmUtil.LOGO_KEY);
if (path) {
let file = Gio.file_new_for_path(path);
let uri = file.get_uri();
let textureCache = St.TextureCache.get_default();
this._logoBox.child = textureCache.load_uri_async(uri, -1, _LOGO_ICON_NAME_SIZE);
}
},
_updateBanner: function() { _updateBanner: function() {
let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY); let enabled = this._settings.get_boolean(GdmUtil.BANNER_MESSAGE_KEY);
let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY); let text = this._settings.get_string(GdmUtil.BANNER_MESSAGE_TEXT_KEY);
@ -800,8 +813,7 @@ const LoginDialog = new Lang.Class({
let tasks = [this._hidePrompt, let tasks = [this._hidePrompt,
new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel, new Batch.ConcurrentBatch(this, [this._fadeInTitleLabel,
this._fadeInNotListedButton, this._fadeInNotListedButton]),
this._fadeInLogo]),
function() { function() {
this._sessionList.close(); this._sessionList.close();
@ -827,9 +839,13 @@ const LoginDialog = new Lang.Class({
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message; if (message) {
this._promptMessage.styleClass = styleClass; this._promptMessage.text = message;
GdmUtil.fadeInActor(this._promptMessage); this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
}, },
_showLoginHint: function(verifier, message) { _showLoginHint: function(verifier, message) {
@ -1073,7 +1089,7 @@ const LoginDialog = new Lang.Class({
})); }));
}, },
_onNotListedClicked: function(user) { _onNotListedClicked: function() {
let tasks = [function() { let tasks = [function() {
return this._userList.hideItems(); return this._userList.hideItems();
}, },
@ -1087,8 +1103,7 @@ const LoginDialog = new Lang.Class({
}, },
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel, new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton, this._fadeOutNotListedButton]),
this._fadeOutLogo]),
function() { function() {
let hold = new Batch.Hold(); let hold = new Batch.Hold();
@ -1101,14 +1116,6 @@ const LoginDialog = new Lang.Class({
batch.run(); batch.run();
}, },
_fadeInLogo: function() {
return GdmUtil.fadeInActor(this._logoBox);
},
_fadeOutLogo: function() {
return GdmUtil.fadeOutActor(this._logoBox);
},
_fadeInBanner: function() { _fadeInBanner: function() {
return GdmUtil.fadeInActor(this._bannerLabel); return GdmUtil.fadeInActor(this._bannerLabel);
}, },
@ -1157,8 +1164,7 @@ const LoginDialog = new Lang.Class({
}, },
new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel, new Batch.ConcurrentBatch(this, [this._fadeOutTitleLabel,
this._fadeOutNotListedButton, this._fadeOutNotListedButton]),
this._fadeOutLogo]),
function() { function() {
return this._userList.shrinkToNaturalHeight(); return this._userList.shrinkToNaturalHeight();

View File

@ -18,11 +18,12 @@
* 02111-1307, USA. * 02111-1307, USA.
*/ */
const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const UPowerGlib = imports.gi.UPowerGlib;
const LoginManager = imports.misc.loginManager; const LoginManager = imports.misc.loginManager;
const GdmUtil = imports.gdm.util;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@ -33,16 +34,21 @@ const PowerMenuButton = new Lang.Class({
_init: function() { _init: function() {
/* Translators: accessible name of the power menu in the login screen */ /* Translators: accessible name of the power menu in the login screen */
this.parent('system-shutdown-symbolic', _("Power")); this.parent('system-shutdown-symbolic', _("Power"));
this._upClient = new UPowerGlib.Client();
this._loginManager = LoginManager.getLoginManager(); LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
this._updateHaveShutdown();
this._updateHaveRestart();
this._updateHaveSuspend();
}));
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::disable-restart-buttons',
Lang.bind(this, this._updateVisibility));
this._createSubMenu(); this._createSubMenu();
this._upClient.connect('notify::can-suspend',
Lang.bind(this, this._updateHaveSuspend));
this._updateHaveSuspend();
// ConsoleKit doesn't send notifications when shutdown/reboot // ConsoleKit doesn't send notifications when shutdown/reboot
// are disabled, so we update the menu item each time the menu opens // are disabled, so we update the menu item each time the menu opens
this.menu.connect('open-state-changed', Lang.bind(this, this.menu.connect('open-state-changed', Lang.bind(this,
@ -50,18 +56,26 @@ const PowerMenuButton = new Lang.Class({
if (open) { if (open) {
this._updateHaveShutdown(); this._updateHaveShutdown();
this._updateHaveRestart(); this._updateHaveRestart();
this._updateHaveSuspend();
} }
})); }));
this._updateHaveShutdown(); this._updateHaveShutdown();
this._updateHaveRestart(); this._updateHaveRestart();
this._updateHaveSuspend();
}, },
_updateVisibility: function() { _updateVisibility: function() {
let shouldBeVisible = (this._haveSuspend || this._haveShutdown || this._haveRestart); let shouldBeVisible = (this._haveSuspend || this._haveShutdown || this._haveRestart);
this.actor.visible = shouldBeVisible; this.actor.visible = shouldBeVisible && !this._settings.get_boolean('disable-restart-buttons');
}, },
_updateHaveShutdown: function() { _updateHaveShutdown: function() {
if (!this._loginManager) {
this._haveShutdown = false;
this._powerOffItem.actor.visible = false;
return;
}
this._loginManager.canPowerOff(Lang.bind(this, function(result) { this._loginManager.canPowerOff(Lang.bind(this, function(result) {
this._haveShutdown = result; this._haveShutdown = result;
this._powerOffItem.actor.visible = this._haveShutdown; this._powerOffItem.actor.visible = this._haveShutdown;
@ -70,6 +84,12 @@ const PowerMenuButton = new Lang.Class({
}, },
_updateHaveRestart: function() { _updateHaveRestart: function() {
if (!this._loginManager) {
this._haveRestart = false;
this._restartItem.actor.visible = false;
return;
}
this._loginManager.canReboot(Lang.bind(this, function(result) { this._loginManager.canReboot(Lang.bind(this, function(result) {
this._haveRestart = result; this._haveRestart = result;
this._restartItem.actor.visible = this._haveRestart; this._restartItem.actor.visible = this._haveRestart;
@ -78,9 +98,17 @@ const PowerMenuButton = new Lang.Class({
}, },
_updateHaveSuspend: function() { _updateHaveSuspend: function() {
this._haveSuspend = this._upClient.get_can_suspend(); if (!this._loginManager) {
this._suspendItem.actor.visible = this._haveSuspend; this._haveSuspend = false;
this._updateVisibility(); this._suspendItem.actor.visible = false;
return;
}
this._loginManager.canSuspend(Lang.bind(this, function(result) {
this._haveSuspend = result;
this._suspendItem.actor.visible = this._haveSuspend;
this._updateVisibility();
}));
}, },
_createSubMenu: function() { _createSubMenu: function() {
@ -103,8 +131,10 @@ const PowerMenuButton = new Lang.Class({
}, },
_onActivateSuspend: function() { _onActivateSuspend: function() {
if (this._haveSuspend) if (!this._haveSuspend)
this._upClient.suspend_sync(null); return;
this._loginManager.suspend();
}, },
_onActivateRestart: function() { _onActivateRestart: function() {

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@ -16,7 +17,16 @@ const ProviderIface = <interface name='org.freedesktop.realmd.Provider'>
<arg name="realm" type="ao" direction="out"/> <arg name="realm" type="ao" direction="out"/>
</method> </method>
</interface>; </interface>;
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface); const Provider = new Gio.DBusProxyClass({
Name: 'RealmdProvider',
Interface: ProviderIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: '/org/freedesktop/realmd' });
}
});
const ServiceIface = <interface name="org.freedesktop.realmd.Service"> const ServiceIface = <interface name="org.freedesktop.realmd.Service">
<method name="Cancel"> <method name="Cancel">
@ -31,7 +41,16 @@ const ServiceIface = <interface name="org.freedesktop.realmd.Service">
<arg name="operation" type="s"/> <arg name="operation" type="s"/>
</signal> </signal>
</interface>; </interface>;
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface); const Service = new Gio.DBusProxyClass({
Name: 'RealmdService',
Interface: ServiceIface,
_init: function(service) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: service });
}
});
const RealmIface = <interface name="org.freedesktop.realmd.Realm"> const RealmIface = <interface name="org.freedesktop.realmd.Realm">
<property name="Name" type="s" access="read"/> <property name="Name" type="s" access="read"/>
@ -51,16 +70,22 @@ const RealmIface = <interface name="org.freedesktop.realmd.Realm">
<arg name="options" type="a{sv}" direction="in"/> <arg name="options" type="a{sv}" direction="in"/>
</method> </method>
</interface>; </interface>;
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface); const Realm = new Gio.DBusProxyClass({
Name: 'RealmdRealm',
Interface: RealmIface,
_init: function(realm) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.realmd',
g_object_path: realm });
}
});
const Manager = new Lang.Class({ const Manager = new Lang.Class({
Name: 'Manager', Name: 'Manager',
_init: function(parentActor) { _init: function(parentActor) {
this._aggregateProvider = Provider(Gio.DBus.system, this._aggregateProvider = new Provider();
'org.freedesktop.realmd',
'/org/freedesktop/realmd',
Lang.bind(this, this._reloadRealms))
this._realms = {}; this._realms = {};
this._aggregateProvider.connect('g-properties-changed', this._aggregateProvider.connect('g-properties-changed',
@ -68,6 +93,16 @@ const Manager = new Lang.Class({
if ('Realms' in properties.deep_unpack()) if ('Realms' in properties.deep_unpack())
this._reloadRealms(); this._reloadRealms();
})); }));
this._aggregateProvider.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
} catch(e) {
return;
}
this._reloadRealms();
}));
}, },
_reloadRealms: function() { _reloadRealms: function() {
@ -77,10 +112,8 @@ const Manager = new Lang.Class({
return; return;
for (let i = 0; i < realmPaths.length; i++) { for (let i = 0; i < realmPaths.length; i++) {
let realm = Realm(Gio.DBus.system, let realm = new Realm(realmPaths[i]);
'org.freedesktop.realmd', realm.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, this._onRealmLoaded));
realmPaths[i],
Lang.bind(this, this._onRealmLoaded));
} }
}, },
@ -97,9 +130,10 @@ const Manager = new Lang.Class({
this._updateLoginFormat(); this._updateLoginFormat();
}, },
_onRealmLoaded: function(realm, error) { _onRealmLoaded: function(realm, result) {
if (error) try {
return; realm.init_finish(result);
} catch(e) { return; }
this._reloadRealm(realm); this._reloadRealm(realm);

View File

@ -82,6 +82,8 @@ const ShellUserVerifier = new Lang.Class({
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._fprintManager = new Fprint.FprintManager(); this._fprintManager = new Fprint.FprintManager();
this._fprintManager.init(null);
this._realmManager = new Realmd.Manager(); this._realmManager = new Realmd.Manager();
this._failCounter = 0; this._failCounter = 0;
@ -125,6 +127,9 @@ const ShellUserVerifier = new Lang.Class({
}, },
answerQuery: function(serviceName, answer) { answerQuery: function(serviceName, answer) {
// Clear any previous message
this.emit('show-message', null, null);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}, },
@ -134,11 +139,14 @@ const ShellUserVerifier = new Lang.Class({
if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY)) if (!this._settings.get_boolean(FINGERPRINT_AUTHENTICATION_KEY))
return; return;
this._fprintManager.GetDefaultDeviceRemote(Gio.DBusCallFlags.NONE, this._cancellable, Lang.bind(this, this._fprintManager.GetDefaultDeviceRemote(this._cancellable, Lang.bind(this, function(manager, result) {
function(device, error) { try {
if (!error && device) let device = manager.GetDefaultDeviceFinish(result);
this._haveFingerprintReader = true; this._haveFingerprintReader = !!device;
})); } catch(e) {
this._haveFingerprintReader = false;
}
}));
}, },
_reportInitError: function(where, error) { _reportInitError: function(where, error) {
@ -330,12 +338,11 @@ const ShellUserVerifier = new Lang.Class({
// Otherwise, we allow ALLOWED_FAILURES attempts. After that, we // Otherwise, we allow ALLOWED_FAILURES attempts. After that, we
// go back to the welcome screen. // go back to the welcome screen.
this._failCounter++;
let canRetry = retry && this._userName && let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) { if (canRetry) {
this._failCounter++;
this.clear(); this.clear();
this.begin(this._userName, new Batch.Hold()); this.begin(this._userName, new Batch.Hold());
} else { } else {

View File

@ -21,11 +21,16 @@ const PresenceStatus = {
IDLE: 3 IDLE: 3
}; };
var PresenceProxy = Gio.DBusProxy.makeProxyWrapper(PresenceIface); const Presence = new Gio.DBusProxyClass({
function Presence(initCallback, cancellable) { Name: 'GnomeSessionPresence',
return new PresenceProxy(Gio.DBus.session, 'org.gnome.SessionManager', Interface: PresenceIface,
'/org/gnome/SessionManager/Presence', initCallback, cancellable);
} _init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: '/org/gnome/SessionManager/Presence' });
}
});
// Note inhibitors are immutable objects, so they don't // Note inhibitors are immutable objects, so they don't
// change at runtime (changes always come in the form // change at runtime (changes always come in the form
@ -39,10 +44,16 @@ const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
</method> </method>
</interface>; </interface>;
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface); const Inhibitor = new Gio.DBusProxyClass({
function Inhibitor(objectPath, initCallback, cancellable) { Name: 'GnomeSessionInhibitor',
return new InhibitorProxy(Gio.DBus.session, 'org.gnome.SessionManager', objectPath, initCallback, cancellable); Interface: InhibitorIface,
}
_init: function(inhibitor) {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: inhibitor });
}
});
// Not the full interface, only the methods we use // Not the full interface, only the methods we use
const SessionManagerIface = <interface name="org.gnome.SessionManager"> const SessionManagerIface = <interface name="org.gnome.SessionManager">
@ -66,7 +77,14 @@ const SessionManagerIface = <interface name="org.gnome.SessionManager">
</signal> </signal>
</interface>; </interface>;
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface); const SessionManager = new Gio.DBusProxyClass({
function SessionManager(initCallback, cancellable) { Name: 'GnomeSessionManager',
return new SessionManagerProxy(Gio.DBus.session, 'org.gnome.SessionManager', '/org/gnome/SessionManager', initCallback, cancellable); Interface: SessionManagerIface,
}
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.SessionManager',
g_object_path: '/org/gnome/SessionManager' });
},
});

View File

@ -2,8 +2,11 @@
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GObject = imports.gi.GObject;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const UPowerGlib = imports.gi.UPowerGlib;
const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager'> const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager'>
<method name='PowerOff'> <method name='PowerOff'>
@ -12,12 +15,18 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
<method name='Reboot'> <method name='Reboot'>
<arg type='b' direction='in'/> <arg type='b' direction='in'/>
</method> </method>
<method name='Suspend'>
<arg type='b' direction='in'/>
</method>
<method name='CanPowerOff'> <method name='CanPowerOff'>
<arg type='s' direction='out'/> <arg type='s' direction='out'/>
</method> </method>
<method name='CanReboot'> <method name='CanReboot'>
<arg type='s' direction='out'/> <arg type='s' direction='out'/>
</method> </method>
<method name='CanSuspend'>
<arg type='s' direction='out'/>
</method>
</interface>; </interface>;
const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'> const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
@ -25,8 +34,26 @@ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session
<signal name='Unlock' /> <signal name='Unlock' />
</interface>; </interface>;
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); const SystemdLoginManager = new Gio.DBusProxyClass({
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); Name: 'SystemdLoginManager',
Interface: SystemdLoginManagerIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.login1',
g_object_path: '/org/freedesktop/login1' });
}
});
const SystemdLoginSession = new Gio.DBusProxyClass({
Name: 'SystemdLoginSession',
Interface: SystemdLoginSessionIface,
_init: function(session) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.login1',
g_object_path: session });
}
});
const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'> const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'>
<method name='CanRestart'> <method name='CanRestart'>
@ -53,51 +80,128 @@ const ConsoleKitSessionIface = <interface name='org.freedesktop.ConsoleKit.Sessi
<signal name='Unlock' /> <signal name='Unlock' />
</interface>; </interface>;
const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); const ConsoleKitSession = new Gio.DBusProxyClass({
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface); Name: 'ConsoleKitSession',
Interface: ConsoleKitSessionIface,
_init: function(session) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ConsoleKit',
g_object_path: session });
}
});
const ConsoleKitManager = new Gio.DBusProxyClass({
Name: 'ConsoleKitManager',
Interface: ConsoleKitManagerIface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ConsoleKit',
g_object_path: '/org/freedesktop/ConsoleKit/Manager' });
}
});
function haveSystemd() { function haveSystemd() {
return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0; return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0;
} }
let _loginManager = null; let _loginManager = null;
let _pendingAsyncCallbacks = [];
/** /**
* LoginManager: * LoginManager:
* An abstraction over systemd/logind and ConsoleKit. * An abstraction over systemd/logind and ConsoleKit.
* *
*/ */
function getLoginManager() { function getLoginManager(asyncCallback) {
if (_loginManager == null) { if (_loginManager == null) {
if (haveSystemd()) if (_pendingAsyncCallbacks.length == 0) {
_loginManager = new LoginManagerSystemd(); let manager;
else
_loginManager = new LoginManagerConsoleKit();
}
return _loginManager; if (haveSystemd())
manager = new LoginManagerSystemd();
else
manager = new LoginManagerConsoleKit();
manager.initAsync(null, function(obj, result) {
obj.initFinish(result);
_loginManager = manager;
_pendingAsyncCallbacks.forEach(function (f) { f(obj) });
_pendingAsyncCallbacks = [];
});
_pendingAsyncCallbacks = [asyncCallback];
} else {
_pendingAsyncCallbacks.push(asyncCallback);
}
} else {
GLib.idle_add(GLib.PRIORITY_DEFAULT, function() {
asyncCallback(_loginManager);
});
}
} }
const LoginManagerSystemd = new Lang.Class({ const LoginManagerSystemd = new Lang.Class({
Name: 'LoginManagerSystemd', Name: 'LoginManagerSystemd',
Extends: GObject.Object,
_init: function() { _init: function() {
this._proxy = new SystemdLoginManager(Gio.DBus.system, this.parent();
'org.freedesktop.login1',
'/org/freedesktop/login1'); this._proxy = new SystemdLoginManager();
},
initAsync: function(cancellable, asyncCallback) {
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._fetchCurrentSession(cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return true;
},
_fetchCurrentSession: function(cancellable, simpleResult) {
this._currentSession = new SystemdLoginSession('/org/freedesktop/login1/session/' +
GLib.getenv('XDG_SESSION_ID'));
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
}, },
// Having this function is a bit of a hack since the Systemd and ConsoleKit // Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are // session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment. // Lock/Unlock signals, and that's all we count upon at the moment.
//
// This is only valid after async initialization
getCurrentSessionProxy: function() { getCurrentSessionProxy: function() {
if (!this._currentSession) {
this._currentSession = new SystemdLoginSession(Gio.DBus.system,
'org.freedesktop.login1',
'/org/freedesktop/login1/session/' +
GLib.getenv('XDG_SESSION_ID'));
}
return this._currentSession; return this._currentSession;
}, },
@ -106,52 +210,126 @@ const LoginManagerSystemd = new Lang.Class({
}, },
canPowerOff: function(asyncCallback) { canPowerOff: function(asyncCallback) {
this._proxy.CanPowerOffRemote(function(result, error) { this._proxy.CanPowerOffRemote(null, function(proxy, result) {
if (error) let val = false;
asyncCallback(false);
else try {
asyncCallback(result[0] != 'no'); val = proxy.CanPowerOffFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
}); });
}, },
canReboot: function(asyncCallback) { canReboot: function(asyncCallback) {
this._proxy.CanRebootRemote(function(result, error) { this._proxy.CanRebootRemote(null, function(proxy, result) {
if (error) let val = false;
asyncCallback(false);
else try {
asyncCallback(result[0] != 'no'); val = proxy.CanRebootFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
});
},
canSuspend: function(asyncCallback) {
this._proxy.CanSuspendRemote(null, function(proxy, result) {
let val = false;
try {
val = proxy.CanRebootFinish(result)[0] != 'no';
} catch(e) { }
asyncCallback(val);
}); });
}, },
powerOff: function() { powerOff: function() {
this._proxy.PowerOffRemote(true); this._proxy.PowerOffRemote(true, null, null);
}, },
reboot: function() { reboot: function() {
this._proxy.RebootRemote(true); this._proxy.RebootRemote(true, null, null);
},
suspend: function() {
this._proxy.SuspendRemote(true, null, null);
} }
}); });
const LoginManagerConsoleKit = new Lang.Class({ const LoginManagerConsoleKit = new Lang.Class({
Name: 'LoginManagerConsoleKit', Name: 'LoginManagerConsoleKit',
Extends: GObject.Object,
_init: function() { _init: function() {
this._proxy = new ConsoleKitManager(Gio.DBus.system, this.parent();
'org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager'); this._proxy = new ConsoleKitManager();
this._upClient = new UPowerGlib.Client();
},
initAsync: function(cancellable, asyncCallback) {
let simpleResult = Gio.SimpleAsyncResult.new(this, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._fetchCurrentSession(cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return true;
},
_fetchCurrentSession: function(cancellable, simpleResult) {
this._proxy.GetCurrentSessionRemote(cancellable, Lang.bind(this, function(proxy, result) {
try {
let [currentSessionId] = proxy.GetCurrentSessionFinish(result);
if (cancellable && cancellable.is_cancelled())
return;
this._createSessionProxy(currentSessionId, cancellable, simpleResult);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
simpleResult.complete();
}
}));
},
_createSessionProxy: function(currentSessionId, cancellable, simpleResult) {
this._currentSession = new ConsoleKitSession(currentSessionId);
this._currentSession.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
}, },
// Having this function is a bit of a hack since the Systemd and ConsoleKit // Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are // session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment. // Lock/Unlock signals, and that's all we count upon at the moment.
getCurrentSessionProxy: function() { getCurrentSessionProxy: function() {
if (!this._currentSession) {
let [currentSessionId] = this._proxy.GetCurrentSessionSync();
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
'org.freedesktop.ConsoleKit',
currentSessionId);
}
return this._currentSession; return this._currentSession;
}, },
@ -163,35 +341,51 @@ const LoginManagerConsoleKit = new Lang.Class({
session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) { session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) {
this._sessionActive = isActive; this._sessionActive = isActive;
})); }));
[this._sessionActive] = session.IsActiveSync(); [this._sessionActive] = session.IsActiveSync(null);
return this._sessionActive; return this._sessionActive;
}, },
canPowerOff: function(asyncCallback) { canPowerOff: function(asyncCallback) {
this._proxy.CanStopRemote(function(result, error) { this._proxy.CanStopRemote(null, function(proxy, result) {
if (error) let val = false;
asyncCallback(false);
else try {
asyncCallback(result[0]); [val] = proxy.CanStopFinish(result);
} catch(e) { }
asyncCallback(val);
}); });
}, },
canReboot: function(asyncCallback) { canReboot: function(asyncCallback) {
this._proxy.CanRestartRemote(function(result, error) { this._proxy.CanRestartRemote(null, function(proxy, result) {
if (error) let val = false;
asyncCallback(false);
else try {
asyncCallback(result[0]); [val] = proxy.CanRestartFinish(result);
} catch(e) { }
asyncCallback(val);
}); });
}, },
canSuspend: function(asyncCallback) {
Mainloop.idle_add(Lang.bind(this, function() {
asyncCallback(this._upClient.get_can_suspend());
return false;
}));
},
powerOff: function() { powerOff: function() {
this._proxy.StopRemote(); this._proxy.StopRemote(null, null);
}, },
reboot: function() { reboot: function() {
this._proxy.RestartRemote(); this._proxy.RestartRemote(null, null);
},
suspend: function() {
this._upClient.suspend_sync(null);
} }
}); });

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@ -26,7 +27,16 @@ const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.M
</signal> </signal>
</interface>; </interface>;
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface); const ModemGsmNetworkProxy = new Gio.DBusProxyClass({
Name: 'ModemGsmNetworkProxy',
Interface: ModemGsmNetworkInterface,
_init: function(modem) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ModemManager',
g_object_path: modem });
}
});
const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma"> const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
<method name="GetSignalQuality"> <method name="GetSignalQuality">
@ -40,7 +50,16 @@ const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.C
</signal> </signal>
</interface>; </interface>;
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); const ModemCdmaProxy = new Gio.DBusProxyClass({
Name: 'ModemCdmaProxy',
Interface: ModemCdmaInterface,
_init: function(modem) {
this.parent({ g_bus_type: Gio.BusType.SYSTEM,
g_name: 'org.freedesktop.ModemManager',
g_object_path: modem });
},
});
let _providersTable; let _providersTable;
function _getProvidersTable() { function _getProvidersTable() {
@ -54,11 +73,18 @@ const ModemGsm = new Lang.Class({
Name: 'ModemGsm', Name: 'ModemGsm',
_init: function(path) { _init: function(path) {
this._proxy = new ModemGsmNetworkProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); this._proxy = new ModemGsmNetworkProxy(path);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
obj.init_finish(result);
this._finishInit();
}));
this.signal_quality = 0; this.signal_quality = 0;
this.operator_name = null; this.operator_name = null;
},
_finishInit: function() {
// Code is duplicated because the function have different signatures // Code is duplicated because the function have different signatures
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) { this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, [quality]) {
this.signal_quality = quality; this.signal_quality = quality;
@ -68,24 +94,19 @@ const ModemGsm = new Lang.Class({
this.operator_name = this._findOperatorName(name, code); this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name'); this.emit('notify::operator-name');
})); }));
this._proxy.GetRegistrationInfoRemote(Lang.bind(this, function([result], err) { this._proxy.GetRegistrationInfoRemote(null, Lang.bind(this, function(proxy, result) {
if (err) { let [status, code, name] = proxy.GetRegistrationInfoFinish(result);
log(err);
return;
}
let [status, code, name] = result;
this.operator_name = this._findOperatorName(name, code); this.operator_name = this._findOperatorName(name, code);
this.emit('notify::operator-name'); this.emit('notify::operator-name');
})); }));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) { this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
if (err) { try {
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
} catch(e) {
// it will return an error if the device is not connected // it will return an error if the device is not connected
this.signal_quality = 0; this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
} }
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
})); }));
}, },
@ -157,10 +178,18 @@ const ModemCdma = new Lang.Class({
Name: 'ModemCdma', Name: 'ModemCdma',
_init: function(path) { _init: function(path) {
this._proxy = new ModemCdmaProxy(Gio.DBus.system, 'org.freedesktop.ModemManager', path); this._proxy = new ModemCdmaProxy(path);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
obj.init_finish(result);
this._finishInit();
}));
this.signal_quality = 0; this.signal_quality = 0;
this.operator_name = null; this.operator_name = null;
},
_finishInit: function() {
this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) { this._proxy.connectSignal('SignalQuality', Lang.bind(this, function(proxy, sender, params) {
this.signal_quality = params[0]; this.signal_quality = params[0];
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
@ -170,30 +199,31 @@ const ModemCdma = new Lang.Class({
if (this.operator_name == null) if (this.operator_name == null)
this._refreshServingSystem(); this._refreshServingSystem();
})); }));
this._proxy.GetSignalQualityRemote(Lang.bind(this, function(result, err) { this._proxy.GetSignalQualityRemote(null, Lang.bind(this, function(proxy, result) {
if (err) { try {
[this.signal_quality] = proxy.GetSignalQualityFinish(result);
} catch(e) {
// it will return an error if the device is not connected // it will return an error if the device is not connected
this.signal_quality = 0; this.signal_quality = 0;
} else {
let [quality] = result;
this.signal_quality = quality;
} }
this.emit('notify::signal-quality'); this.emit('notify::signal-quality');
})); }));
}, },
_refreshServingSystem: function() { _refreshServingSystem: function() {
this._proxy.GetServingSystemRemote(Lang.bind(this, function([result], err) { this._proxy.GetServingSystemRemote(null, Lang.bind(this, function(proxy, result) {
if (err) { try {
// it will return an error if the device is not connected let [bandClass, band, name] = proxy.GetServingSystemFinish(result);
this.operator_name = null;
} else {
let [bandClass, band, id] = result;
if (name.length > 0) if (name.length > 0)
this.operator_name = this._findProviderForSid(id); this.operator_name = this._findProviderForSid(name);
else else
this.operator_name = null; this.operator_name = null;
} catch(e) {
// it will return an error if the device is not connected
this.operator_name = null;
} }
this.emit('notify::operator-name'); this.emit('notify::operator-name');
})); }));
}, },

View File

@ -141,6 +141,7 @@ const BoxPointer = new Lang.Class({
this._muteInput(); this._muteInput();
Tweener.removeTweens(this);
Tweener.addTween(this, { opacity: fade ? 0 : 255, Tweener.addTween(this, { opacity: fade ? 0 : 255,
xOffset: xOffset, xOffset: xOffset,
yOffset: yOffset, yOffset: yOffset,

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
@ -200,19 +201,17 @@ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
<signal name="Changed" /> <signal name="Changed" />
</interface>; </interface>;
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface); const CalendarServer = new Gio.DBusProxyClass({
Name: 'CalendarServer',
Interface: CalendarServerIface,
function CalendarServer() { _init: function() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.session, this.parent({ g_bus_type: Gio.BusType.SESSION,
g_interface_name: CalendarServerInfo.name, g_name: 'org.gnome.Shell.CalendarServer',
g_interface_info: CalendarServerInfo, g_object_path: '/org/gnome/Shell/CalendarServer',
g_name: 'org.gnome.Shell.CalendarServer', g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES });
g_object_path: '/org/gnome/Shell/CalendarServer', }
g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); });
self.init(null);
return self;
}
function _datesEqual(a, b) { function _datesEqual(a, b) {
if (a < b) if (a < b)
@ -242,11 +241,15 @@ const DBusEventSource = new Lang.Class({
this._dbusProxy = new CalendarServer(); this._dbusProxy = new CalendarServer();
this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged)); this._dbusProxy.connectSignal('Changed', Lang.bind(this, this._onChanged));
this._dbusProxy.connect('notify::g-name-owner', Lang.bind(this, function() { this._dbusProxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
if (this._dbusProxy.g_name_owner) try {
this._onNameAppeared(); proxy.init_finish(result);
else } catch(e) {
this._onNameVanished(); return;
}
this._resetCache();
this.emit('changed');
})); }));
}, },
@ -256,51 +259,52 @@ const DBusEventSource = new Lang.Class({
this._lastRequestEnd = null; this._lastRequestEnd = null;
}, },
_onNameAppeared: function(owner) {
this._resetCache();
this._loadEvents(true);
},
_onNameVanished: function(oldOwner) {
this._resetCache();
this.emit('changed');
},
_onChanged: function() { _onChanged: function() {
this._loadEvents(false); this._loadEvents(false);
}, },
_onEventsReceived: function([appointments]) { _onEventsReceived: function(proxy, result) {
let newEvents = []; let appointments;
if (appointments != null) { try {
for (let n = 0; n < appointments.length; n++) { [appointments] = proxy.call_finish(result).deep_unpack();
let a = appointments[n]; } catch(e if e instanceof GLib.Error) {
let date = new Date(a[4] * 1000); // ignore errors coming from DBus
let end = new Date(a[5] * 1000); appointments = [];
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort(function(event1, event2) {
return event1.date.getTime() - event2.date.getTime();
});
} }
let newEvents = [];
for (let n = 0; n < appointments.length; n++) {
let a = appointments[n];
let date = new Date(a[4] * 1000);
let end = new Date(a[5] * 1000);
let summary = a[1];
let allDay = a[3];
let event = new CalendarEvent(date, end, summary, allDay);
newEvents.push(event);
}
newEvents.sort(function(event1, event2) {
return event1.date.getTime() - event2.date.getTime();
});
this._events = newEvents; this._events = newEvents;
this.emit('changed'); this.emit('changed');
}, },
_loadEvents: function(forceReload) { _loadEvents: function(forceReload) {
if (this._curRequestBegin && this._curRequestEnd){ if (this._curRequestBegin && this._curRequestEnd){
/* Can't use GetEventsRemote because we need to pass the
flags here */
let callFlags = Gio.DBusCallFlags.NO_AUTO_START; let callFlags = Gio.DBusCallFlags.NO_AUTO_START;
if (forceReload) if (forceReload)
callFlags = Gio.DBusCallFlags.NONE; callFlags = Gio.DBusCallFlags.NONE;
this._dbusProxy.GetEventsRemote(this._curRequestBegin.getTime() / 1000, this._dbusProxy.call("GetEvents",
this._curRequestEnd.getTime() / 1000, GLib.Variant.new("(xxb)", [this._curRequestBegin.getTime() / 1000,
forceReload, this._curRequestEnd.getTime() / 1000,
Lang.bind(this, this._onEventsReceived), forceReload]),
callFlags); callFlags,
-1,
null,
Lang.bind(this, this._onEventsReceived));
} }
}, },
@ -393,7 +397,6 @@ const Calendar = new Lang.Class({
this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() { this._eventSourceChangedId = this._eventSource.connect('changed', Lang.bind(this, function() {
this._update(false); this._update(false);
})); }));
this._update(true);
} }
}, },

View File

@ -33,7 +33,9 @@ const AutomountManager = new Lang.Class({
Lang.bind(this, this._InhibitorsChanged)); Lang.bind(this, this._InhibitorsChanged));
this._inhibited = false; this._inhibited = false;
this._loginManager = LoginManager.getLoginManager(); LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
}, },
@ -85,7 +87,7 @@ const AutomountManager = new Lang.Class({
_onDriveConnected: function() { _onDriveConnected: function() {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds // or screensaver is active, don't play sounds
if (!this._loginManager.sessionActive) if (!this._loginManager || !this._loginManager.sessionActive)
return; return;
global.play_theme_sound(0, 'device-added-media'); global.play_theme_sound(0, 'device-added-media');
@ -94,7 +96,7 @@ const AutomountManager = new Lang.Class({
_onDriveDisconnected: function() { _onDriveDisconnected: function() {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
// or screensaver is active, don't play sounds // or screensaver is active, don't play sounds
if (!this._loginManager.sessionActive) if (!this._loginManager || !this._loginManager.sessionActive)
return; return;
global.play_theme_sound(0, 'device-removed-media'); global.play_theme_sound(0, 'device-removed-media');
@ -103,7 +105,7 @@ const AutomountManager = new Lang.Class({
_onDriveEjectButton: function(monitor, drive) { _onDriveEjectButton: function(monitor, drive) {
// TODO: this code path is not tested, as the GVfs volume monitor // TODO: this code path is not tested, as the GVfs volume monitor
// doesn't emit this signal just yet. // doesn't emit this signal just yet.
if (!this._loginManager.sessionActive) if (!this._loginManager || !this._loginManager.sessionActive)
return; return;
// we force stop/eject in this case, so we don't have to pass a // we force stop/eject in this case, so we don't have to pass a
@ -143,7 +145,7 @@ const AutomountManager = new Lang.Class({
if (params.checkSession) { if (params.checkSession) {
// if we're not in the current ConsoleKit session, // if we're not in the current ConsoleKit session,
// don't attempt automount // don't attempt automount
if (!this._loginManager.sessionActive) if (!this._loginManager || !this._loginManager.sessionActive)
return; return;
} }

View File

@ -2,6 +2,7 @@
const Lang = imports.lang; const Lang = imports.lang;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const St = imports.gi.St; const St = imports.gi.St;
const LoginManager = imports.misc.loginManager; const LoginManager = imports.misc.loginManager;
@ -45,14 +46,12 @@ function isMountRootHidden(root) {
} }
function isMountNonLocal(mount) { function isMountNonLocal(mount) {
// If the mount doesn't have an associated volume, that means it could // If the mount doesn't have an associated volume, that means it's
// be a remote filesystem. For certain kinds of local filesystems, // an uninteresting filesystem. Most devices that we care about will
// like digital cameras and music players, there's no associated // have a mount, like media players and USB sticks.
// gvfs volume, so err on the side of caution and assume it's a local
// filesystem to allow the prompt.
let volume = mount.get_volume(); let volume = mount.get_volume();
if (volume == null) if (volume == null)
return false; return true;
return (volume.get_identifier("class") == "network"); return (volume.get_identifier("class") == "network");
} }
@ -84,12 +83,16 @@ const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer">
</method> </method>
</interface>; </interface>;
const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface); const HotplugSniffer = new Gio.DBusProxyClass({
function HotplugSniffer() { Name: 'HotplugSnifferProxy',
return new HotplugSnifferProxy(Gio.DBus.session, Interface: HotplugSnifferIface,
'org.gnome.Shell.HotplugSniffer',
'/org/gnome/Shell/HotplugSniffer'); _init: function() {
} this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell.HotplugSniffer',
g_object_path: '/org/gnome/Shell/HotplugSniffer' });
}
});
const ContentTypeDiscoverer = new Lang.Class({ const ContentTypeDiscoverer = new Lang.Class({
Name: 'ContentTypeDiscoverer', Name: 'ContentTypeDiscoverer',
@ -129,10 +132,14 @@ const ContentTypeDiscoverer = new Lang.Class({
let root = mount.get_root(); let root = mount.get_root();
let hotplugSniffer = new HotplugSniffer(); let hotplugSniffer = new HotplugSniffer();
hotplugSniffer.SniffURIRemote(root.get_uri(), hotplugSniffer.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
Lang.bind(this, function([contentTypes]) { proxy.init_finish(result);
this._emitCallback(mount, contentTypes);
})); proxy.SniffURIRemote(root.get_uri(), null, Lang.bind(this, function(proxy, result) {
let [contentTypes] = proxy.SniffURIFinish(result);
this._emitCallback(mount, contentTypes);
}));
}));
} }
}, },
@ -164,7 +171,9 @@ const AutorunManager = new Lang.Class({
Name: 'AutorunManager', Name: 'AutorunManager',
_init: function() { _init: function() {
this._loginManager = LoginManager.getLoginManager(); LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();
@ -217,7 +226,7 @@ const AutorunManager = new Lang.Class({
_onMountAdded: function(monitor, mount) { _onMountAdded: function(monitor, mount) {
// don't do anything if our session is not the currently // don't do anything if our session is not the currently
// active one // active one
if (!this._loginManager.sessionActive) if (!this._loginManager || !this._loginManager.sessionActive)
return; return;
this._processMount(mount, true); this._processMount(mount, true);
@ -546,9 +555,8 @@ const AutorunTransientSource = new Lang.Class({
this.notify(this._notification); this.notify(this._notification);
}, },
createIcon: function(size) { getIcon: function() {
return new St.Icon({ gicon: this.mount.get_icon(), return this.mount.get_icon();
icon_size: size });
} }
}); });

View File

@ -408,7 +408,10 @@ const VPNRequestHandler = new Lang.Class({
} }
}, },
cancel: function() { cancel: function(respond) {
if (respond)
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.USER_CANCELED);
if (this._newStylePlugin && this._shellDialog) { if (this._newStylePlugin && this._shellDialog) {
this._shellDialog.close(global.get_current_time()); this._shellDialog.close(global.get_current_time());
this._shellDialog.destroy(); this._shellDialog.destroy();
@ -599,6 +602,16 @@ const NetworkAgent = new Lang.Class({
}, },
disable: function() { disable: function() {
let requestId;
for (requestId in this._dialogs)
this._dialogs[requestId].cancel();
this._dialogs = { };
for (requestId in this._vpnRequests)
this._vpnRequests[requestId].cancel(true);
this._vpnRequests = { };
this._native.unregister(); this._native.unregister();
}, },
@ -622,7 +635,7 @@ const NetworkAgent = new Lang.Class({
this._dialogs[requestId].destroy(); this._dialogs[requestId].destroy();
delete this._dialogs[requestId]; delete this._dialogs[requestId];
} else if (this._vpnRequests[requestId]) { } else if (this._vpnRequests[requestId]) {
this._vpnRequests[requestId].cancel(); this._vpnRequests[requestId].cancel(false);
delete this._vpnRequests[requestId]; delete this._vpnRequests[requestId];
} }
}, },

View File

@ -41,7 +41,7 @@ const Recorder = new Lang.Class({
recorder.set_framerate(this._recorderSettings.get_int('framerate')); recorder.set_framerate(this._recorderSettings.get_int('framerate'));
/* Translators: this is a filename used for screencast recording */ /* Translators: this is a filename used for screencast recording */
// xgettext:no-c-format // xgettext:no-c-format
recorder.set_filename(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension')); recorder.set_file_template(_("Screencast from %d %t") + '.' + this._recorderSettings.get_string('file-extension'));
let pipeline = this._recorderSettings.get_string('pipeline'); let pipeline = this._recorderSettings.get_string('pipeline');
if (!pipeline.match(/^\s*$/)) if (!pipeline.match(/^\s*$/))

View File

@ -509,51 +509,42 @@ const ChatSource = new Lang.Class({
this._notification.appendAliasChange(oldAlias, newAlias); this._notification.appendAliasChange(oldAlias, newAlias);
}, },
createIcon: function(size) { getIcon: function() {
this._iconBox = new St.Bin({ style_class: 'avatar-box' });
this._iconBox._size = size;
let textureCache = St.TextureCache.get_default();
let file = this._contact.get_avatar_file(); let file = this._contact.get_avatar_file();
if (file) { if (file) {
let uri = file.get_uri(); return new Gio.FileIcon({ file: file });
this._iconBox.child = textureCache.load_uri_async(uri, this._iconBox._size, this._iconBox._size);
} else { } else {
this._iconBox.child = new St.Icon({ icon_name: 'avatar-default', return new Gio.ThemedIcon({ name: 'avatar-default' });
icon_size: this._iconBox._size });
} }
return this._iconBox;
}, },
createSecondaryIcon: function() { getSecondaryIcon: function() {
let iconBox = new St.Bin(); let iconName;
iconBox.child = new St.Icon({ style_class: 'secondary-icon' });
let presenceType = this._contact.get_presence_type(); let presenceType = this._contact.get_presence_type();
switch (presenceType) { switch (presenceType) {
case Tp.ConnectionPresenceType.AVAILABLE: case Tp.ConnectionPresenceType.AVAILABLE:
iconBox.child.icon_name = 'user-available'; iconName = 'user-available';
break; break;
case Tp.ConnectionPresenceType.BUSY: case Tp.ConnectionPresenceType.BUSY:
iconBox.child.icon_name = 'user-busy'; iconName = 'user-busy';
break; break;
case Tp.ConnectionPresenceType.OFFLINE: case Tp.ConnectionPresenceType.OFFLINE:
iconBox.child.icon_name = 'user-offline'; iconName = 'user-offline';
break; break;
case Tp.ConnectionPresenceType.HIDDEN: case Tp.ConnectionPresenceType.HIDDEN:
iconBox.child.icon_name = 'user-invisible'; iconName = 'user-invisible';
break; break;
case Tp.ConnectionPresenceType.AWAY: case Tp.ConnectionPresenceType.AWAY:
iconBox.child.icon_name = 'user-away'; iconName = 'user-away';
break; break;
case Tp.ConnectionPresenceType.EXTENDED_AWAY: case Tp.ConnectionPresenceType.EXTENDED_AWAY:
iconBox.child.icon_name = 'user-idle'; iconName = 'user-idle';
break; break;
default: default:
iconBox.child.icon_name = 'user-offline'; iconName = 'user-offline';
} }
return iconBox; return new Gio.ThemedIcon({ name: iconName });
}, },
_updateAvatarIcon: function() { _updateAvatarIcon: function() {
@ -564,7 +555,9 @@ const ChatSource = new Lang.Class({
open: function(notification) { open: function(notification) {
if (this._client.is_handling_channel(this._channel)) { if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy // We are handling the channel, try to pass it to Empathy
this._client.delegate_channels_async([this._channel], global.get_current_time(), '', null); this._client.delegate_channels_async([this._channel],
global.get_current_time(),
'org.freedesktop.Telepathy.Client.Empathy.Chat', null);
} }
else { else {
// We are not the handler, just ask to present the channel // We are not the handler, just ask to present the channel
@ -733,7 +726,7 @@ const ChatSource = new Lang.Class({
title = GLib.markup_escape_text(this.title, -1); title = GLib.markup_escape_text(this.title, -1);
this._notification.update(this._notification.title, null, { customContent: true, secondaryIcon: this.createSecondaryIcon() }); this._notification.update(this._notification.title, null, { customContent: true, secondaryGIcon: this.getSecondaryIcon() });
if (message) if (message)
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>'; msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
@ -761,7 +754,7 @@ const ChatNotification = new Lang.Class({
Extends: MessageTray.Notification, Extends: MessageTray.Notification,
_init: function(source) { _init: function(source) {
this.parent(source, source.title, null, { customContent: true, secondaryIcon: source.createSecondaryIcon() }); this.parent(source, source.title, null, { customContent: true, secondaryGIcon: source.getSecondaryIcon() });
this.setResident(true); this.setResident(true);
this._responseEntry = new St.Entry({ style_class: 'chat-response', this._responseEntry = new St.Entry({ style_class: 'chat-response',
@ -939,24 +932,32 @@ const ChatNotification = new Lang.Class({
let format; let format;
// Show a week day and time if date is in the last week // Show only the hour if date is on today
if (daysAgo < 1 || (daysAgo < 7 && now.getDay() != date.getDay())) { if(daysAgo < 1){
/* Translators: this is a time format string followed by a date. format = "<b>%H:%M</b>";
If applicable, replace %X with a strftime format valid for your }
locale, without seconds. */ // Show the word "Yesterday" and time if date is on yesterday
else if(daysAgo <2){
/* Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"*/
// xgettext:no-c-format // xgettext:no-c-format
format = _("Sent at <b>%X</b> on <b>%A</b>"); format = _("<b>%H:%M</b> on Yesterday");
}
// Show a week day and time if date is in the last week
else if (daysAgo < 7) {
/* Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday*/
// xgettext:no-c-format
format = _("<b>%H:%M</b> on <b>%A</b>");
} else if (date.getYear() == now.getYear()) { } else if (date.getYear() == now.getYear()) {
/* Translators: this is a time format in the style of "Wednesday, May 25", /* Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
shown when you get a chat message in the same year. */ shown when you get a chat message in the same year */
// xgettext:no-c-format // xgettext:no-c-format
format = _("Sent on <b>%A</b>, <b>%B %d</b>"); format = _("<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>");
} else { } else {
/* Translators: this is a time format in the style of "Wednesday, May 25, 2012", /* Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
shown when you get a chat message in a different year. */ shown when you get a chat message in a different year */
// xgettext:no-c-format // xgettext:no-c-format
format = _("Sent on <b>%A</b>, <b>%B %d</b>, %Y"); format = _("<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y");
} }
return date.toLocaleFormat(format); return date.toLocaleFormat(format);
@ -969,8 +970,7 @@ const ChatNotification = new Lang.Class({
let timeLabel = this._append({ body: this._formatTimestamp(lastMessageDate), let timeLabel = this._append({ body: this._formatTimestamp(lastMessageDate),
group: 'meta', group: 'meta',
styles: ['chat-meta-message'], styles: ['chat-meta-message'],
childProps: { expand: true, x_fill: false, childProps: { expand: true, x_fill: false },
x_align: St.Align.END },
noTimestamp: true, noTimestamp: true,
timestamp: lastMessageTime }); timestamp: lastMessageTime });
@ -1071,9 +1071,8 @@ const ApproverSource = new Lang.Class({
this.parent(); this.parent();
}, },
createIcon: function(size) { getIcon: function() {
return new St.Icon({ gicon: this._gicon, return this._gicon;
icon_size: size });
} }
}); });

View File

@ -105,7 +105,7 @@ const restartDialogContent = {
endDescription: _("Restarting the system."), endDescription: _("Restarting the system."),
confirmButtons: [{ signal: 'ConfirmedReboot', confirmButtons: [{ signal: 'ConfirmedReboot',
label: C_("button", "Restart") }], label: C_("button", "Restart") }],
iconName: 'system-shutdown-symbolic', iconName: 'view-refresh-symbolic',
iconStyleClass: 'end-session-dialog-shutdown-icon' iconStyleClass: 'end-session-dialog-shutdown-icon'
}; };
@ -218,6 +218,34 @@ function init() {
_endSessionDialog = new EndSessionDialog(); _endSessionDialog = new EndSessionDialog();
} }
const EndSessionExporter = new Gio.DBusImplementerClass({
Name: 'EndSessionExporter',
Interface: EndSessionDialogIface,
_init: function() {
this.parent();
this.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog');
},
OpenAsync: function(parameters, invocation) {
this.emit('open', parameters, invocation);
},
close: function() {
this.emit_signal('Closed');
},
cancel: function() {
this.emit_signal('Canceled');
},
confirm: function(type) {
this.emit_signal(type);
},
});
Signals.addSignalMethods(EndSessionExporter.prototype);
const EndSessionDialog = new Lang.Class({ const EndSessionDialog = new Lang.Class({
Name: 'EndSessionDialog', Name: 'EndSessionDialog',
Extends: ModalDialog.ModalDialog, Extends: ModalDialog.ModalDialog,
@ -295,8 +323,8 @@ const EndSessionDialog = new Lang.Class({
scrollView.hide(); scrollView.hide();
})); }));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(EndSessionDialogIface, this); this._exporter = new EndSessionExporter();
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SessionManager/EndSessionDialog'); this._exporter.connect('open', Lang.bind(this, this._onOpenRequest));
}, },
_onDestroy: function() { _onDestroy: function() {
@ -387,19 +415,19 @@ const EndSessionDialog = new Lang.Class({
close: function() { close: function() {
this.parent(); this.parent();
this._dbusImpl.emit_signal('Closed', null); this._exporter.close();
}, },
cancel: function() { cancel: function() {
this._stopTimer(); this._stopTimer();
this._dbusImpl.emit_signal('Canceled', null); this._exporter.cancel();
this.close(global.get_current_time()); this.close(global.get_current_time());
}, },
_confirm: function(signal) { _confirm: function(signal) {
this._fadeOutDialog(); this._fadeOutDialog();
this._stopTimer(); this._stopTimer();
this._dbusImpl.emit_signal(signal, null); this._exporter.confirm(signal);
}, },
_onOpened: function() { _onOpened: function() {
@ -452,7 +480,7 @@ const EndSessionDialog = new Lang.Class({
this._updateContent(); this._updateContent();
}, },
OpenAsync: function(parameters, invocation) { _onOpenRequest: function(exporter, parameters, invocation) {
let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters; let [type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths] = parameters;
this._totalSecondsToStayOpen = totalSecondsToStayOpen; this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._inhibitors = []; this._inhibitors = [];
@ -466,7 +494,10 @@ const EndSessionDialog = new Lang.Class({
} }
for (let i = 0; i < inhibitorObjectPaths.length; i++) { for (let i = 0; i < inhibitorObjectPaths.length; i++) {
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i], Lang.bind(this, function(proxy, error) { let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]);
inhibitor.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._onInhibitorLoaded(proxy); this._onInhibitorLoaded(proxy);
})); }));

View File

@ -2,7 +2,6 @@
const Caribou = imports.gi.Caribou; const Caribou = imports.gi.Caribou;
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk; const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
@ -191,13 +190,14 @@ const Key = new Lang.Class({
} }
}); });
const Keyboard = new Lang.Class({ const Keyboard = new Gio.DBusImplementerClass({
// HACK: we can't set Name, because it collides with Name dbus property // HACK: we can't set Name, because it collides with Name dbus property
// Name: 'Keyboard', // Name: 'Keyboard',
Interface: CaribouKeyboardIface,
_init: function () { _init: function () {
this._impl = Gio.DBusExportedObject.wrapJSObject(CaribouKeyboardIface, this); this.parent();
this._impl.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard'); this.export(Gio.DBus.session, '/org/gnome/Caribou/Keyboard');
this.actor = null; this.actor = null;
this._focusInTray = false; this._focusInTray = false;

View File

@ -104,7 +104,7 @@ const LayoutManager = new Lang.Class({
this.primaryMonitor = null; this.primaryMonitor = null;
this.primaryIndex = -1; this.primaryIndex = -1;
this._hotCorners = []; this._hotCorners = [];
this._rootPixmap = null; this._background = null;
this._leftPanelBarrier = 0; this._leftPanelBarrier = 0;
this._rightPanelBarrier = 0; this._rightPanelBarrier = 0;
this._trayBarrier = 0; this._trayBarrier = 0;
@ -333,30 +333,30 @@ const LayoutManager = new Lang.Class({
// to the greeter. Otherwise, we'll just animate the panel, // to the greeter. Otherwise, we'll just animate the panel,
// as usual. // as usual.
if (Main.sessionMode.isGreeter) { if (Main.sessionMode.isGreeter) {
this._rootPixmap = global.create_xrootpmap_texture(); this._background = Meta.BackgroundActor.new_for_screen(global.screen);
if (this._rootPixmap != null) { if (this._background != null) {
Main.uiGroup.add_actor(this._rootPixmap); Main.uiGroup.add_actor(this._background);
Tweener.addTween(this._rootPixmap, Tweener.addTween(this._background,
{ opacity: 0, { opacity: 0,
time: PLYMOUTH_TRANSITION_TIME, time: PLYMOUTH_TRANSITION_TIME,
transition: 'linear', transition: 'linear',
onComplete: this._fadeRootpmapComplete, onComplete: this._fadeBackgroundComplete,
onCompleteScope: this }); onCompleteScope: this });
plymouthTransitionRunning = true; plymouthTransitionRunning = true;
} }
} }
if (!plymouthTransitionRunning) if (!plymouthTransitionRunning)
this._fadeRootpmapComplete(); this._fadeBackgroundComplete();
}, },
_fadeRootpmapComplete: function() { _fadeBackgroundComplete: function() {
// Don't animate the strut // Don't animate the strut
this._chrome.freezeUpdateRegions(); this._chrome.freezeUpdateRegions();
if (this._rootPixmap != null) { if (this._background != null) {
this._rootPixmap.destroy(); this._background.destroy();
this._rootPixmap = null; this._background = null;
} }
Tweener.addTween(this.panelBox, Tweener.addTween(this.panelBox,

View File

@ -96,14 +96,15 @@ const ZoomRegionIface = <interface name={ZOOM_SERVICE_NAME}>
// '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc. // '/org/gnome/Magnifier/ZoomRegion/zoomer1', etc.
let _zoomRegionInstanceCount = 0; let _zoomRegionInstanceCount = 0;
const ShellMagnifier = new Lang.Class({ const ShellMagnifier = new Gio.DBusImplementerClass({
Name: 'ShellMagnifier', Name: 'ShellMagnifier',
Interface: MagnifierIface,
_init: function() { _init: function() {
this._zoomers = {}; this.parent();
this.export(Gio.DBus.session, MAG_SERVICE_PATH);
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MagnifierIface, this); this._zoomers = {};
this._dbusImpl.export(Gio.DBus.session, MAG_SERVICE_PATH);
}, },
/** /**
@ -332,14 +333,15 @@ const ShellMagnifier = new Lang.Class({
* @zoomerObjectPath: String that is the path to a DBus ZoomRegion. * @zoomerObjectPath: String that is the path to a DBus ZoomRegion.
* @zoomRegion: The actual zoom region associated with the object path. * @zoomRegion: The actual zoom region associated with the object path.
*/ */
const ShellMagnifierZoomRegion = new Lang.Class({ const ShellMagnifierZoomRegion = new Gio.DBusImplementerClass({
Name: 'ShellMagnifierZoomRegion', Name: 'ShellMagnifierZoomRegion',
Interface: ZoomRegionIface,
_init: function(zoomerObjectPath, zoomRegion) { _init: function(zoomerObjectPath, zoomRegion) {
this._zoomRegion = zoomRegion; this.parent();
this.export(Gio.DBus.session, zoomerObjectPath);
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ZoomRegionIface, this); this._zoomRegion = zoomRegion;
this._dbusImpl.export(Gio.DBus.session, zoomerObjectPath);
}, },
/** /**
@ -417,6 +419,6 @@ const ShellMagnifierZoomRegion = new Lang.Class({
}, },
destroy: function() { destroy: function() {
this._dbusImpl.unexport(); this.unexport();
} }
}); });

View File

@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@ -35,8 +36,6 @@ const LONGER_SUMMARY_TIMEOUT = 4;
const HIDE_TIMEOUT = 0.2; const HIDE_TIMEOUT = 0.2;
const LONGER_HIDE_TIMEOUT = 0.6; const LONGER_HIDE_TIMEOUT = 0.6;
const NOTIFICATION_ICON_SIZE = 24;
// We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD // We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD
// range from the point where it left the tray. // range from the point where it left the tray.
const MOUSE_LEFT_ACTOR_THRESHOLD = 20; const MOUSE_LEFT_ACTOR_THRESHOLD = 20;
@ -143,14 +142,9 @@ const URLHighlighter = new Lang.Class({
let url = this._urls[urlId].url; let url = this._urls[urlId].url;
if (url.indexOf(':') == -1) if (url.indexOf(':') == -1)
url = 'http://' + url; url = 'http://' + url;
try {
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context()); Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context());
return true; return true;
} catch (e) {
// TODO: remove this after gnome 3 release
Util.spawn(['gvfs-open', url]);
return true;
}
} }
return false; return false;
})); }));
@ -243,9 +237,7 @@ function makeCloseButton() {
closeButton.connect('style-changed', function() { closeButton.connect('style-changed', function() {
let themeNode = closeButton.get_theme_node(); let themeNode = closeButton.get_theme_node();
closeButton.translation_x = themeNode.get_length('-shell-close-overlap-x'); closeButton.translation_x = themeNode.get_length('-shell-close-overlap-x');
closeButton.translation_y = themeNode.get_length('-shell-close-overlap-y');
// libcroco doesn't support negative units
closeButton.translation_y = -themeNode.get_length('-shell-close-overlap-y');
}); });
return closeButton; return closeButton;
@ -291,9 +283,12 @@ function makeCloseButton() {
// If @params contains a 'body' parameter, then that text will be added to // If @params contains a 'body' parameter, then that text will be added to
// the content area (as with addBody()). // the content area (as with addBody()).
// //
// By default, the icon shown is created by calling // By default, the icon shown is the same as the source's.
// source.createIcon(). However, if @params contains an 'icon' // However, if @params contains a 'gicon' parameter, the passed in gicon
// parameter, the passed in icon will be used. // will be used.
//
// You can add a secondary icon to the banner with 'secondaryGIcon'. There
// is no fallback for this icon.
// //
// If @params contains a 'titleMarkup', 'bannerMarkup', or // If @params contains a 'titleMarkup', 'bannerMarkup', or
// 'bodyMarkup' parameter with the value %true, then the corresponding // 'bodyMarkup' parameter with the value %true, then the corresponding
@ -308,6 +303,8 @@ function makeCloseButton() {
const Notification = new Lang.Class({ const Notification = new Lang.Class({
Name: 'Notification', Name: 'Notification',
ICON_SIZE: 24,
IMAGE_SIZE: 125, IMAGE_SIZE: 125,
_init: function(source, title, banner, params) { _init: function(source, title, banner, params) {
@ -391,8 +388,8 @@ const Notification = new Lang.Class({
update: function(title, banner, params) { update: function(title, banner, params) {
params = Params.parse(params, { customContent: false, params = Params.parse(params, { customContent: false,
body: null, body: null,
icon: null, gicon: null,
secondaryIcon: null, secondaryGIcon: null,
titleMarkup: false, titleMarkup: false,
bannerMarkup: false, bannerMarkup: false,
bodyMarkup: false, bodyMarkup: false,
@ -402,12 +399,12 @@ const Notification = new Lang.Class({
let oldFocus = global.stage.key_focus; let oldFocus = global.stage.key_focus;
if (this._icon && (params.icon || params.clear)) { if (this._icon && (params.gicon || params.clear)) {
this._icon.destroy(); this._icon.destroy();
this._icon = null; this._icon = null;
} }
if (this._secondaryIcon && (params.secondaryIcon || params.clear)) { if (this._secondaryIcon && (params.secondaryGIcon || params.clear)) {
this._secondaryIcon.destroy(); this._secondaryIcon.destroy();
this._secondaryIcon = null; this._secondaryIcon = null;
} }
@ -437,8 +434,14 @@ const Notification = new Lang.Class({
if (!this._scrollArea && !this._actionArea && !this._imageBin) if (!this._scrollArea && !this._actionArea && !this._imageBin)
this._table.remove_style_class_name('multi-line-notification'); this._table.remove_style_class_name('multi-line-notification');
if (!this._icon) { if (params.gicon) {
this._icon = params.icon || this.source.createIcon(NOTIFICATION_ICON_SIZE); this._icon = new St.Icon({ gicon: params.gicon,
icon_size: this.ICON_SIZE });
} else {
this._icon = this.source.createIcon(this.ICON_SIZE);
}
if (this._icon) {
this._table.add(this._icon, { row: 0, this._table.add(this._icon, { row: 0,
col: 0, col: 0,
x_expand: false, x_expand: false,
@ -447,11 +450,10 @@ const Notification = new Lang.Class({
y_align: St.Align.START }); y_align: St.Align.START });
} }
if (!this._secondaryIcon) { if (params.secondaryGIcon) {
this._secondaryIcon = params.secondaryIcon; this._secondaryIcon = new St.Icon({ gicon: params.secondaryGIcon,
style_class: 'secondary-icon' });
if (this._secondaryIcon) this._bannerBox.add_actor(this._secondaryIcon);
this._bannerBox.add_actor(this._secondaryIcon);
} }
this.title = title; this.title = title;
@ -1114,10 +1116,14 @@ const Source = new Lang.Class({
// Provides a sane default implementation, override if you need // Provides a sane default implementation, override if you need
// something more fancy. // something more fancy.
createIcon: function(size) { createIcon: function(size) {
return new St.Icon({ icon_name: this.iconName, return new St.Icon({ gicon: this.getIcon(),
icon_size: size }); icon_size: size });
}, },
getIcon: function() {
return new Gio.ThemedIcon({ name: this.iconName });
},
_ensureMainIcon: function() { _ensureMainIcon: function() {
if (this._mainIcon) if (this._mainIcon)
return; return;
@ -1231,12 +1237,6 @@ const SummaryItem = new Lang.Class({
this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() }); this.notificationStackWidget = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._closeButton = makeCloseButton();
this._closeButton.connect('clicked', Lang.bind(this, function() {
source.destroy();
source.emit('done-displaying-content');
}));
this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview', this.notificationStackView = new St.ScrollView({ style_class: source.isChat ? '' : 'summary-notification-stack-scrollview',
vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC, vscrollbar_policy: source.isChat ? Gtk.PolicyType.NEVER : Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER }); hscrollbar_policy: Gtk.PolicyType.NEVER });
@ -1245,7 +1245,9 @@ const SummaryItem = new Lang.Class({
vertical: true }); vertical: true });
this.notificationStackView.add_actor(this.notificationStack); this.notificationStackView.add_actor(this.notificationStack);
this.notificationStackWidget.add_actor(this.notificationStackView); this.notificationStackWidget.add_actor(this.notificationStackView);
this.notificationStackWidget.add_actor(this._closeButton);
this.closeButton = makeCloseButton();
this.notificationStackWidget.add_actor(this.closeButton);
this._stackedNotifications = []; this._stackedNotifications = [];
this._oldMaxScrollAdjustment = 0; this._oldMaxScrollAdjustment = 0;
@ -1262,14 +1264,6 @@ const SummaryItem = new Lang.Class({
global.focus_manager.add_group(this.rightClickMenu); global.focus_manager.add_group(this.rightClickMenu);
}, },
get closeButtonVisible() {
return this._closeButton.visible;
},
set closeButtonVisible(v) {
this._closeButton.visible = v;
},
_onKeyPress: function(actor, event) { _onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Up) { if (event.get_key_symbol() == Clutter.KEY_Up) {
actor.emit('clicked', 1); actor.emit('clicked', 1);
@ -1371,13 +1365,16 @@ const MessageTray = new Lang.Class({
Name: 'MessageTray', Name: 'MessageTray',
_init: function() { _init: function() {
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) { this._presence = new GnomeSession.Presence();
this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._onStatusChanged(proxy.status); this._onStatusChanged(proxy.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
})); }));
this._busy = false; this._busy = false;
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
this.actor = new St.Widget({ name: 'message-tray', this.actor = new St.Widget({ name: 'message-tray',
reactive: true, reactive: true,
@ -1447,10 +1444,10 @@ const MessageTray = new Lang.Class({
this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked)); this._closeButton.connect('clicked', Lang.bind(this, this._onCloseClicked));
this._notificationWidget.add_actor(this._closeButton); this._notificationWidget.add_actor(this._closeButton);
this._idleMonitorWatchId = 0; this._idleMonitorBecameActiveId = 0;
this._userActiveWhileNotificationShown = false; this._userActiveWhileNotificationShown = false;
this.idleMonitor = Shell.IdleMonitor.get(); this.idleMonitor = new GnomeDesktop.IdleMonitor();
this._grabHelper = new GrabHelper.GrabHelper(this.actor); this._grabHelper = new GrabHelper.GrabHelper(this.actor);
this._grabHelper.addActor(this._summaryBoxPointer.actor); this._grabHelper.addActor(this._summaryBoxPointer.actor);
@ -1597,12 +1594,9 @@ const MessageTray = new Lang.Class({
_onCloseClicked: function() { _onCloseClicked: function() {
if (this._notificationState == State.SHOWN) { if (this._notificationState == State.SHOWN) {
this._closeButton.hide();
this._notificationClosed = true; this._notificationClosed = true;
this._notification.emit('done-displaying'); this._updateState();
if (!this._notification.resident)
this._notification.destroy();
this._notificationClosed = false; this._notificationClosed = false;
} }
}, },
@ -2095,9 +2089,8 @@ const MessageTray = new Lang.Class({
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
if (this._overviewVisible) { if (!this._overviewVisible)
this._lightbox.show(); this._lightbox.show();
}
return true; return true;
}, },
@ -2135,6 +2128,10 @@ const MessageTray = new Lang.Class({
}, },
_hideTray: function() { _hideTray: function() {
// Having the summary item animate out while sliding down the tray
// is distracting, so hide it immediately in case it was visible.
this._summaryBoxPointer.actor.hide();
this._tween(this.actor, '_trayState', State.HIDDEN, this._tween(this.actor, '_trayState', State.HIDDEN,
{ y: 0, { y: 0,
time: ANIMATION_TIME, time: ANIMATION_TIME,
@ -2162,20 +2159,26 @@ const MessageTray = new Lang.Class({
}); });
}, },
_onIdleMonitorWatch: function(monitor, id, userBecameIdle) { _onIdleMonitorBecameActive: function() {
this.idleMonitor.remove_watch(this._idleMonitorWatchId); this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
this._idleMonitorWatchId = 0; this._idleMonitorBecameActiveId = 0;
if (!userBecameIdle)
this._updateNotificationTimeout(2000);
this._userActiveWhileNotificationShown = true; this._userActiveWhileNotificationShown = true;
this._updateNotificationTimeout(2000);
this._updateState(); this._updateState();
}, },
_showNotification: function() { _showNotification: function() {
this._notification = this._notificationQueue.shift(); this._notification = this._notificationQueue.shift();
this._userActiveWhileNotificationShown = this.idleMonitor.get_idletime() <= IDLE_TIME;
this._idleMonitorWatchId = this.idleMonitor.add_watch(IDLE_TIME, let userIdle = this.idleMonitor.get_idletime() > IDLE_TIME;
Lang.bind(this, this._onIdleMonitorWatch)); if (userIdle) {
this._userActiveWhileNotificationShown = false;
this._idleMonitorBecameActiveId = this.idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
} else {
this._userActiveWhileNotificationShown = true;
}
this._notificationClickedId = this._notification.connect('done-displaying', this._notificationClickedId = this._notification.connect('done-displaying',
Lang.bind(this, this._escapeTray)); Lang.bind(this, this._escapeTray));
this._notification.connect('unfocused', Lang.bind(this, function() { this._notification.connect('unfocused', Lang.bind(this, function() {
@ -2288,6 +2291,11 @@ const MessageTray = new Lang.Class({
_hideNotification: function() { _hideNotification: function() {
this._grabHelper.ungrab({ actor: this._notification.actor }); this._grabHelper.ungrab({ actor: this._notification.actor });
if (this._idleMonitorBecameActiveId) {
this.idleMonitor.disconnect(this._idleMonitorBecameActiveId);
this._idleMonitorBecameActiveId = 0;
}
if (this._notificationExpandedId) { if (this._notificationExpandedId) {
this._notification.disconnect(this._notificationExpandedId); this._notification.disconnect(this._notificationExpandedId);
this._notificationExpandedId = 0; this._notificationExpandedId = 0;
@ -2403,7 +2411,10 @@ const MessageTray = new Lang.Class({
this._notificationQueue = newQueue; this._notificationQueue = newQueue;
this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget; this._summaryBoxPointer.bin.child = this._summaryBoxPointerItem.notificationStackWidget;
this._summaryBoxPointerItem.closeButtonVisible = true;
let closeButton = this._summaryBoxPointerItem.closeButton;
closeButton.show();
this._summaryBoxPointerCloseClickedId = closeButton.connect('clicked', Lang.bind(this, this._hideSummaryBoxPointer));
this._summaryBoxPointerItem.prepareNotificationStackForShowing(); this._summaryBoxPointerItem.prepareNotificationStackForShowing();
} else if (this._clickedSummaryItemMouseButton == 3) { } else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu; this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
@ -2513,6 +2524,8 @@ const MessageTray = new Lang.Class({
this._summaryBoxPointer.bin.child = null; this._summaryBoxPointer.bin.child = null;
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId); this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
this._summaryBoxPointerContentUpdatedId = 0; this._summaryBoxPointerContentUpdatedId = 0;
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
this._summaryBoxPointerCloseClickedId = 0;
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId); this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
this._summaryBoxPointerDoneDisplayingId = 0; this._summaryBoxPointerDoneDisplayingId = 0;

View File

@ -20,7 +20,6 @@ const Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const OPEN_AND_CLOSE_TIME = 0.1; const OPEN_AND_CLOSE_TIME = 0.1;
const FADE_IN_BUTTONS_TIME = 0.33;
const FADE_OUT_DIALOG_TIME = 1.0; const FADE_OUT_DIALOG_TIME = 1.0;
const State = { const State = {
@ -117,8 +116,6 @@ const ModalDialog = new Lang.Class({
}, },
setButtons: function(buttons) { setButtons: function(buttons) {
let hadChildren = this._buttonLayout.get_children() > 0;
this._buttonLayout.destroy_all_children(); this._buttonLayout.destroy_all_children();
this._actionKeys = {}; this._actionKeys = {};
@ -169,21 +166,7 @@ const ModalDialog = new Lang.Class({
this._actionKeys[key] = action; this._actionKeys[key] = action;
} }
// Fade in buttons if there weren't any before this.emit('buttons-set');
if (!hadChildren && buttons.length > 0) {
this._buttonLayout.opacity = 0;
Tweener.addTween(this._buttonLayout,
{ opacity: 255,
time: FADE_IN_BUTTONS_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.emit('buttons-set');
})
});
} else {
this.emit('buttons-set');
}
}, },
_onKeyReleaseEvent: function(object, event) { _onKeyReleaseEvent: function(object, event) {

View File

@ -25,10 +25,19 @@ const BusIface = <interface name="org.freedesktop.DBus">
</method> </method>
</interface>; </interface>;
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface); const Bus = new Gio.DBusProxyClass({
function Bus() { Name: 'SessionBusProxy',
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus'); Interface: BusIface,
}
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.freedesktop.DBus',
g_object_path: '/org/freedesktop/DBus',
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES |
Gio.DBusProxyFlags.DO_NOT_CONNECT_SIGNALS |
Gio.DBusProxyFlags.DO_NOT_AUTO_START) });
}
});
const NotificationDaemonIface = <interface name="org.freedesktop.Notifications"> const NotificationDaemonIface = <interface name="org.freedesktop.Notifications">
<method name="Notify"> <method name="Notify">
@ -103,17 +112,20 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'ibus-ui-gtk': 'keyboard' 'ibus-ui-gtk': 'keyboard'
}; };
const NotificationDaemon = new Lang.Class({ const NotificationDaemon = new Gio.DBusImplementerClass({
Name: 'NotificationDaemon', Name: 'NotificationDaemon',
Interface: NotificationDaemonIface,
_init: function() { _init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this); this.parent();
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); this.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this._sources = []; this._sources = [];
this._senderToPid = {}; this._senderToPid = {};
this._notifications = {}; this._notifications = {};
this._busProxy = new Bus(); this._busProxy = new Bus();
// This is synchronous but fast because of the flags we use.
this._busProxy.init(null);
this._trayManager = new Shell.TrayManager(); this._trayManager = new Shell.TrayManager();
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded)); this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
@ -316,18 +328,20 @@ const NotificationDaemon = new Lang.Class({
return invocation.return_value(GLib.Variant.new('(u)', [id]));; return invocation.return_value(GLib.Variant.new('(u)', [id]));;
} }
this._busProxy.GetConnectionUnixProcessIDRemote(sender, Lang.bind(this, function (result, excp) { this._busProxy.GetConnectionUnixProcessIDRemote(sender, null, Lang.bind(this, function (proxy, result) {
// The app may have updated or removed the notification // The app may have updated or removed the notification
ndata = this._notifications[id]; ndata = this._notifications[id];
if (!ndata) if (!ndata)
return; return;
if (excp) { let pid;
try {
[pid] = proxy.GetConnectionUnixProcessIDFinish(result);
} catch(excp) {
logError(excp, 'Call to GetConnectionUnixProcessID failed'); logError(excp, 'Call to GetConnectionUnixProcessID failed');
return; return;
} }
let [pid] = result;
source = this._getSource(appName, pid, ndata, sender, null); source = this._getSource(appName, pid, ndata, sender, null);
// We only store sender-pid entries for persistent sources. // We only store sender-pid entries for persistent sources.
@ -356,12 +370,10 @@ const NotificationDaemon = new Lang.Class({
ndata.actions, ndata.hints, ndata.notification]; ndata.actions, ndata.hints, ndata.notification];
let gicon = this._iconForNotificationData(icon, hints); let gicon = this._iconForNotificationData(icon, hints);
let iconActor = new St.Icon({ gicon: gicon,
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
if (notification == null) { if (notification == null) {
notification = new MessageTray.Notification(source, summary, body, notification = new MessageTray.Notification(source, summary, body,
{ icon: iconActor, { gicon: gicon,
bannerMarkup: true }); bannerMarkup: true });
ndata.notification = notification; ndata.notification = notification;
notification.connect('destroy', Lang.bind(this, notification.connect('destroy', Lang.bind(this,
@ -386,7 +398,7 @@ const NotificationDaemon = new Lang.Class({
this._emitActionInvoked(ndata.id, actionId); this._emitActionInvoked(ndata.id, actionId);
})); }));
} else { } else {
notification.update(summary, body, { icon: iconActor, notification.update(summary, body, { gicon: gicon,
bannerMarkup: true, bannerMarkup: true,
clear: true }); clear: true });
} }
@ -489,13 +501,11 @@ const NotificationDaemon = new Lang.Class({
}, },
_emitNotificationClosed: function(id, reason) { _emitNotificationClosed: function(id, reason) {
this._dbusImpl.emit_signal('NotificationClosed', this.emit_signal('NotificationClosed', id, reason);
GLib.Variant.new('(uu)', [id, reason]));
}, },
_emitActionInvoked: function(id, action) { _emitActionInvoked: function(id, action) {
this._dbusImpl.emit_signal('ActionInvoked', this.emit_signal('ActionInvoked', id, action);
GLib.Variant.new('(us)', [id, action]));
}, },
_onTrayIconAdded: function(o, icon) { _onTrayIconAdded: function(o, icon) {

View File

@ -23,8 +23,8 @@ const WorkspaceThumbnail = imports.ui.workspaceThumbnail;
// Time for initial animation going into Overview mode // Time for initial animation going into Overview mode
const ANIMATION_TIME = 0.25; const ANIMATION_TIME = 0.25;
// We split the screen vertically between the dash and the view selector. // XXX -- grab this automatically. Hard to do.
const DASH_SPLIT_FRACTION = 0.1; const DASH_MAX_WIDTH = 96;
const DND_WINDOW_SWITCH_TIMEOUT = 1250; const DND_WINDOW_SWITCH_TIMEOUT = 1250;
@ -502,7 +502,7 @@ const Overview = new Lang.Class({
let searchX = (primary.width - searchWidth) / 2; let searchX = (primary.width - searchWidth) / 2;
let searchY = contentY + this._spacing; let searchY = contentY + this._spacing;
let dashWidth = Math.round(DASH_SPLIT_FRACTION * primary.width); let dashWidth = DASH_MAX_WIDTH;
let dashY = searchY + searchHeight + this._spacing; let dashY = searchY + searchHeight + this._spacing;
let dashX; let dashX;
if (rtl) { if (rtl) {

View File

@ -247,6 +247,10 @@ const AppMenuButton = new Lang.Class({
this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight)); this._container.connect('get-preferred-height', Lang.bind(this, this._getContentPreferredHeight));
this._container.connect('allocate', Lang.bind(this, this._contentAllocate)); this._container.connect('allocate', Lang.bind(this, this._contentAllocate));
let textureCache = St.TextureCache.get_default();
textureCache.connect('icon-theme-changed',
Lang.bind(this, this._onIconThemeChanged));
this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' }); this._iconBox = new Shell.Slicer({ name: 'appMenuIcon' });
this._iconBox.connect('style-changed', this._iconBox.connect('style-changed',
Lang.bind(this, this._onIconBoxStyleChanged)); Lang.bind(this, this._onIconBoxStyleChanged));
@ -332,6 +336,15 @@ const AppMenuButton = new Lang.Class({
this._updateIconBoxClip(); this._updateIconBoxClip();
}, },
_onIconThemeChanged: function() {
if (this._iconBox.child == null)
return;
this._iconBox.child.destroy();
let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._iconBox.set_child(icon);
},
_updateIconBoxClip: function() { _updateIconBoxClip: function() {
let allocation = this._iconBox.allocation; let allocation = this._iconBox.allocation;
if (this._iconBottomClip > 0) if (this._iconBottomClip > 0)
@ -901,6 +914,7 @@ const PANEL_ITEM_IMPLEMENTATIONS = {
'volume': imports.ui.status.volume.Indicator, 'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator, 'battery': imports.ui.status.power.Indicator,
'lockScreen': imports.ui.status.lockScreenMenu.Indicator, 'lockScreen': imports.ui.status.lockScreenMenu.Indicator,
'logo': imports.gdm.loginDialog.LogoMenuButton,
'keyboard': imports.ui.status.keyboard.InputSourceIndicator, 'keyboard': imports.ui.status.keyboard.InputSourceIndicator,
'powerMenu': imports.gdm.powerMenu.PowerMenuButton, 'powerMenu': imports.gdm.powerMenu.PowerMenuButton,
'userMenu': imports.ui.userMenu.UserMenuButton 'userMenu': imports.ui.userMenu.UserMenuButton

View File

@ -214,7 +214,8 @@ const Button = new Lang.Class({
destroy: function() { destroy: function() {
this.actor._delegate = null; this.actor._delegate = null;
this.menu.destroy(); if (this.menu)
this.menu.destroy();
this.actor.destroy(); this.actor.destroy();
this.emit('destroy'); this.emit('destroy');

View File

@ -2,6 +2,7 @@
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
// We stop polling if the user is idle for more than this amount of time // We stop polling if the user is idle for more than this amount of time
@ -40,9 +41,9 @@ const PointerWatcher = new Lang.Class({
Name: 'PointerWatcher', Name: 'PointerWatcher',
_init: function() { _init: function() {
let idleMonitor = Shell.IdleMonitor.get(); let idleMonitor = new GnomeDesktop.IdleMonitor();
idleMonitor.add_watch(IDLE_TIME, idleMonitor.connect('became-active', Lang.bind(this, this._onIdleMonitorBecameActive));
Lang.bind(this, this._onIdleMonitorWatch)); idleMonitor.add_watch(IDLE_TIME, Lang.bind(this, this._onIdleMonitorBecameIdle));
this._idle = idleMonitor.get_idletime() > IDLE_TIME; this._idle = idleMonitor.get_idletime() > IDLE_TIME;
this._watches = []; this._watches = [];
this.pointerX = null; this.pointerX = null;
@ -78,11 +79,14 @@ const PointerWatcher = new Lang.Class({
} }
}, },
_onIdleMonitorWatch: function(monitor, id, userBecameIdle) { _onIdleMonitorBecameActive: function(monitor) {
this._idle = userBecameIdle; this._idle = false;
if (!userBecameIdle) this._updatePointer();
this._updatePointer(); this._updateTimeout();
},
_onIdleMonitorBecameIdle: function(monitor) {
this._idle = true;
this._updateTimeout(); this._updateTimeout();
}, },

View File

@ -1269,13 +1269,14 @@ const PopupMenu = new Lang.Class({
}, },
close: function(animate) { close: function(animate) {
if (!this.isOpen)
return;
if (this._activeMenuItem) if (this._activeMenuItem)
this._activeMenuItem.setActive(false); this._activeMenuItem.setActive(false);
this._boxPointer.hide(animate); if (this._boxPointer.actor.visible)
this._boxPointer.hide(animate);
if (!this.isOpen)
return;
this.isOpen = false; this.isOpen = false;
this.emit('open-state-changed', false); this.emit('open-state-changed', false);

View File

@ -29,8 +29,15 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
</method> </method>
</interface>; </interface>;
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface); var SearchProviderProxy = new Gio.DBusProxyClass({
Name: 'SearchProviderProxy',
Interface: SearchProviderIface,
_init: function(params) {
params.g_bus_type = Gio.BusType.SESSION;
this.parent(params);
}
});
function loadRemoteSearchProviders(addProviderCallback) { function loadRemoteSearchProviders(addProviderCallback) {
let dataDirs = GLib.get_system_data_dirs(); let dataDirs = GLib.get_system_data_dirs();
@ -90,13 +97,22 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
icon, icon,
busName, busName,
objectPath); objectPath);
remoteProvider.initAsync(null, function(obj, result) {
try {
remoteProvider.initFinish(result);
} catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString()));
return;
}
addProviderCallback(remoteProvider);
});
loadedProviders[objectPath] = remoteProvider; loadedProviders[objectPath] = remoteProvider;
} catch(e) { } catch(e) {
log('Failed to add search provider "%s": %s'.format(title, e.toString())); log('Failed to add search provider "%s": %s'.format(title, e.toString()));
continue; continue;
} }
addProviderCallback(remoteProvider);
} }
})); }));
@ -107,13 +123,41 @@ const RemoteSearchProvider = new Lang.Class({
Extends: Search.SearchProvider, Extends: Search.SearchProvider,
_init: function(title, icon, dbusName, dbusPath) { _init: function(title, icon, dbusName, dbusPath) {
this._proxy = new SearchProviderProxy(Gio.DBus.session,
dbusName, dbusPath);
this.parent(title.toUpperCase()); this.parent(title.toUpperCase());
this._proxy = new SearchProviderProxy({ g_name: dbusName,
g_object_path: dbusPath });
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
}, },
initAsync: function(cancellable, asyncCallback) {
// Can't pass "this" as source object, because RemoteSearchProvider
// is not a GObject.Object (and in gjs you can't inherit from a JS
// type that in turn inherits from GObject)
let simpleResult = Gio.SimpleAsyncResult.new(null, asyncCallback, null);
simpleResult.set_check_cancellable(cancellable);
this._proxy.init_async(GLib.PRIORITY_DEFAULT, cancellable, Lang.bind(this, function(proxy, result) {
try {
proxy.init_finish(result);
simpleResult.set_op_res_gboolean(true);
} catch(e if e instanceof GLib.Error) {
simpleResult.set_from_error(e);
}
simpleResult.complete();
}));
},
initFinish: function(simpleResult) {
if (!simpleResult.propagate_error())
return simpleResult.get_op_res_gboolean();
return false;
},
createIcon: function(size, meta) { createIcon: function(size, meta) {
if (meta['gicon']) { if (meta['gicon']) {
return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']), return new St.Icon({ gicon: Gio.icon_new_for_string(meta['gicon']),
@ -131,10 +175,17 @@ const RemoteSearchProvider = new Lang.Class({
icon_size: size }); icon_size: size });
}, },
_getResultsFinished: function(results, error) { _getResultsFinished: function(proxy, result) {
if (error) try {
return; // We rely on a small implementation detail of the
this.searchSystem.pushResults(this, results[0]); // GDBus bindings here: all *Finish are equal
let [results] = proxy.GetInitialResultSetFinish(result);
this.searchSystem.pushResults(this, results);
} catch(e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from search provider %s: %s'.format(this.title, String(e)));
}
}, },
getInitialResultSet: function(terms) { getInitialResultSet: function(terms) {
@ -142,8 +193,8 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset(); this._cancellable.reset();
try { try {
this._proxy.GetInitialResultSetRemote(terms, this._proxy.GetInitialResultSetRemote(terms,
Lang.bind(this, this._getResultsFinished), this._cancellable,
this._cancellable); Lang.bind(this, this._getResultsFinished));
} catch(e) { } catch(e) {
log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString())); log('Error calling GetInitialResultSet for provider %s: %s'.format( this.title, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.pushResults(this, []);
@ -155,30 +206,30 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset(); this._cancellable.reset();
try { try {
this._proxy.GetSubsearchResultSetRemote(previousResults, newTerms, this._proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
Lang.bind(this, this._getResultsFinished), this._cancellable,
this._cancellable); Lang.bind(this, this._getResultsFinished))
} catch(e) { } catch(e) {
log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString())); log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.title, e.toString()));
this.searchSystem.pushResults(this, []); this.searchSystem.pushResults(this, []);
} }
}, },
_getResultMetasFinished: function(results, error, callback) { _getResultMetasFinished: function(proxy, result, callback) {
if (error) { try {
let [metas] = results.GetResultMetasFinish(result);
let resultMetas = [];
for (let i = 0; i < metas.length; i++) {
for (let prop in metas[i])
metas[i][prop] = metas[i][prop].deep_unpack();
resultMetas.push({ id: metas[i]['id'],
name: metas[i]['name'],
createIcon: Lang.bind(this,
this.createIcon, metas[i]) });
}
callback(resultMetas);
} catch(e) {
callback([]); callback([]);
return;
} }
let metas = results[0];
let resultMetas = [];
for (let i = 0; i < metas.length; i++) {
for (let prop in metas[i])
metas[i][prop] = metas[i][prop].deep_unpack();
resultMetas.push({ id: metas[i]['id'],
name: metas[i]['name'],
createIcon: Lang.bind(this,
this.createIcon, metas[i]) });
}
callback(resultMetas);
}, },
getResultMetas: function(ids, callback) { getResultMetas: function(ids, callback) {
@ -186,8 +237,8 @@ const RemoteSearchProvider = new Lang.Class({
this._cancellable.reset(); this._cancellable.reset();
try { try {
this._proxy.GetResultMetasRemote(ids, this._proxy.GetResultMetasRemote(ids,
Lang.bind(this, this._getResultMetasFinished, callback), this._cancellable,
this._cancellable); Lang.bind(this, this._getResultMetasFinished, callback));
} catch(e) { } catch(e) {
log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString())); log('Error calling GetResultMetas for provider %s: %s'.format(this.title, e.toString()));
callback([]); callback([]);
@ -195,7 +246,7 @@ const RemoteSearchProvider = new Lang.Class({
}, },
activateResult: function(id) { activateResult: function(id) {
this._proxy.ActivateResultRemote(id); this._proxy.ActivateResultRemote(id, null, null);
} }
}); });

View File

@ -202,11 +202,12 @@ const RunDialog = new Lang.Class({
let label = new St.Label({ style_class: 'run-dialog-label', let label = new St.Label({ style_class: 'run-dialog-label',
text: _("Please enter a command:") }); text: _("Enter a Command") });
this.contentLayout.add(label, { y_align: St.Align.START }); this.contentLayout.add(label, { y_align: St.Align.START });
let entry = new St.Entry({ style_class: 'run-dialog-entry' }); let entry = new St.Entry({ style_class: 'run-dialog-entry',
can_focus: true });
ShellEntry.addContextMenu(entry); ShellEntry.addContextMenu(entry);
entry.label_actor = label; entry.label_actor = label;
@ -219,7 +220,9 @@ const RunDialog = new Lang.Class({
this.contentLayout.add(this._errorBox, { expand: true }); this.contentLayout.add(this._errorBox, { expand: true });
let errorIcon = new St.Icon({ icon_name: 'dialog-error', icon_size: 24, style_class: 'run-dialog-error-icon' }); let errorIcon = new St.Icon({ icon_name: 'dialog-error-symbolic',
icon_size: 24,
style_class: 'run-dialog-error-icon' });
this._errorBox.add(errorIcon, { y_align: St.Align.MIDDLE }); this._errorBox.add(errorIcon, { y_align: St.Align.MIDDLE });
@ -234,6 +237,10 @@ const RunDialog = new Lang.Class({
this._errorBox.hide(); this._errorBox.hide();
this.setButtons([{ action: Lang.bind(this, this.close),
label: _("Close"),
key: Clutter.Escape }]);
this._pathCompleter = new Gio.FilenameCompleter(); this._pathCompleter = new Gio.FilenameCompleter();
this._commandCompleter = new CommandCompleter(); this._commandCompleter = new CommandCompleter();
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update)); this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
@ -244,20 +251,12 @@ const RunDialog = new Lang.Class({
let symbol = e.get_key_symbol(); let symbol = e.get_key_symbol();
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
this.popModal(); this.popModal();
if (e.get_state() & Clutter.ModifierType.CONTROL_MASK) this._run(o.get_text(),
this._run(o.get_text(), true); e.get_state() & Clutter.ModifierType.CONTROL_MASK);
else if (!this._commandError ||
this._run(o.get_text(), false); !this.pushModal())
if (!this._commandError)
this.close(); this.close();
else {
if (!this.pushModal())
this.close();
}
return true;
}
if (symbol == Clutter.Escape) {
this.close();
return true; return true;
} }
if (symbol == Clutter.slash) { if (symbol == Clutter.slash) {

View File

@ -21,11 +21,12 @@ const Overview = imports.ui.overview;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const ShellDBus = imports.ui.shellDBus; const ShellDBus = imports.ui.shellDBus;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Util = imports.misc.util;
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const CURTAIN_SLIDE_TIME = 0.5; const CURTAIN_SLIDE_TIME = 0.3;
// fraction of screen height the arrow must reach before completing // fraction of screen height the arrow must reach before completing
// the slide up automatically // the slide up automatically
const ARROW_DRAG_THRESHOLD = 0.1; const ARROW_DRAG_THRESHOLD = 0.1;
@ -46,7 +47,7 @@ const SUMMARY_ICON_SIZE = 48;
// STANDARD_FADE_TIME is used when the session goes idle, while // STANDARD_FADE_TIME is used when the session goes idle, while
// SHORT_FADE_TIME is used when requesting lock explicitly from the user menu // SHORT_FADE_TIME is used when requesting lock explicitly from the user menu
const STANDARD_FADE_TIME = 10; const STANDARD_FADE_TIME = 10;
const SHORT_FADE_TIME = 0.8; const SHORT_FADE_TIME = 0.3;
const Clock = new Lang.Class({ const Clock = new Lang.Class({
Name: 'ScreenShieldClock', Name: 'ScreenShieldClock',
@ -185,7 +186,7 @@ const NotificationsBox = new Lang.Class({
if (obj.resident) { if (obj.resident) {
this._residentNotificationBox.add(item.notificationStackWidget); this._residentNotificationBox.add(item.notificationStackWidget);
item.closeButtonVisible = false; item.closeButton.hide();
item.prepareNotificationStackForShowing(); item.prepareNotificationStackForShowing();
} else { } else {
[obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source); [obj.sourceBox, obj.countLabel] = this._makeNotificationSource(item.source);
@ -243,7 +244,7 @@ const NotificationsBox = new Lang.Class({
obj.resident = true; obj.resident = true;
this._residentNotificationBox.add(obj.item.notificationStackWidget); this._residentNotificationBox.add(obj.item.notificationStackWidget);
obj.item.closeButtonVisible = false; obj.item.closeButton.hide();
obj.item.prepareNotificationStackForShowing(); obj.item.prepareNotificationStackForShowing();
} else { } else {
// just update the counter // just update the counter
@ -417,10 +418,11 @@ const ScreenShield = new Lang.Class({
this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this); this._screenSaverDBus = new ShellDBus.ScreenSaverDBus(this);
this._loginManager = LoginManager.getLoginManager(); LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginSession = this._loginManager.getCurrentSessionProxy(); this._loginSession = manager.getCurrentSessionProxy();
this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); }));
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); }));
}));
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA }); this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
@ -429,6 +431,7 @@ const ScreenShield = new Lang.Class({
this._isGreeter = false; this._isGreeter = false;
this._isActive = false; this._isActive = false;
this._inUnlockAnimation = false; this._inUnlockAnimation = false;
this._activationTime = 0;
this._lightbox = new Lightbox.Lightbox(Main.uiGroup, this._lightbox = new Lightbox.Lightbox(Main.uiGroup,
{ inhibitEvents: true, { inhibitEvents: true,
@ -524,7 +527,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: 0, { y: 0,
time: time, time: time,
transition: 'linear', transition: 'easeInQuad',
onComplete: function() { onComplete: function() {
this._lockScreenGroup.fixed_position_set = false; this._lockScreenGroup.fixed_position_set = false;
this._lockScreenState = MessageTray.State.SHOWN; this._lockScreenState = MessageTray.State.SHOWN;
@ -556,8 +559,12 @@ const ScreenShield = new Lang.Class({
this._isModal = true; this._isModal = true;
} }
if (!this._isActive) if (!this._isActive) {
this._lightbox.show(); this._lightbox.show();
if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time();
}
} else { } else {
let lightboxWasShown = this._lightbox.shown; let lightboxWasShown = this._lightbox.shown;
this._lightbox.hide(); this._lightbox.hide();
@ -616,7 +623,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: -h, { y: -h,
time: time, time: time,
transition: 'linear', transition: 'easeInQuad',
onComplete: function() { onComplete: function() {
this._lockScreenState = MessageTray.State.HIDDEN; this._lockScreenState = MessageTray.State.HIDDEN;
this._lockScreenGroup.hide(); this._lockScreenGroup.hide();
@ -677,7 +684,7 @@ const ScreenShield = new Lang.Class({
Tweener.addTween(this._lockScreenGroup, Tweener.addTween(this._lockScreenGroup,
{ y: 0, { y: 0,
time: SHORT_FADE_TIME, time: SHORT_FADE_TIME,
transition: 'linear', transition: 'easeOutQuad',
onComplete: function() { onComplete: function() {
this._lockScreenShown(); this._lockScreenShown();
}, },
@ -774,6 +781,10 @@ const ScreenShield = new Lang.Class({
return this._isActive; return this._isActive;
}, },
get activationTime() {
return this._activationTime;
},
_tweenUnlocked: function() { _tweenUnlocked: function() {
this._inUnlockAnimation = true; this._inUnlockAnimation = true;
this.unlock(); this.unlock();
@ -818,6 +829,7 @@ const ScreenShield = new Lang.Class({
if (Main.sessionMode.currentMode == 'unlock-dialog') if (Main.sessionMode.currentMode == 'unlock-dialog')
Main.sessionMode.popMode('unlock-dialog'); Main.sessionMode.popMode('unlock-dialog');
this._activationTime = 0;
this._isActive = false; this._isActive = false;
this.emit('lock-status-changed'); this.emit('lock-status-changed');
}, },
@ -828,6 +840,9 @@ const ScreenShield = new Lang.Class({
this._isModal = true; this._isModal = true;
} }
if (this._activationTime == 0)
this._activationTime = GLib.get_monotonic_time();
this.actor.show(); this.actor.show();
if (Main.sessionMode.currentMode != 'unlock-dialog' && if (Main.sessionMode.currentMode != 'unlock-dialog' &&
@ -852,6 +867,8 @@ const ScreenShieldFallback = new Lang.Class({
Name: 'ScreenShieldFallback', Name: 'ScreenShieldFallback',
_init: function() { _init: function() {
Util.spawn(['gnome-screensaver']);
this._proxy = new Gio.DBusProxy({ g_connection: Gio.DBus.session, this._proxy = new Gio.DBusProxy({ g_connection: Gio.DBus.session,
g_name: 'org.gnome.ScreenSaver', g_name: 'org.gnome.ScreenSaver',
g_object_path: '/org/gnome/ScreenSaver', g_object_path: '/org/gnome/ScreenSaver',
@ -859,6 +876,7 @@ const ScreenShieldFallback = new Lang.Class({
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START | g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES), Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES),
}); });
// This is synchronous but it is the fallback case.
this._proxy.init(null); this._proxy.init(null);
this._proxy.connect('g-signal', Lang.bind(this, this._onSignal)); this._proxy.connect('g-signal', Lang.bind(this, this._onSignal));

View File

@ -80,15 +80,23 @@ const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper">
<method name="DestroyWindows" /> <method name="DestroyWindows" />
</interface>; </interface>;
var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface); const PerfHelper = new Gio.DBusProxyClass({
function PerfHelper() { Name: 'PerfHelperProxy',
return new PerfHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PerfHelper', '/org/gnome/Shell/PerfHelper'); Interface: PerfHelperIface,
}
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: 'org.gnome.Shell.PerfHelper',
g_object_path: '/org/gnome/Shell/PerfHelper' });
}
});
let _perfHelper = null; let _perfHelper = null;
function _getPerfHelper() { function _getPerfHelper() {
if (_perfHelper == null) if (_perfHelper == null) {
_perfHelper = new PerfHelper(); _perfHelper = new PerfHelper();
_perfHelper.init(null);
}
return _perfHelper; return _perfHelper;
} }
@ -111,7 +119,8 @@ function createTestWindow(width, height, alpha, maximized) {
let perfHelper = _getPerfHelper(); let perfHelper = _getPerfHelper();
perfHelper.CreateWindowRemote(width, height, alpha, maximized, perfHelper.CreateWindowRemote(width, height, alpha, maximized,
function(result, excp) { null,
function(proxy, result) {
if (cb) if (cb)
cb(); cb();
}); });
@ -131,7 +140,7 @@ function waitTestWindows() {
let cb; let cb;
let perfHelper = _getPerfHelper(); let perfHelper = _getPerfHelper();
perfHelper.WaitWindowsRemote(function(result, excp) { perfHelper.WaitWindowsRemote(null, function(proxy, result) {
if (cb) if (cb)
cb(); cb();
}); });
@ -154,7 +163,7 @@ function destroyTestWindows() {
let cb; let cb;
let perfHelper = _getPerfHelper(); let perfHelper = _getPerfHelper();
perfHelper.DestroyWindowsRemote(function(result, excp) { perfHelper.DestroyWindowsRemote(null, function(proxy, result) {
if (cb) if (cb)
cb(); cb();
}); });

View File

@ -2,6 +2,7 @@
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@ -75,6 +76,8 @@ const SearchProvider = new Lang.Class({
Name: 'SearchProvider', Name: 'SearchProvider',
_init: function(title) { _init: function(title) {
this.parent();
this.title = title; this.title = title;
this.searchSystem = null; this.searchSystem = null;
}, },

View File

@ -39,7 +39,7 @@ const _modes = {
unlockDialog: imports.gdm.loginDialog.LoginDialog, unlockDialog: imports.gdm.loginDialog.LoginDialog,
components: ['polkitAgent'], components: ['polkitAgent'],
panel: { panel: {
left: [], left: ['logo'],
center: ['dateMenu'], center: ['dateMenu'],
right: ['a11y', 'display', 'keyboard', right: ['a11y', 'display', 'keyboard',
'volume', 'battery', 'powerMenu'] 'volume', 'battery', 'powerMenu']

View File

@ -59,19 +59,24 @@ const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
<method name="SetActive"> <method name="SetActive">
<arg name="value" direction="in" type="b" /> <arg name="value" direction="in" type="b" />
</method> </method>
<method name="GetActiveTime">
<arg name="value" direction="out" type="u" />
</method>
<signal name="ActiveChanged"> <signal name="ActiveChanged">
<arg name="new_value" type="b" /> <arg name="new_value" type="b" />
</signal> </signal>
</interface>; </interface>;
const GnomeShell = new Lang.Class({ const GnomeShell = new Gio.DBusImplementerClass({
Name: 'GnomeShellDBus', Name: 'GnomeShellDBus',
Interface: GnomeShellIface,
_init: function() { _init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellIface, this); this.parent();
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsSerivce = new GnomeShellExtensions(); this.export(Gio.DBus.session, '/org/gnome/Shell');
this._extensionsService = new GnomeShellExtensions();
}, },
/** /**
@ -233,12 +238,14 @@ const GnomeShellExtensionsIface = <interface name="org.gnome.Shell.Extensions">
<property name="ShellVersion" type="s" access="read" /> <property name="ShellVersion" type="s" access="read" />
</interface>; </interface>;
const GnomeShellExtensions = new Lang.Class({ const GnomeShellExtensions = new Gio.DBusImplementerClass({
Name: 'GnomeShellExtensionsDBus', Name: 'GnomeShellExtensionsDBus',
Interface: GnomeShellExtensionsIface,
_init: function() { _init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellExtensionsIface, this); this.parent();
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/Shell');
this.export(Gio.DBus.session, '/org/gnome/Shell');
ExtensionSystem.connect('extension-state-changed', ExtensionSystem.connect('extension-state-changed',
Lang.bind(this, this._extensionStateChanged)); Lang.bind(this, this._extensionStateChanged));
}, },
@ -332,25 +339,23 @@ const GnomeShellExtensions = new Lang.Class({
ShellVersion: Config.PACKAGE_VERSION, ShellVersion: Config.PACKAGE_VERSION,
_extensionStateChanged: function(_, newState) { _extensionStateChanged: function(_, newState) {
this._dbusImpl.emit_signal('ExtensionStatusChanged', this.emit_signal('ExtensionStatusChanged', newState.uuid, newState.state, newState.error);
GLib.Variant.new('(sis)', [newState.uuid, newState.state, newState.error]));
} }
}); });
const ScreenSaverDBus = new Lang.Class({ const ScreenSaverDBus = new Gio.DBusImplementerClass({
Name: 'ScreenSaverDBus', Name: 'ScreenSaverDBus',
Interface: ScreenSaverIface,
_init: function(screenShield) { _init: function(screenShield) {
this.parent(); this.parent();
this._screenShield = screenShield; this._screenShield = screenShield;
screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) { screenShield.connect('lock-status-changed', Lang.bind(this, function(shield) {
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.locked])); this.emit_signal('ActiveChanged', shield.locked);
})); }));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); this.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');
Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.ScreenSaver', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, },
@ -373,5 +378,13 @@ const ScreenSaverDBus = new Lang.Class({
GetActive: function() { GetActive: function() {
return this._screenShield.locked; return this._screenShield.locked;
} },
GetActiveTime: function() {
let started = this._screenShield.activationTime;
if (started > 0)
return Math.floor((GLib.get_monotonic_time() - started) / 1000000);
else
return 0;
},
}); });

View File

@ -554,14 +554,16 @@ const ShellMountOperationType = {
SHOW_PROCESSES: 3 SHOW_PROCESSES: 3
}; };
const GnomeShellMountOpHandler = new Lang.Class({ const GnomeShellMountOpHandler = new Gio.DBusImplementerClass({
Name: 'GnomeShellMountOpHandler', Name: 'GnomeShellMountOpHandler',
Interface: GnomeShellMountOpIface,
_init: function() { _init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GnomeShellMountOpIface, this); this.parent();
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.bus_own_name_on_connection(Gio.DBus.session, 'org.gtk.MountOperationHandler', this.export(Gio.DBus.session, '/org/gtk/MountOperationHandler');
Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gtk.MountOperationHandler',
Gio.BusNameOwnerFlags.REPLACE, null, null);
this._dialog = null; this._dialog = null;
this._volumeMonitor = Gio.VolumeMonitor.get(); this._volumeMonitor = Gio.VolumeMonitor.get();

View File

@ -233,20 +233,11 @@ const NMWirelessSectionTitleMenuItem = new Lang.Class({
} }
}); });
const NMDevice = new Lang.Class({ const NMConnectionBased = new Lang.Class({
Name: 'NMDevice', Name: 'NMConnectionBased',
Abstract: true, Abstract: true,
_init: function(client, device, connections) { _init: function(connections) {
this.device = device;
if (device) {
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
} else
this._stateChangedId = 0;
// protected
this._client = client;
this._connections = [ ]; this._connections = [ ];
for (let i = 0; i < connections.length; i++) { for (let i = 0; i < connections.length; i++) {
if (!connections[i].get_uuid()) if (!connections[i].get_uuid())
@ -264,26 +255,115 @@ const NMDevice = new Lang.Class({
this._connections.push(obj); this._connections.push(obj);
} }
this._connections.sort(this._connectionSortFunction); this._connections.sort(this._connectionSortFunction);
},
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._queueCreateSection();
}
},
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
});
Signals.addSignalMethods(NMConnectionBased.prototype);
const NMDevice = new Lang.Class({
Name: 'NMDevice',
Abstract: true,
Extends: NMConnectionBased,
_init: function(client, device, connections) {
this.device = device;
this.device._delegate = this;
this._stateChangedId = this.device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
// protected
this._client = client;
this.parent(connections);
this._activeConnection = null; this._activeConnection = null;
this._activeConnectionItem = null; this._activeConnectionItem = null;
this._autoConnectionItem = null; this._autoConnectionItem = null;
this._overflowItem = null; this._overflowItem = null;
if (this.device) { this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' }); this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) { let ok;
let ok; if (state)
if (state) ok = this.activate();
ok = this.activate(); else
else ok = this.deactivate();
ok = this.deactivate();
if (!ok) if (!ok)
item.setToggleState(!state); item.setToggleState(!state);
})); }));
this._updateStatusItem(); this._updateStatusItem();
}
this.section = new PopupMenu.PopupMenuSection(); this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection)); this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
@ -352,6 +432,10 @@ const NMDevice = new Lang.Class({
return this.device.state == NetworkManager.DeviceState.ACTIVATED; return this.device.state == NetworkManager.DeviceState.ACTIVATED;
}, },
clearActiveConnection: function(activeConnection) {
this.setActiveConnection(null);
},
setActiveConnection: function(activeConnection) { setActiveConnection: function(activeConnection) {
if (activeConnection == this._activeConnection) if (activeConnection == this._activeConnection)
// nothing to do // nothing to do
@ -369,80 +453,13 @@ const NMDevice = new Lang.Class({
this._queueCreateSection(); this._queueCreateSection();
}, },
checkConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
let exists = pos != -1;
let valid = this.connectionValid(connection);
let similar = false;
if (exists) {
let existing = this._connections[pos];
// Check if connection changed name or id
similar = existing.name == connection.get_id() &&
existing.timestamp == connection._timestamp;
}
if (exists && valid && similar) {
// Nothing to do
return;
}
if (exists)
this.removeConnection(connection);
if (valid)
this.addConnection(connection);
},
addConnection: function(connection) {
// record the connection
let obj = {
connection: connection,
name: connection.get_id(),
uuid: connection.get_uuid(),
timestamp: connection._timestamp,
item: null,
};
Util.insertSorted(this._connections, obj, this._connectionSortFunction);
this._clearSection();
this._queueCreateSection();
},
removeConnection: function(connection) {
let pos = this._findConnection(connection.get_uuid());
if (pos == -1) {
// this connection was never added, nothing to do here
return;
}
let obj = this._connections[pos];
if (obj.item)
obj.item.destroy();
this._connections.splice(pos, 1);
if (this._connections.length <= 1) {
// We need to show the automatic connection again
// (or in the case of NMDeviceWired, we want to hide
// the only explicit connection)
this._clearSection();
this._queueCreateSection();
}
},
connectionValid: function(connection) { connectionValid: function(connection) {
return this.device.connection_valid(connection); return this.device.connection_valid(connection);
}, },
_connectionSortFunction: function(one, two) {
if (one.timestamp == two.timestamp)
return GLib.utf8_collate(one.name, two.name);
return two.timestamp - one.timestamp;
},
setEnabled: function(enabled) { setEnabled: function(enabled) {
// do nothing by default, we want to keep the conneciton list visible // do nothing by default, we want to keep the conneciton list visible
// in the majority of cases (wired, wwan, vpn) // in the majority of cases (wired, wwan)
}, },
getStatusLabel: function() { getStatusLabel: function() {
@ -500,15 +517,6 @@ const NMDevice = new Lang.Class({
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection'); throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
}, },
_findConnection: function(uuid) {
for (let i = 0; i < this._connections.length; i++) {
let obj = this._connections[i];
if (obj.uuid == uuid)
return i;
}
return -1;
},
_queueCreateSection: function() { _queueCreateSection: function() {
this._clearSection(); this._clearSection();
Main.queueDeferredWork(this._deferredWorkId); Main.queueDeferredWork(this._deferredWorkId);
@ -652,8 +660,6 @@ const NMDevice = new Lang.Class({
return out; return out;
} }
}); });
Signals.addSignalMethods(NMDevice.prototype);
const NMDeviceWired = new Lang.Class({ const NMDeviceWired = new Lang.Class({
Name: 'NMDeviceWired', Name: 'NMDeviceWired',
@ -868,95 +874,6 @@ const NMDeviceBluetooth = new Lang.Class({
} }
}); });
// Not a real device, but I save a lot code this way
const NMDeviceVPN = new Lang.Class({
Name: 'NMDeviceVPN',
Extends: NMDevice,
_init: function(client, device, connections) {
// Disable autoconnections
this._autoConnectionName = null;
this.category = NMConnectionCategory.VPN;
this.parent(client, null, connections);
},
connectionValid: function(connection) {
return connection._type == NetworkManager.SETTING_VPN_SETTING_NAME;
},
get empty() {
return this._connections.length == 0;
},
get connected() {
if (!this._activeConnection)
return false;
return this._activeConnection.vpn_state == NetworkManager.VPNConnectionState.ACTIVATED;
},
setActiveConnection: function(activeConnection) {
if (this._stateChangeId)
this._activeConnection.disconnect(this._stateChangeId);
this._stateChangeId = 0;
this.parent(activeConnection);
if (this._activeConnection)
this._stateChangeId = this._activeConnection.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
this.emit('state-changed');
},
_shouldShowConnectionList: function() {
return true;
},
deactivate: function() {
if (this._activeConnection)
this._client.deactivate_connection(this._activeConnection);
},
getStatusLabel: function() {
if (!this._activeConnection) // Same as DISCONNECTED
return null;
switch(this._activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
_connectionStateChanged: function(connection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
// Differently from real NMDevices, there is no need to queue
// an update of the menu section, contents wouldn't change anyway
this.emit('state-changed');
}
});
const NMDeviceWireless = new Lang.Class({ const NMDeviceWireless = new Lang.Class({
Name: 'NMDeviceWireless', Name: 'NMDeviceWireless',
Extends: NMDevice, Extends: NMDevice,
@ -1557,6 +1474,151 @@ const NMDeviceWireless = new Lang.Class({
}, },
}); });
const NMVPNSection = new Lang.Class({
Name: 'NMVPNSection',
Extends: NMConnectionBased,
category: NMConnectionCategory.VPN,
_init: function(client, connections) {
this.parent(connections);
this._client = client;
this.section = new PopupMenu.PopupMenuSection();
this._deferredWorkId = Main.initializeDeferredWork(this.section.actor, Lang.bind(this, this._createSection));
},
get empty() {
return this._connections.length == 0;
},
connectionValid: function(connection) {
// filtering is done by NMApplet code
return true;
},
getStatusLabel: function(activeConnection) {
switch(activeConnection.vpn_state) {
case NetworkManager.VPNConnectionState.DISCONNECTED:
case NetworkManager.VPNConnectionState.ACTIVATED:
return null;
case NetworkManager.VPNConnectionState.PREPARE:
case NetworkManager.VPNConnectionState.CONNECT:
case NetworkManager.VPNConnectionState.IP_CONFIG_GET:
return _("connecting...");
case NetworkManager.VPNConnectionState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("authentication required");
case NetworkManager.VPNConnectionState.FAILED:
return _("connection failed");
default:
log('VPN connection state invalid, is %d'.format(this.device.state));
return 'invalid';
}
},
clearActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active.disconnect(obj.stateChangedId);
obj.active = null;
if (obj.item) {
obj.item.setToggleState(false);
obj.item.setStatus(null);
}
},
setActiveConnection: function(activeConnection) {
let pos = this._findConnection(activeConnection.uuid);
if (pos < 0)
return;
let obj = this._connections[pos];
obj.active = activeConnection;
obj.stateChangedId = obj.active.connect('vpn-state-changed',
Lang.bind(this, this._connectionStateChanged));
if (obj.item) {
obj.item.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(obj.active));
}
},
_queueCreateSection: function() {
this.section.removeAll();
Main.queueDeferredWork(this._deferredWorkId);
},
_createConnectionItem: function(obj) {
let menuItem = new PopupMenu.PopupSwitchMenuItem(obj.name, false,
{ style_class: 'popup-subtitle-menu-item' });
menuItem.connect('toggled', Lang.bind(this, function(menuItem) {
if (menuItem.state) {
this._client.activate_connection(obj.connection, null, null, null);
// Immediately go back to disconnected, until NM tells us to change
menuItem.setToggleState(false);
} else if (obj.active) {
this._client.deactivate_connection(obj.active);
}
}));
if (obj.active) {
menuItem.setToggleState(obj.active.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
menuItem.setStatus(this.getStatusLabel(obj.active));
}
return menuItem;
},
_createSection: function() {
if (this._connections.length > 0) {
this.section.actor.show();
for(let j = 0; j < this._connections.length; ++j) {
let obj = this._connections[j];
obj.item = this._createConnectionItem(obj);
if (j >= NUM_VISIBLE_NETWORKS) {
if (!this._overflowItem) {
this._overflowItem = new PopupMenu.PopupSubMenuMenuItem(_("More..."));
this.section.addMenuItem(this._overflowItem);
}
this._overflowItem.menu.addMenuItem(obj.item);
} else
this.section.addMenuItem(obj.item);
}
} else {
this.section.actor.hide()
}
},
_connectionStateChanged: function(vpnConnection, newstate, reason) {
if (newstate == NetworkManager.VPNConnectionState.FAILED) {
// FIXME: if we ever want to show something based on reason,
// we need to convert from NetworkManager.VPNConnectionStateReason
// to NetworkManager.DeviceStateReason
this.emit('activation-failed', reason);
}
let pos = this._findConnection(vpnConnection.uuid);
if (pos >= 0) {
let obj = this._connections[pos];
if (obj.item) {
obj.item.setToggleState(vpnConnection.vpn_state ==
NetworkManager.VPNConnectionState.ACTIVATED);
obj.item.setStatus(this.getStatusLabel(vpnConnection));
}
} else {
log('Could not find connection for vpn-state-changed handler');
}
},
});
const NMApplet = new Lang.Class({ const NMApplet = new Lang.Class({
Name: 'NMApplet', Name: 'NMApplet',
Extends: PanelMenu.SystemStatusButton, Extends: PanelMenu.SystemStatusButton,
@ -1567,7 +1629,44 @@ const NMApplet = new Lang.Class({
this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' })); this.secondaryIcon = this.addIcon(new Gio.ThemedIcon({ name: 'network-vpn-symbolic' }));
this.secondaryIcon.hide(); this.secondaryIcon.hide();
this._client = NMClient.Client.new(); // Device types
this._dtypes = { };
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired;
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
// TODO: WiMax support
// Connection types
this._ctypes = { };
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS;
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED;
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
NMClient.Client.new_async(null, Lang.bind(this, this._clientGot));
NMClient.RemoteSettings.new_async(null, null, Lang.bind(this, this._remoteSettingsGot));
},
_clientGot: function(obj, result) {
this._client = NMClient.Client.new_finish(result);
this._tryLateInit();
},
_remoteSettingsGot: function(obj, result) {
this._settings = NMClient.RemoteSettings.new_finish(result);
this._tryLateInit();
},
_tryLateInit: function() {
if (!this._client || !this._settings)
return;
this._statusSection = new PopupMenu.PopupMenuSection(); this._statusSection = new PopupMenu.PopupMenuSection();
this._statusItem = new PopupMenu.PopupMenuItem('', { reactive: false }); this._statusItem = new PopupMenu.PopupMenuItem('', { reactive: false });
@ -1622,56 +1721,23 @@ const NMApplet = new Lang.Class({
this.menu.addMenuItem(this._devices.wwan.section); this.menu.addMenuItem(this._devices.wwan.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._devices.vpn = { this._vpnSection = new NMVPNSection(this._client, this._connections);
section: new PopupMenu.PopupMenuSection(), this._vpnSection.connect('activation-failed', Lang.bind(this, this._onActivationFailed));
device: this._makeWrapperDevice(NMDeviceVPN, null), this.menu.addMenuItem(this._vpnSection.section);
item: new NMWiredSectionTitleMenuItem(_("VPN Connections"))
};
this._devices.vpn.section.addMenuItem(this._devices.vpn.item);
this._devices.vpn.section.addMenuItem(this._devices.vpn.device.section);
this._devices.vpn.section.actor.hide();
this.menu.addMenuItem(this._devices.vpn.section);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); this.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
// Device types this._readConnections();
this._dtypes = { }; this._readDevices();
this._dtypes[NetworkManager.DeviceType.ETHERNET] = NMDeviceWired; this._syncNMState();
this._dtypes[NetworkManager.DeviceType.WIFI] = NMDeviceWireless;
this._dtypes[NetworkManager.DeviceType.MODEM] = NMDeviceModem;
this._dtypes[NetworkManager.DeviceType.BT] = NMDeviceBluetooth;
// TODO: WiMax support
// Connection types this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._ctypes = { }; this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._ctypes[NetworkManager.SETTING_WIRELESS_SETTING_NAME] = NMConnectionCategory.WIRELESS; this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._ctypes[NetworkManager.SETTING_WIRED_SETTING_NAME] = NMConnectionCategory.WIRED; this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
this._ctypes[NetworkManager.SETTING_PPPOE_SETTING_NAME] = NMConnectionCategory.WIRED; this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._ctypes[NetworkManager.SETTING_PPP_SETTING_NAME] = NMConnectionCategory.WIRED; this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._ctypes[NetworkManager.SETTING_BLUETOOTH_SETTING_NAME] = NMConnectionCategory.WWAN; this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
this._ctypes[NetworkManager.SETTING_CDMA_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_GSM_SETTING_NAME] = NMConnectionCategory.WWAN;
this._ctypes[NetworkManager.SETTING_VPN_SETTING_NAME] = NMConnectionCategory.VPN;
this._settings = NMClient.RemoteSettings.new(null);
this._connectionsReadId = this._settings.connect('connections-read', Lang.bind(this, function() {
this._readConnections();
this._readDevices();
this._syncNMState();
// Connect to signals late so that early signals don't find in inconsistent state
// and connect only once (this signal handler can be called again if NetworkManager goes up and down)
if (!this._inited) {
this._inited = true;
this._client.connect('notify::manager-running', Lang.bind(this, this._syncNMState));
this._client.connect('notify::networking-enabled', Lang.bind(this, this._syncNMState));
this._client.connect('notify::state', Lang.bind(this, this._syncNMState));
this._client.connect('notify::active-connections', Lang.bind(this, this._updateIcon));
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
}
}));
}, },
_ensureSource: function() { _ensureSource: function() {
@ -1699,18 +1765,6 @@ const NMApplet = new Lang.Class({
}, },
_syncSectionTitle: function(category) { _syncSectionTitle: function(category) {
if (category == NMConnectionCategory.VPN) {
// Special case VPN: it's only one device (and a fake one
// actually), and we don't show it if empty
let device = this._devices.vpn.device;
let section = this._devices.vpn.section;
let item = this._devices.vpn.item;
section.actor.visible = !device.empty;
item.updateForDevice(device);
return;
}
let devices = this._devices[category].devices; let devices = this._devices[category].devices;
let item = this._devices[category].item; let item = this._devices[category].item;
let section = this._devices[category].section; let section = this._devices[category].section;
@ -1747,10 +1801,9 @@ const NMApplet = new Lang.Class({
or this._source will be cleared */ or this._source will be cleared */
this._ensureSource(); this._ensureSource();
let icon = new St.Icon({ icon_name: iconName, let gicon = new Gio.ThemedIcon({ name: iconName });
icon_size: MessageTray.NOTIFICATION_ICON_SIZE });
device._notification = new MessageTray.Notification(this._source, title, text, device._notification = new MessageTray.Notification(this._source, title, text,
{ icon: icon }); { gicon: gicon });
device._notification.setUrgency(urgency); device._notification.setUrgency(urgency);
device._notification.setTransient(true); device._notification.setTransient(true);
device._notification.connect('destroy', function() { device._notification.connect('destroy', function() {
@ -1759,17 +1812,20 @@ const NMApplet = new Lang.Class({
this._source.notify(device._notification); this._source.notify(device._notification);
}, },
_onActivationFailed: function(device, reason) {
// XXX: nm-applet has no special text depending on reason
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
},
_makeWrapperDevice: function(wrapperClass, device) { _makeWrapperDevice: function(wrapperClass, device) {
let wrapper = new wrapperClass(this._client, device, this._connections); let wrapper = new wrapperClass(this._client, device, this._connections);
wrapper._activationFailedId = wrapper.connect('activation-failed', Lang.bind(this, function(device, reason) { wrapper._activationFailedId = wrapper.connect('activation-failed',
// XXX: nm-applet has no special text depending on reason Lang.bind(this, this._onActivationFailed));
// but I'm not sure of this generic message
this._notifyForDevice(device, 'network-error-symbolic',
_("Connection failed"),
_("Activation of network connection failed"),
MessageTray.Urgency.HIGH);
}));
wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) { wrapper._deviceStateChangedId = wrapper.connect('state-changed', Lang.bind(this, function(dev) {
this._syncSectionTitle(dev.category); this._syncSectionTitle(dev.category);
})); }));
@ -1852,7 +1908,7 @@ const NMApplet = new Lang.Class({
for (let i = 0; i < closedConnections.length; i++) { for (let i = 0; i < closedConnections.length; i++) {
let active = closedConnections[i]; let active = closedConnections[i];
if (active._primaryDevice) { if (active._primaryDevice) {
active._primaryDevice.setActiveConnection(null); active._primaryDevice.clearActiveConnection(active);
active._primaryDevice = null; active._primaryDevice = null;
} }
if (active._inited) { if (active._inited) {
@ -1919,7 +1975,7 @@ const NMApplet = new Lang.Class({
} }
} }
} else } else
a._primaryDevice = this._devices.vpn.device a._primaryDevice = this._vpnSection;
if (a._primaryDevice) if (a._primaryDevice)
a._primaryDevice.setActiveConnection(a); a._primaryDevice.setActiveConnection(a);
@ -2001,8 +2057,7 @@ const NMApplet = new Lang.Class({
let section = connection._section; let section = connection._section;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.removeConnection(connection); this._vpnSection.removeConnection(connection);
this._syncSectionTitle(section);
} else if (section != NMConnectionCategory.INVALID) { } else if (section != NMConnectionCategory.INVALID) {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) for (let i = 0; i < devices.length; i++)
@ -2025,8 +2080,7 @@ const NMApplet = new Lang.Class({
if (section == NMConnectionCategory.INVALID) if (section == NMConnectionCategory.INVALID)
return; return;
if (section == NMConnectionCategory.VPN) { if (section == NMConnectionCategory.VPN) {
this._devices.vpn.device.checkConnection(connection); this._vpnSection.checkConnection(connection);
this._syncSectionTitle(section);
} else { } else {
let devices = this._devices[section].devices; let devices = this._devices[section].devices;
for (let i = 0; i < devices.length; i++) { for (let i = 0; i < devices.length; i++) {
@ -2052,7 +2106,6 @@ const NMApplet = new Lang.Class({
this._syncSectionTitle(NMConnectionCategory.WIRED); this._syncSectionTitle(NMConnectionCategory.WIRED);
this._syncSectionTitle(NMConnectionCategory.WIRELESS); this._syncSectionTitle(NMConnectionCategory.WIRELESS);
this._syncSectionTitle(NMConnectionCategory.WWAN); this._syncSectionTitle(NMConnectionCategory.WWAN);
this._syncSectionTitle(NMConnectionCategory.VPN);
}, },
_syncNMState: function() { _syncNMState: function() {

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
@ -45,7 +46,16 @@ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
<property name="Icon" type="s" access="read" /> <property name="Icon" type="s" access="read" />
</interface>; </interface>;
const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface); const PowerManagerProxy = new Gio.DBusProxyClass({
Name: 'PowerManagerProxy',
Interface: PowerManagerInterface,
_init: function() {
this.parent({ g_bus_type: Gio.BusType.SESSION,
g_name: BUS_NAME,
g_object_path: OBJECT_PATH });
}
});
const Indicator = new Lang.Class({ const Indicator = new Lang.Class({
Name: 'PowerIndicator', Name: 'PowerIndicator',
@ -54,7 +64,7 @@ const Indicator = new Lang.Class({
_init: function() { _init: function() {
this.parent('battery-missing-symbolic', _("Battery")); this.parent('battery-missing-symbolic', _("Battery"));
this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH); this._proxy = new PowerManagerProxy();
this._deviceItems = [ ]; this._deviceItems = [ ];
this._hasPrimary = false; this._hasPrimary = false;
@ -73,18 +83,26 @@ const Indicator = new Lang.Class({
this._proxy.connect('g-properties-changed', this._proxy.connect('g-properties-changed',
Lang.bind(this, this._devicesChanged)); Lang.bind(this, this._devicesChanged));
this._devicesChanged(); this._proxy.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._devicesChanged();
}));
}, },
_readPrimaryDevice: function() { _readPrimaryDevice: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) { this._proxy.GetPrimaryDeviceRemote(null, Lang.bind(this, function(proxy, result) {
if (error) { let device_id, device_type, icon, percentage, state, seconds;
try {
[[device_id, device_type, icon, percentage, state, seconds]] =
proxy.GetPrimaryDeviceFinish(result);
} catch(e) {
this._hasPrimary = false; this._hasPrimary = false;
this._primaryDeviceId = null; this._primaryDeviceId = null;
this._batteryItem.actor.hide(); this._batteryItem.actor.hide();
return; return;
} }
let [[device_id, device_type, icon, percentage, state, seconds]] = result;
if (device_type == UPDeviceType.BATTERY) { if (device_type == UPDeviceType.BATTERY) {
this._hasPrimary = true; this._hasPrimary = true;
let time = Math.round(seconds / 60); let time = Math.round(seconds / 60);
@ -121,16 +139,18 @@ const Indicator = new Lang.Class({
}, },
_readOtherDevices: function() { _readOtherDevices: function() {
this._proxy.GetDevicesRemote(Lang.bind(this, function(result, error) { this._proxy.GetDevicesRemote(null, Lang.bind(this, function(proxy, result) {
this._deviceItems.forEach(function(i) { i.destroy(); }); this._deviceItems.forEach(function(i) { i.destroy(); });
this._deviceItems = []; this._deviceItems = [];
if (error) { let devices;
try {
[devices] = proxy.GetDevicesFinish(result);
} catch(e) {
return; return;
} }
let position = 0; let position = 0;
let [devices] = result;
for (let i = 0; i < devices.length; i++) { for (let i = 0; i < devices.length; i++) {
let [device_id, device_type] = devices[i]; let [device_id, device_type] = devices[i];
if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId) if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId)

View File

@ -5,6 +5,7 @@ const Clutter = imports.gi.Clutter;
const Gdm = imports.gi.Gdm; const Gdm = imports.gi.Gdm;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
@ -195,9 +196,7 @@ const UnlockDialog = new Lang.Class({
return false; return false;
})); }));
this._idleMonitor = Shell.IdleMonitor.get(); this._idleMonitor = new GnomeDesktop.IdleMonitor();
// this dialog is only created after user activity (curtain drag or
// escape key press), so the timeout will fire after IDLE_TIMEOUT seconds of inactivity
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape)); this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
}, },
@ -209,9 +208,13 @@ const UnlockDialog = new Lang.Class({
}, },
_showMessage: function(userVerifier, message, styleClass) { _showMessage: function(userVerifier, message, styleClass) {
this._promptMessage.text = message; if (message) {
this._promptMessage.styleClass = styleClass; this._promptMessage.text = message;
GdmUtil.fadeInActor(this._promptMessage); this._promptMessage.styleClass = styleClass;
GdmUtil.fadeInActor(this._promptMessage);
} else {
GdmUtil.fadeOutActor(this._promptMessage);
}
}, },
_onAskQuestion: function(verifier, serviceName, question, passwordChar) { _onAskQuestion: function(verifier, serviceName, question, passwordChar) {
@ -279,6 +282,7 @@ const UnlockDialog = new Lang.Class({
this._currentQuery = null; this._currentQuery = null;
this._firstQuestion = true; this._firstQuestion = true;
this._promptEntry.text = '';
this._promptEntry.clutter_text.set_password_char('\u25cf'); this._promptEntry.clutter_text.set_password_char('\u25cf');
this._promptEntry.menu.isPassword = true; this._promptEntry.menu.isPassword = true;

View File

@ -9,11 +9,11 @@ const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Tp = imports.gi.TelepathyGLib; const Tp = imports.gi.TelepathyGLib;
const UPowerGlib = imports.gi.UPowerGlib;
const Atk = imports.gi.Atk; const Atk = imports.gi.Atk;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const LoginManager = imports.misc.loginManager;
const Main = imports.ui.main; const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@ -26,6 +26,7 @@ const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const LOCK_ENABLED_KEY = 'lock-enabled'; const LOCK_ENABLED_KEY = 'lock-enabled';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const DIALOG_ICON_SIZE = 64; const DIALOG_ICON_SIZE = 64;
@ -73,11 +74,6 @@ const UserAvatarWidget = new Lang.Class({
let file = Gio.File.new_for_path(iconFile); let file = Gio.File.new_for_path(iconFile);
this.actor.child = null; this.actor.child = null;
this.actor.style = 'background-image: url("%s");'.format(iconFile); this.actor.style = 'background-image: url("%s");'.format(iconFile);
// AccountsService uses a fixed location for avatar images, so
// we need to clear out all cached data to pick up image changes,
// see https://bugzilla.gnome.org/show_bug.cgi?id=679268
this.actor.clear_background_image();
} else { } else {
this.actor.style = null; this.actor.style = null;
this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic', this.actor.child = new St.Icon({ icon_name: 'avatar-default-symbolic',
@ -192,15 +188,19 @@ const IMStatusChooserItem = new Lang.Class({
item = new IMStatusItem(_("Idle"), 'user-idle-symbolic'); item = new IMStatusItem(_("Idle"), 'user-idle-symbolic');
this._combo.addMenuItem(item, IMStatus.IDLE); this._combo.addMenuItem(item, IMStatus.IDLE);
item = new IMStatusItem(_("Unavailable"), 'user-offline-symbolic'); item = new IMStatusItem(_("Offline"), 'user-offline-symbolic');
this._combo.addMenuItem(item, IMStatus.OFFLINE); this._combo.addMenuItem(item, IMStatus.OFFLINE);
this._combo.connect('active-item-changed', this._combo.connect('active-item-changed',
Lang.bind(this, this._changeIMStatus)); Lang.bind(this, this._changeIMStatus));
this._presence = new GnomeSession.Presence(); this._presence = new GnomeSession.Presence();
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) { this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(obj, result) {
this._sessionStatusChanged(status); obj.init_finish(result);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._sessionStatusChanged(status);
}));
})); }));
this._sessionPresenceRestored = false; this._sessionPresenceRestored = false;
@ -484,13 +484,33 @@ const UserMenuButton = new Lang.Class({
this._userManager = AccountsService.UserManager.get_default(); this._userManager = AccountsService.UserManager.get_default();
this._user = this._userManager.get_user(GLib.get_user_name()); this._user = this._userManager.get_user(GLib.get_user_name());
this._presence = new GnomeSession.Presence(); this._presence = new GnomeSession.Presence();
this._session = new GnomeSession.SessionManager(); this._presence.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
proxy.init_finish(result);
this._updateSwitch(this._presence.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
this._updateSwitch(status);
}));
}));
let session = new GnomeSession.SessionManager();
session.init_async(GLib.PRIORITY_DEFAULT, null, Lang.bind(this, function(proxy, result) {
// This should never fail.
proxy.init_finish(result);
this._session = proxy;
this._updateHaveShutdown();
}));
this._haveShutdown = true; this._haveShutdown = true;
this._haveSuspend = true;
this._accountMgr = Tp.AccountManager.dup(); this._accountMgr = Tp.AccountManager.dup();
this._upClient = new UPowerGlib.Client(); LoginManager.getLoginManager(Lang.bind(this, function(manager) {
this._loginManager = manager;
}));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin(); this._iconBox = new St.Bin();
@ -536,11 +556,6 @@ const UserMenuButton = new Lang.Class({
this._createSubMenu(); this._createSubMenu();
this._updateSwitch(this._presence.status);
this._presence.connectSignal('StatusChanged', Lang.bind(this, function (proxy, senderName, [status]) {
this._updateSwitch(status);
}));
this._userManager.connect('notify::is-loaded', this._userManager.connect('notify::is-loaded',
Lang.bind(this, this._updateMultiUser)); Lang.bind(this, this._updateMultiUser));
this._userManager.connect('notify::has-multiple-users', this._userManager.connect('notify::has-multiple-users',
@ -570,14 +585,15 @@ const UserMenuButton = new Lang.Class({
// the lockdown setting changes, which should be close enough. // the lockdown setting changes, which should be close enough.
this.menu.connect('open-state-changed', Lang.bind(this, this.menu.connect('open-state-changed', Lang.bind(this,
function(menu, open) { function(menu, open) {
if (open) if (!open)
this._updateHaveShutdown(); return;
this._updateHaveShutdown();
this._updateHaveSuspend();
})); }));
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY, this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
Lang.bind(this, this._updateHaveShutdown)); Lang.bind(this, this._updateHaveShutdown));
this._upClient.connect('notify::can-suspend', Lang.bind(this, this._updateSuspendOrPowerOff));
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated(); this._sessionUpdated();
}, },
@ -619,10 +635,13 @@ const UserMenuButton = new Lang.Class({
_updateLogout: function() { _updateLogout: function() {
let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY); let allowLogout = !this._lockdownSettings.get_boolean(DISABLE_LOG_OUT_KEY);
let alwaysShow = global.settings.get_boolean(ALWAYS_SHOW_LOG_OUT_KEY);
let systemAccount = this._user.system_account;
let localAccount = this._user.local_account;
let multiUser = this._userManager.has_multiple_users; let multiUser = this._userManager.has_multiple_users;
let multiSession = Gdm.get_session_ids().length > 1; let multiSession = Gdm.get_session_ids().length > 1;
this._logoutItem.actor.visible = allowLogout && (multiUser || multiSession); this._logoutItem.actor.visible = allowLogout && (alwaysShow || multiUser || multiSession || systemAccount || !localAccount);
}, },
_updateLockScreen: function() { _updateLockScreen: function() {
@ -636,19 +655,37 @@ const UserMenuButton = new Lang.Class({
}, },
_updateHaveShutdown: function() { _updateHaveShutdown: function() {
this._session.CanShutdownRemote(Lang.bind(this, if (!this._session) {
function(result, error) { this._haveShutdown = false;
if (!error) { return;
this._haveShutdown = result[0]; }
this._updateInstallUpdates();
this._updateSuspendOrPowerOff(); this._session.CanShutdownRemote(null, Lang.bind(this, function(proxy, result) {
} try {
})); [this._haveShutdown] = proxy.CanShutdownFinish(result);
} catch(e) {
this._haveShutdown = false;
}
this._updateInstallUpdates();
this._updateSuspendOrPowerOff();
}));
},
_updateHaveSuspend: function() {
if (!this._loginManager) {
this._haveSuspend = false;
return;
}
this._loginManager.canSuspend(Lang.bind(this,
function(result) {
this._haveSuspend = result;
this._updateSuspendOrPowerOff();
}));
}, },
_updateSuspendOrPowerOff: function() { _updateSuspendOrPowerOff: function() {
this._haveSuspend = this._upClient.get_can_suspend();
if (!this._suspendOrPowerOffItem) if (!this._suspendOrPowerOffItem)
return; return;
@ -830,14 +867,17 @@ const UserMenuButton = new Lang.Class({
_onQuitSessionActivate: function() { _onQuitSessionActivate: function() {
Main.overview.hide(); Main.overview.hide();
this._session.LogoutRemote(0);
if (this._session)
this._session.LogoutRemote(0, null, null);
}, },
_onInstallUpdatesActivate: function() { _onInstallUpdatesActivate: function() {
Main.overview.hide(); Main.overview.hide();
Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']); Util.spawn(['pkexec', '/usr/libexec/pk-trigger-offline-update']);
this._session.RebootRemote(); if (this._haveShutdown)
this._session.RebootRemote(null, null);
}, },
_onSuspendOrPowerOffActivate: function() { _onSuspendOrPowerOffActivate: function() {
@ -845,18 +885,19 @@ const UserMenuButton = new Lang.Class({
if (this._haveShutdown && if (this._haveShutdown &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._session.ShutdownRemote(); this._session.ShutdownRemote(null, null);
} else { } else if (this._haveSuspend) {
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) { if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() { let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
Main.screenShield.disconnect(tmpId); Main.screenShield.disconnect(tmpId);
this._upClient.suspend_sync(null); this._loginManager.suspend();
})); }));
this.menu.close(BoxPointer.PopupAnimation.NONE);
Main.screenShield.lock(true); Main.screenShield.lock(true);
} else { } else {
this._upClient.suspend_sync(null); this._loginManager.suspend();
} }
} }
} }

View File

@ -1,6 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk; const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
@ -19,6 +20,7 @@ const Tweener = imports.ui.tweener;
const Wanda = imports.ui.wanda; const Wanda = imports.ui.wanda;
const WorkspacesView = imports.ui.workspacesView; const WorkspacesView = imports.ui.workspacesView;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const FocusTrap = new Lang.Class({ const FocusTrap = new Lang.Class({
Name: 'FocusTrap', Name: 'FocusTrap',
@ -141,6 +143,16 @@ const ViewSelector = new Lang.Class({
// accessing the properties. // accessing the properties.
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea, this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
coordinate: Clutter.BindCoordinate.HEIGHT }); coordinate: Clutter.BindCoordinate.HEIGHT });
global.display.add_keybinding('toggle-application-view',
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Lang.bind(this, this._showWithAppsPage));
},
_showWithAppsPage: function() {
Main.overview.show();
this._showAppsButton.set_checked(true);
}, },
show: function() { show: function() {

View File

@ -33,21 +33,13 @@ const DRAGGING_WINDOW_OPACITY = 100;
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides'; const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
const BUTTON_LAYOUT_KEY = 'button-layout'; const BUTTON_LAYOUT_KEY = 'button-layout';
// Define a layout scheme for small window counts. For larger // When calculating a layout, we calculate the scale of windows and the percent
// counts we fall back to an algorithm. We need more schemes here // of the available area the new layout uses. If the values for the new layout,
// unless we have a really good algorithm. // when weighted with the values as below, are worse than the previous layout's,
// we stop looking for a new layout and use the previous layout.
// Each triplet is [xCenter, yCenter, scale] where the scale // Otherwise, we keep looking for a new layout.
// is relative to the width of the workspace. const LAYOUT_SCALE_WEIGHT = 1;
const POSITIONS = { const LAYOUT_SPACE_WEIGHT = 0.1;
1: [[0.5, 0.5, 0.95]],
2: [[0.25, 0.5, 0.48], [0.75, 0.5, 0.48]],
3: [[0.25, 0.25, 0.48], [0.75, 0.25, 0.48], [0.5, 0.75, 0.48]],
4: [[0.25, 0.25, 0.47], [0.75, 0.25, 0.47], [0.75, 0.75, 0.47], [0.25, 0.75, 0.47]],
5: [[0.165, 0.25, 0.32], [0.495, 0.25, 0.32], [0.825, 0.25, 0.32], [0.25, 0.75, 0.32], [0.75, 0.75, 0.32]]
};
// Used in _orderWindowsPermutations, 5! = 120 which is probably the highest we can go
const POSITIONING_PERMUTATIONS_MAX = 5;
function _interpolate(start, end, step) { function _interpolate(start, end, step) {
return start + (end - start) * step; return start + (end - start) * step;
@ -167,6 +159,24 @@ const WindowClone = new Lang.Class({
this._selected = false; this._selected = false;
}, },
get slot() {
let x, y, w, h;
if (this.inDrag) {
x = this.dragOrigX;
y = this.dragOrigY;
w = this.actor.width * this.dragOrigScale;
h = this.actor.height * this.dragOrigScale;
} else {
x = this.actor.x;
y = this.actor.y;
w = this.actor.width * this.actor.scale_x;
h = this.actor.height * this.actor.scale_y;
}
return [x, y, w, h];
},
setStackAbove: function (actor) { setStackAbove: function (actor) {
this._stackAbove = actor; this._stackAbove = actor;
if (this.inDrag || this._zooming) if (this.inDrag || this._zooming)
@ -443,6 +453,11 @@ const WindowOverlay = new Lang.Class({
this._updateCaptionId = metaWindow.connect('notify::title', this._updateCaptionId = metaWindow.connect('notify::title',
Lang.bind(this, function(w) { Lang.bind(this, function(w) {
this.title.text = w.title; this.title.text = w.title;
// we need this for the next call to get_preferred_width
// to return useful results
this.title.set_size(-1, -1);
this._repositionSelf();
})); }));
let button = new St.Button({ style_class: 'window-close' }); let button = new St.Button({ style_class: 'window-close' });
@ -504,15 +519,16 @@ const WindowOverlay = new Lang.Class({
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, },
chromeWidth: function () {
return this.closeButton.width - this.closeButton._overlap;
},
chromeHeights: function () { chromeHeights: function () {
return [this.closeButton.height - this.closeButton._overlap, return [this.closeButton.height - this.closeButton._overlap,
this.title.height + this.title._spacing]; this.title.height + this.title._spacing];
}, },
_repositionSelf: function() {
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
},
/** /**
* @cloneX: x position of windowClone * @cloneX: x position of windowClone
* @cloneY: y position of windowClone * @cloneY: y position of windowClone
@ -550,9 +566,8 @@ const WindowOverlay = new Lang.Class({
else else
button.set_position(Math.floor(buttonX), Math.floor(buttonY)); button.set_position(Math.floor(buttonX), Math.floor(buttonY));
if (!title.fullWidth) let [titleMinWidth, titleNatWidth] = title.get_preferred_width(-1);
title.fullWidth = title.width; let titleWidth = Math.max(titleMinWidth, Math.min(titleNatWidth, cloneWidth));
let titleWidth = Math.min(title.fullWidth, cloneWidth);
let titleX = cloneX + (cloneWidth - titleWidth) / 2; let titleX = cloneX + (cloneWidth - titleWidth) / 2;
let titleY = cloneY + cloneHeight + title._spacing; let titleY = cloneY + cloneHeight + title._spacing;
@ -668,6 +683,280 @@ const WindowPositionFlags = {
ANIMATE: 1 << 1 ANIMATE: 1 << 1
}; };
const LayoutStrategy = new Lang.Class({
Name: 'LayoutStrategy',
Abstract: true,
_init: function(monitor, rowSpacing, columnSpacing, bottomPadding) {
this._monitor = monitor;
this._rowSpacing = rowSpacing;
this._columnSpacing = columnSpacing;
this._bottomPadding = bottomPadding;
},
_newRow: function() {
// Row properties:
//
// * x, y are the position of row, relative to area
//
// * width, height are the scaled versions of fullWidth, fullHeight
//
// * width also has the spacing in between windows. It's not in
// fullWidth, as the spacing is constant, whereas fullWidth is
// meant to be scaled
//
// * neither height/fullHeight have any sort of spacing or padding
//
// * if cellWidth is present, all windows in the row will occupy
// the space of cellWidth, centered.
return { x: 0, y: 0,
width: 0, height: 0,
fullWidth: 0, fullHeight: 0,
cellWidth: 0,
windows: [] };
},
// Compute the size and fancy scale for @window using the
// base scale, @scale.
//
// Returns a list structure: [ scaledWidth, scaledHeight, fancyScale ]
// where scaledWidth and scaledHeight are the window's
// width and height, scaled by fancyScale for convenience.
_computeWindowSizeAndScale: function(window, scale) {
let width = window.actor.width;
let height = window.actor.height;
let ratio;
if (width > height)
ratio = width / this._monitor.width;
else
ratio = height / this._monitor.height;
let fancyScale = (2 / (1 + ratio)) * scale;
return [width * fancyScale, height * fancyScale, fancyScale];
},
// Compute the size of each row, by assigning to the properties
// row.width, row.height, row.fullWidth, row.fullHeight, and
// (optionally) row.cellWidth, for each row in @layout.rows.
// This method is intended to be called by subclasses.
_computeRowSizes: function(layout) {
throw new Error('_computeRowSizes not implemented');
},
// Compute strategy-specific window slots for each window in
// @windows, given the @layout. The strategy may also use @layout
// as strategy-specific storage.
//
// This must calculate:
// * maxColumns - The maximum number of columns used by the layout.
// * gridWidth - The total width used by the grid, unscaled, unspaced.
// * gridHeight - The totial height used by the grid, unscaled, unspaced.
// * rows - A list of rows, which should be instantiated by _newRow.
computeLayout: function(windows, layout) {
throw new Error('computeLayout not implemented');
},
// Given @layout, compute the overall scale and space of the layout.
// The scale is the individual, non-fancy scale of each window, and
// the space is the percentage of the available area eventually
// used by the layout.
// This method does not return anything, but instead installs
// the properties "scale" and "space" on @layout directly.
//
// Make sure to call this methods before calling computeWindowSlots(),
// as it depends on the scale property installed in @layout here.
computeScaleAndSpace: function(layout) {
let area = layout.area;
let hspacing = (layout.maxColumns - 1) * this._columnSpacing;
let vspacing = (layout.numRows - 1) * this._rowSpacing + this._bottomPadding;
let spacedWidth = area.width - hspacing;
let spacedHeight = area.height - vspacing;
let horizontalScale = spacedWidth / layout.gridWidth;
let verticalScale = spacedHeight / layout.gridHeight;
// Thumbnails should be less than 70% of the original size
let scale = Math.min(horizontalScale, verticalScale, WINDOW_CLONE_MAXIMUM_SCALE);
let scaledLayoutWidth = layout.gridWidth * scale + hspacing;
let scaledLayoutHeight = layout.gridHeight * scale + vspacing;
let space = (scaledLayoutWidth * scaledLayoutHeight) / (area.width * area.height);
layout.scale = scale;
layout.space = space;
},
computeWindowSlots: function(layout, area) {
this._computeRowSizes(layout);
let { rows: rows, scale: scale, state: state } = layout;
let slots = [];
let y = 0;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
row.x = area.x + (area.width - row.width) / 2;
row.y = area.y + y;
y += row.height + this._rowSpacing;
}
let height = y - this._rowSpacing + this._bottomPadding;
let baseY = (area.height - height) / 2;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
row.y += baseY;
let baseX = row.x;
for (let j = 0; j < row.windows.length; j++) {
let window = row.windows[j];
let [width, height, s] = this._computeWindowSizeAndScale(window, scale);
let y = row.y + row.height - height;
let x = baseX;
if (row.cellWidth) {
x += (row.cellWidth - width) / 2;
width = row.cellWidth;
}
slots.push([x, y, s]);
baseX += width + this._columnSpacing;
}
}
return slots;
}
});
const UnalignedLayoutStrategy = new Lang.Class({
Name: 'UnalignedLayoutStrategy',
Extends: LayoutStrategy,
_computeRowSizes: function(layout) {
let { rows: rows, scale: scale } = layout;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
row.width = row.fullWidth * scale + (row.windows.length - 1) * this._columnSpacing;
row.height = row.fullHeight * scale;
}
},
_keepSameRow: function(row, window, width, idealRowWidth) {
if (row.fullWidth + width <= idealRowWidth)
return true;
let oldRatio = row.fullWidth / idealRowWidth;
let newRatio = (row.fullWidth + width) / idealRowWidth;
if (Math.abs(1 - newRatio) < Math.abs(1 - oldRatio))
return true;
return false;
},
computeLayout: function(windows, layout) {
let numRows = layout.numRows;
let rows = [];
let totalWidth = 0;
for (let i = 0; i < windows.length; i++) {
totalWidth += windows[i].actor.width;
}
let idealRowWidth = totalWidth / numRows;
let windowIdx = 0;
for (let i = 0; i < numRows; i++) {
let col = 0;
let row = this._newRow();
rows.push(row);
for (; windowIdx < windows.length; windowIdx++) {
let window = windows[windowIdx];
let [width, height] = this._computeWindowSizeAndScale(window, 1);
row.fullHeight = Math.max(row.fullHeight, height);
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
if (this._keepSameRow(row, window, width, idealRowWidth) || (i == numRows - 1)) {
row.windows.push(window);
row.fullWidth += width;
} else {
break;
}
}
}
let gridHeight = 0;
let maxRow;
for (let i = 0; i < numRows; i++) {
let row = rows[i];
if (!maxRow || row.fullWidth > maxRow.fullWidth)
maxRow = row;
gridHeight += row.fullHeight;
}
layout.rows = rows;
layout.maxColumns = maxRow.windows.length;
layout.gridWidth = maxRow.fullWidth;
layout.gridHeight = gridHeight;
}
});
const GridLayoutStrategy = new Lang.Class({
Name: 'GridLayoutStrategy',
Extends: LayoutStrategy,
_computeRowSizes: function(layout) {
let { rows: rows, scale: scale } = layout;
let gridWidth = layout.numColumns * layout.maxWindowWidth;
let hspacing = (layout.numColumns - 1) * this._columnSpacing;
for (let i = 0; i < rows.length; i++) {
let row = rows[i];
row.fullWidth = layout.gridWidth;
row.fullHeight = layout.maxWindowHeight;
row.width = row.fullWidth * scale + hspacing;
row.height = row.fullHeight * scale;
row.cellWidth = layout.maxWindowWidth * scale;
}
},
computeLayout: function(windows, layout) {
let { numRows: numRows, numColumns: numColumns } = layout;
let rows = [];
let windowIdx = 0;
let maxWindowWidth = 0;
let maxWindowHeight = 0;
for (let i = 0; i < numRows; i++) {
let row = this._newRow();
rows.push(row);
for (; windowIdx < windows.length; windowIdx++) {
if (row.windows.length >= numColumns)
break;
let window = windows[windowIdx];
row.windows.push(window);
let [width, height] = this._computeWindowSizeAndScale(window, 1);
maxWindowWidth = Math.max(maxWindowWidth, width);
maxWindowHeight = Math.max(maxWindowHeight, height);
}
}
layout.rows = rows;
layout.maxColumns = numColumns;
layout.gridWidth = numColumns * maxWindowWidth;
layout.gridHeight = numRows * maxWindowHeight;
layout.maxWindowWidth = maxWindowWidth;
layout.maxWindowHeight = maxWindowHeight;
}
});
/** /**
* @metaWorkspace: a #Meta.Workspace, or null * @metaWorkspace: a #Meta.Workspace, or null
*/ */
@ -689,7 +978,7 @@ const Workspace = new Lang.Class({
// Without this the drop area will be overlapped. // Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0); this._windowOverlaysGroup.set_size(0, 0);
this.actor = new Clutter.Group(); this.actor = new St.Widget({ style_class: 'window-picker' });
this.actor.set_size(0, 0); this.actor.set_size(0, 0);
this._dropRect = new Clutter.Rectangle({ opacity: 0 }); this._dropRect = new Clutter.Rectangle({ opacity: 0 });
@ -729,6 +1018,8 @@ const Workspace = new Lang.Class({
this._positionWindowsFlags = 0; this._positionWindowsFlags = 0;
this._positionWindowsId = 0; this._positionWindowsId = 0;
this._currentLayout = null;
}, },
setGeometry: function(x, y, width, height) { setGeometry: function(x, y, width, height) {
@ -763,225 +1054,6 @@ const Workspace = new Lang.Class({
return this._windows.length == 0; return this._windows.length == 0;
}, },
// Only use this for n <= 20 say
_factorial: function(n) {
let result = 1;
for (let i = 2; i <= n; i++)
result *= i;
return result;
},
/**
* _permutation:
* @permutationIndex: An integer from [0, list.length!)
* @list: (inout): Array of objects to permute; will be modified in place
*
* Given an integer between 0 and length of array, re-order the array in-place
* into a permutation denoted by the index.
*/
_permutation: function(permutationIndex, list) {
for (let j = 2; j <= list.length; j++) {
let firstIndex = (permutationIndex % j);
let secondIndex = j - 1;
// Swap
let tmp = list[firstIndex];
list[firstIndex] = list[secondIndex];
list[secondIndex] = tmp;
permutationIndex = Math.floor(permutationIndex / j);
}
},
/**
* _forEachPermutations:
* @list: Array
* @func: Function which takes a single array argument
*
* Call @func with each permutation of @list as an argument.
*/
_forEachPermutations: function(list, func) {
let nCombinations = this._factorial(list.length);
for (let i = 0; i < nCombinations; i++) {
let listCopy = list.concat();
this._permutation(i, listCopy);
func(listCopy);
}
},
/**
* _computeWindowMotion:
* @actor: A #WindowClone's #ClutterActor
* @slot: An element of #POSITIONS
* @slotGeometry: Layout of @slot
*
* Returns a number corresponding to how much perceived motion
* would be involved in moving the window to the given slot.
* Currently this is the square of the distance between the
* centers.
*/
_computeWindowMotion: function (actor, slot) {
let [xCenter, yCenter, fraction] = slot;
let xDelta, yDelta, distanceSquared;
let actorWidth, actorHeight;
let x = actor.x;
let y = actor.y;
let scale = actor.scale_x;
if (actor._delegate.inDrag) {
x = actor._delegate.dragOrigX;
y = actor._delegate.dragOrigY;
scale = actor._delegate.dragOrigScale;
}
actorWidth = actor.width * scale;
actorHeight = actor.height * scale;
xDelta = x + actorWidth / 2.0 - xCenter * this._width - this._x;
yDelta = y + actorHeight / 2.0 - yCenter * this._height - this._y;
distanceSquared = xDelta * xDelta + yDelta * yDelta;
return distanceSquared;
},
/**
* _orderWindowsPermutations:
*
* Iterate over all permutations of the windows, and determine the
* permutation which has the least total motion.
*/
_orderWindowsPermutations: function (clones, slots) {
let minimumMotionPermutation = null;
let minimumMotion = -1;
let permIndex = 0;
this._forEachPermutations(clones, Lang.bind(this, function (permutation) {
let motion = 0;
for (let i = 0; i < permutation.length; i++) {
let cloneActor = permutation[i].actor;
let slot = slots[i];
let delta = this._computeWindowMotion(cloneActor, slot);
motion += delta;
// Bail out early if we're already larger than the
// previous best
if (minimumMotionPermutation != null &&
motion > minimumMotion)
continue;
}
if (minimumMotionPermutation == null || motion < minimumMotion) {
minimumMotionPermutation = permutation;
minimumMotion = motion;
}
permIndex++;
}));
return minimumMotionPermutation;
},
/**
* _orderWindowsGreedy:
*
* Iterate over available slots in order, placing into each one the window
* we find with the smallest motion to that slot.
*/
_orderWindowsGreedy: function(clones, slots) {
let result = [];
let slotIndex = 0;
// Copy since we mutate below
let clonesCopy = clones.concat();
for (let i = 0; i < slots.length; i++) {
let slot = slots[i];
let minimumMotionIndex = -1;
let minimumMotion = -1;
for (let j = 0; j < clonesCopy.length; j++) {
let cloneActor = clonesCopy[j].actor;
let delta = this._computeWindowMotion(cloneActor, slot);
if (minimumMotionIndex == -1 || delta < minimumMotion) {
minimumMotionIndex = j;
minimumMotion = delta;
}
}
result.push(clonesCopy[minimumMotionIndex]);
clonesCopy.splice(minimumMotionIndex, 1);
}
return result;
},
/**
* _orderWindowsByMotionAndStartup:
* @windows: Array of #MetaWindow
* @slots: Array of slots
*
* Returns a copy of @windows, ordered in such a way that they require least motion
* to move to the final screen coordinates of @slots. Ties are broken in a stable
* fashion by the order in which the windows were created.
*/
_orderWindowsByMotionAndStartup: function(clones, slots) {
clones.sort(function(w1, w2) {
return w2.metaWindow.get_stable_sequence() - w1.metaWindow.get_stable_sequence();
});
if (clones.length <= POSITIONING_PERMUTATIONS_MAX)
return this._orderWindowsPermutations(clones, slots);
else
return this._orderWindowsGreedy(clones, slots);
},
/**
* _getSlotGeometry:
* @slot: A layout slot
*
* Returns: the screen-relative [x, y, width, height]
* of a given window layout slot.
*/
_getSlotGeometry: function(slot) {
let [xCenter, yCenter, fraction] = slot;
let width = this._width * fraction;
let height = this._height * fraction;
let x = this._x + xCenter * this._width - width / 2 ;
let y = this._y + yCenter * this._height - height / 2;
return [x, y, width, height];
},
/**
* _computeWindowLayout:
* @metaWindow: A #MetaWindow
* @slot: A layout slot
*
* Given a window and slot to fit it in, compute its
* screen-relative [x, y, scale] where scale applies
* to both X and Y directions.
*/
_computeWindowLayout: function(metaWindow, slot) {
let [x, y, width, height] = this._getSlotGeometry(slot);
let rect = metaWindow.get_outer_rect();
let buttonOuterHeight, captionHeight;
let buttonOuterWidth = 0;
if (this._windowOverlays[0]) {
[buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights();
buttonOuterWidth = this._windowOverlays[0].chromeWidth();
} else
[buttonOuterHeight, captionHeight] = [0, 0];
let scale = Math.min((width - buttonOuterWidth) / rect.width,
(height - buttonOuterHeight - captionHeight) / rect.height,
WINDOW_CLONE_MAXIMUM_SCALE);
x = Math.floor(x + (width - scale * rect.width) / 2);
// We want to center the window in case we have just one
if (metaWindow.get_workspace().n_windows == 1)
y = Math.floor(y + (height - scale * rect.height) / 2);
else
y = Math.floor(y + height - rect.height * scale - captionHeight);
return [x, y, scale];
},
setReservedSlot: function(clone) { setReservedSlot: function(clone) {
if (this._reservedSlot == clone) if (this._reservedSlot == clone)
return; return;
@ -990,6 +1062,7 @@ const Workspace = new Lang.Class({
clone = null; clone = null;
this._reservedSlot = clone; this._reservedSlot = clone;
this._currentLayout = null;
this.positionWindows(WindowPositionFlags.ANIMATE); this.positionWindows(WindowPositionFlags.ANIMATE);
}, },
@ -1020,6 +1093,11 @@ const Workspace = new Lang.Class({
} }
let clones = this._windows.slice(); let clones = this._windows.slice();
clones.sort(function(a, b) {
return a.metaWindow.get_stable_sequence() - b.metaWindow.get_stable_sequence();
});
if (this._reservedSlot) if (this._reservedSlot)
clones.push(this._reservedSlot); clones.push(this._reservedSlot);
@ -1027,8 +1105,7 @@ const Workspace = new Lang.Class({
let animate = flags & WindowPositionFlags.ANIMATE; let animate = flags & WindowPositionFlags.ANIMATE;
// Start the animations // Start the animations
let slots = this._computeAllWindowSlots(clones.length); let slots = this._computeAllWindowSlots(clones);
clones = this._orderWindowsByMotionAndStartup(clones, slots);
let currentWorkspace = global.screen.get_active_workspace(); let currentWorkspace = global.screen.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace; let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
@ -1045,10 +1122,11 @@ const Workspace = new Lang.Class({
if (clone.inDrag) if (clone.inDrag)
continue; continue;
let [x, y, scale] = this._computeWindowLayout(metaWindow, slot); let [x, y, scale] = slot;
if (overlay && initialPositioning) if (overlay && initialPositioning)
overlay.hide(); overlay.hide();
if (animate && isOnCurrentWorkspace) { if (animate && isOnCurrentWorkspace) {
if (!metaWindow.showing_on_its_workspace()) { if (!metaWindow.showing_on_its_workspace()) {
/* Hidden windows should fade in and grow /* Hidden windows should fade in and grow
@ -1072,6 +1150,8 @@ const Workspace = new Lang.Class({
this._animateClone(clone, overlay, x, y, scale, initialPositioning); this._animateClone(clone, overlay, x, y, scale, initialPositioning);
} else { } else {
// cancel any active tweens (otherwise they might override our changes)
Tweener.removeTweens(clone.actor);
clone.actor.set_position(x, y); clone.actor.set_position(x, y);
clone.actor.set_scale(scale, scale); clone.actor.set_scale(scale, scale);
this._updateWindowOverlayPositions(clone, overlay, x, y, scale, false); this._updateWindowOverlayPositions(clone, overlay, x, y, scale, false);
@ -1113,11 +1193,11 @@ const Workspace = new Lang.Class({
}, },
_updateWindowOverlayPositions: function(clone, overlay, x, y, scale, animate) { _updateWindowOverlayPositions: function(clone, overlay, x, y, scale, animate) {
if (!overlay)
return;
let [cloneWidth, cloneHeight] = clone.actor.get_size(); let [cloneWidth, cloneHeight] = clone.actor.get_size();
cloneWidth = scale * cloneWidth; overlay.updatePositions(x, y, cloneWidth * scale, cloneHeight * scale, animate);
cloneHeight = scale * cloneHeight;
if (overlay)
overlay.updatePositions(x, y, cloneWidth, cloneHeight, animate);
}, },
_showWindowOverlay: function(clone, overlay, fade) { _showWindowOverlay: function(clone, overlay, fade) {
@ -1211,6 +1291,7 @@ const Workspace = new Lang.Class({
this._cursorX = x; this._cursorX = x;
this._cursorY = y; this._cursorY = y;
this._currentLayout = null;
this._repositionWindowsId = Mainloop.timeout_add(750, this._repositionWindowsId = Mainloop.timeout_add(750,
Lang.bind(this, this._delayedWindowRepositioning)); Lang.bind(this, this._delayedWindowRepositioning));
}, },
@ -1263,6 +1344,7 @@ const Workspace = new Lang.Class({
clone.actor.set_position (this._x, this._y); clone.actor.set_position (this._x, this._y);
} }
this._currentLayout = null;
this.positionWindows(WindowPositionFlags.ANIMATE); this.positionWindows(WindowPositionFlags.ANIMATE);
}, },
@ -1300,6 +1382,8 @@ const Workspace = new Lang.Class({
// Animate the full-screen to Overview transition. // Animate the full-screen to Overview transition.
zoomToOverview : function() { zoomToOverview : function() {
this._currentLayout = null;
// Position and scale the windows. // Position and scale the windows.
if (Main.overview.animationInProgress) if (Main.overview.animationInProgress)
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL); this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
@ -1464,29 +1548,108 @@ const Workspace = new Lang.Class({
} }
}, },
_computeWindowSlot : function(windowIndex, numberOfWindows) { _isBetterLayout: function(oldLayout, newLayout) {
if (numberOfWindows in POSITIONS) if (oldLayout.scale === undefined)
return POSITIONS[numberOfWindows][windowIndex]; return true;
// If we don't have a predefined scheme for this window count, let spacePower = (newLayout.space - oldLayout.space) * LAYOUT_SPACE_WEIGHT;
// arrange the windows in a grid pattern. let scalePower = (newLayout.scale - oldLayout.scale) * LAYOUT_SCALE_WEIGHT;
let gridWidth = Math.ceil(Math.sqrt(numberOfWindows));
let gridHeight = Math.ceil(numberOfWindows / gridWidth);
let fraction = 0.95 * (1. / gridWidth); if (newLayout.scale > oldLayout.scale && newLayout.space > oldLayout.space) {
// Win win -- better scale and better space
let xCenter = (.5 / gridWidth) + ((windowIndex) % gridWidth) / gridWidth; return true;
let yCenter = (.5 / gridHeight) + Math.floor((windowIndex / gridWidth)) / gridHeight; } else if (newLayout.scale > oldLayout.scale && newLayout.space <= oldLayout.space) {
// Keep new layout only if scale gain outweights aspect space loss
return [xCenter, yCenter, fraction]; return scalePower > spacePower;
} else if (newLayout.scale <= oldLayout.scale && newLayout.space > oldLayout.space) {
// Keep new layout only if aspect space gain outweights scale loss
return spacePower > scalePower;
} else {
// Lose -- worse scale and space
return false;
}
}, },
_computeAllWindowSlots: function(totalWindows) { _computeLayout: function(windows, area, rowSpacing, columnSpacing, bottomPadding) {
let slots = []; // We look for the largest scale that allows us to fit the
for (let i = 0; i < totalWindows; i++) { // largest row/tallest column on the workspace.
slots.push(this._computeWindowSlot(i, totalWindows));
let lastLayout = {};
for (let numRows = 1; ; numRows++) {
let numColumns = Math.ceil(windows.length / numRows);
// If adding a new row does not change column count just stop
// (for instance: 9 windows, with 3 rows -> 3 columns, 4 rows ->
// 3 columns as well => just use 3 rows then)
if (numColumns == lastLayout.numColumns)
break;
let strategyClass = numRows > 2 ? GridLayoutStrategy : UnalignedLayoutStrategy;
let strategy = new strategyClass(this._monitor, rowSpacing, columnSpacing, bottomPadding);
let layout = { area: area, strategy: strategy, numRows: numRows, numColumns: numColumns };
strategy.computeLayout(windows, layout);
strategy.computeScaleAndSpace(layout);
if (!this._isBetterLayout(lastLayout, layout))
break;
lastLayout = layout;
} }
return slots;
return lastLayout;
},
_rectEqual: function(one, two) {
if (one == two)
return true;
return (one.x == two.x &&
one.y == two.y &&
one.width == two.width &&
one.height == two.height);
},
_computeAllWindowSlots: function(windows) {
let totalWindows = windows.length;
let node = this.actor.get_theme_node();
// Window grid spacing
let columnSpacing = node.get_length('-horizontal-spacing');
let rowSpacing = node.get_length('-vertical-spacing');
if (!totalWindows)
return [];
let closeButtonHeight, captionHeight;
if (this._windowOverlays.length) {
// All of the overlays have the same chrome sizes,
// so just pick the first one.
let overlay = this._windowOverlays[0];
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
} else {
[closeButtonHeight, captionHeight] = [0, 0];
}
rowSpacing += captionHeight;
let area = { x: this._x, y: this._y, width: this._width, height: this._height };
area.y += closeButtonHeight;
area.height -= closeButtonHeight;
if (!this._currentLayout)
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight);
let layout = this._currentLayout;
let strategy = layout.strategy;
if (!this._rectEqual(area, layout.area)) {
layout.area = area;
strategy.computeScaleAndSpace(layout);
}
return strategy.computeWindowSlots(layout, area);
}, },
_onCloneSelected : function (clone, time) { _onCloneSelected : function (clone, time) {

View File

@ -51,7 +51,6 @@ const WorkspacesView = new Lang.Class({
this._clipY = 0; this._clipY = 0;
this._clipWidth = 0; this._clipWidth = 0;
this._clipHeight = 0; this._clipHeight = 0;
this._workspaceRatioSpacing = 0;
this._spacing = 0; this._spacing = 0;
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
@ -72,6 +71,7 @@ const WorkspacesView = new Lang.Class({
this._workspaces[w].actor.reparent(this.actor); this._workspaces[w].actor.reparent(this.actor);
this._workspaces[activeWorkspaceIndex].actor.raise_top(); this._workspaces[activeWorkspaceIndex].actor.raise_top();
this._extraWorkspaces = [];
this._updateExtraWorkspaces(); this._updateExtraWorkspaces();
// Position/scale the desktop windows and their children after the // Position/scale the desktop windows and their children after the
@ -83,8 +83,6 @@ const WorkspacesView = new Lang.Class({
Lang.bind(this, function() { Lang.bind(this, function() {
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomToOverview(); this._workspaces[w].zoomToOverview();
if (!this._extraWorkspaces)
return;
for (let w = 0; w < this._extraWorkspaces.length; w++) for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomToOverview(); this._extraWorkspaces[w].zoomToOverview();
})); }));
@ -124,7 +122,6 @@ const WorkspacesView = new Lang.Class({
if (!this._settings.get_boolean('workspaces-only-on-primary')) if (!this._settings.get_boolean('workspaces-only-on-primary'))
return; return;
this._extraWorkspaces = [];
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
if (i == Main.layoutManager.primaryIndex) if (i == Main.layoutManager.primaryIndex)
@ -139,23 +136,20 @@ const WorkspacesView = new Lang.Class({
}, },
_destroyExtraWorkspaces: function() { _destroyExtraWorkspaces: function() {
if (!this._extraWorkspaces)
return;
for (let m = 0; m < this._extraWorkspaces.length; m++) for (let m = 0; m < this._extraWorkspaces.length; m++)
this._extraWorkspaces[m].destroy(); this._extraWorkspaces[m].destroy();
this._extraWorkspaces = null; this._extraWorkspaces = [];
}, },
setGeometry: function(x, y, width, height, spacing) { setGeometry: function(x, y, width, height) {
if (this._x == x && this._y == y && if (this._x == x && this._y == y &&
this._width == width && this._height == height) this._width == width && this._height == height)
return; return;
this._width = width; this._width = width;
this._height = height; this._height = height;
this._x = x; this._x = x;
this._y = y; this._y = y;
this._workspaceRatioSpacing = spacing;
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setGeometry(x, y, width, height); this._workspaces[i].setGeometry(x, y, width, height);
@ -191,8 +185,6 @@ const WorkspacesView = new Lang.Class({
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomFromOverview(); this._workspaces[w].zoomFromOverview();
if (!this._extraWorkspaces)
return;
for (let w = 0; w < this._extraWorkspaces.length; w++) for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomFromOverview(); this._extraWorkspaces[w].zoomFromOverview();
}, },
@ -204,8 +196,6 @@ const WorkspacesView = new Lang.Class({
syncStacking: function(stackIndices) { syncStacking: function(stackIndices) {
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].syncStacking(stackIndices); this._workspaces[i].syncStacking(stackIndices);
if (!this._extraWorkspaces)
return;
for (let i = 0; i < this._extraWorkspaces.length; i++) for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].syncStacking(stackIndices); this._extraWorkspaces[i].syncStacking(stackIndices);
}, },
@ -234,7 +224,7 @@ const WorkspacesView = new Lang.Class({
Tweener.removeTweens(workspace.actor); Tweener.removeTweens(workspace.actor);
let y = (w - active) * (this._height + this._spacing + this._workspaceRatioSpacing); let y = (w - active) * (this._height + this._spacing);
if (showAnimation) { if (showAnimation) {
let params = { y: y, let params = { y: y,
@ -376,9 +366,6 @@ const WorkspacesView = new Lang.Class({
this._firstDragMotion = false; this._firstDragMotion = false;
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(dragEvent.dragActor._delegate); this._workspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
if (!this._extraWorkspaces)
return DND.DragMotionResult.CONTINUE;
for (let i = 0; i < this._extraWorkspaces.length; i++) for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate); this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
} }
@ -392,9 +379,6 @@ const WorkspacesView = new Lang.Class({
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(null); this._workspaces[i].setReservedSlot(null);
if (!this._extraWorkspaces)
return;
for (let i = 0; i < this._extraWorkspaces.length; i++) for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(null); this._extraWorkspaces[i].setReservedSlot(null);
}, },
@ -541,6 +525,16 @@ const WorkspacesDisplay = new Lang.Class({
this._notifyOpacityId = 0; this._notifyOpacityId = 0;
this._swipeScrollBeginId = 0; this._swipeScrollBeginId = 0;
this._swipeScrollEndId = 0; this._swipeScrollEndId = 0;
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
this._settings.connect('changed::dynamic-workspaces',
Lang.bind(this, this._updateSwitcherVisibility));
},
_updateSwitcherVisibility: function() {
this._thumbnailsBox.actor.visible =
this._settings.get_boolean('dynamic-workspaces') ||
global.screen.n_workspaces > 1;
}, },
show: function() { show: function() {
@ -563,6 +557,7 @@ const WorkspacesDisplay = new Lang.Class({
this._controls.show(); this._controls.show();
this._thumbnailsBox.show(); this._thumbnailsBox.show();
this._updateSwitcherVisibility();
this._updateWorkspacesViews(); this._updateWorkspacesViews();
@ -864,28 +859,23 @@ const WorkspacesDisplay = new Lang.Class({
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL); let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);
let clipWidth = width - controlsVisible; let clipWidth = width - controlsVisible;
let clipHeight = (fullHeight / fullWidth) * clipWidth; let clipHeight = fullHeight;
let clipX = rtl ? x + controlsVisible : x; let clipX = rtl ? x + controlsVisible : x;
let clipY = y + (fullHeight - clipHeight) / 2; let clipY = y + (fullHeight - clipHeight) / 2;
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible; let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
widthAdjust += Main.overview._spacing;
width -= widthAdjust; width -= widthAdjust;
if (rtl) if (rtl)
x += widthAdjust; x += widthAdjust;
height = (fullHeight / fullWidth) * width;
let difference = fullHeight - height;
y += difference / 2;
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
let m = 0; let m = 0;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
if (i == this._primaryIndex) { if (i == this._primaryIndex) {
this._workspacesViews[m].setClipRect(clipX, clipY, this._workspacesViews[m].setClipRect(clipX, clipY,
clipWidth, clipHeight); clipWidth, clipHeight);
this._workspacesViews[m].setGeometry(x, y, width, height, this._workspacesViews[m].setGeometry(x, y, width, height);
difference);
m++; m++;
} else if (!this._workspacesOnlyOnPrimary) { } else if (!this._workspacesOnlyOnPrimary) {
this._workspacesViews[m].setClipRect(monitors[i].x, this._workspacesViews[m].setClipRect(monitors[i].x,
@ -895,7 +885,7 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews[m].setGeometry(monitors[i].x, this._workspacesViews[m].setGeometry(monitors[i].x,
monitors[i].y, monitors[i].y,
monitors[i].width, monitors[i].width,
monitors[i].height, 0); monitors[i].height);
m++; m++;
} }
} }
@ -932,16 +922,17 @@ const WorkspacesDisplay = new Lang.Class({
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
let m = 0; let m = 0;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
if (this._workspacesOnlyOnPrimaryChanged && if (this._workspacesOnlyOnPrimary &&
i != this._primaryIndex) i != this._primaryIndex)
continue; continue;
// Assume workspaces are only added at the end // Assume workspaces are only added at the end
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) { for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w); let metaWorkspace = global.screen.get_workspace_by_index(w);
this._workspaces[m++][w] = this._workspaces[m][w] =
new Workspace.Workspace(metaWorkspace, i); new Workspace.Workspace(metaWorkspace, i);
} }
m++;
} }
this._thumbnailsBox.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); this._thumbnailsBox.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces);
@ -974,6 +965,7 @@ const WorkspacesDisplay = new Lang.Class({
for (let i = 0; i < this._workspacesViews.length; i++) for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].updateWorkspaces(oldNumWorkspaces, this._workspacesViews[i].updateWorkspaces(oldNumWorkspaces,
newNumWorkspaces); newNumWorkspaces);
this._updateSwitcherVisibility();
}, },
_updateZoom : function() { _updateZoom : function() {

149
po/be.po
View File

@ -5,8 +5,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-15 23:38+0000\n"
"PO-Revision-Date: 2012-09-26 15:06+0300\n" "PO-Revision-Date: 2012-10-16 12:05+0300\n"
"Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n" "Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n" "Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
"Language: be\n" "Language: be\n"
@ -34,6 +34,14 @@ msgstr "Сістэма"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Паказаць абшар апавяшчэнняў" msgstr "Паказаць абшар апавяшчэнняў"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "Паказаць усе праграмы"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "Адкрыць праграмнае меню"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Абалонка GNOME" msgstr "Абалонка GNOME"
@ -152,34 +160,43 @@ msgid "Keybinding to open the application menu."
msgstr "Клавіятурны скарот для адкрыцця праграмнага меню." msgstr "Клавіятурны скарот для адкрыцця праграмнага меню."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Клавіятурны скарот для рэжыму \"Паказаць праграмы\""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Клавіятурны скарот для рэжыму \"Паказаць праграмы\" у Аглядзе Заняткаў."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Клавіятурны скарот для ўключэння/выключэння абшару апавяшчэнняў" msgstr "Клавіятурны скарот для ўключэння/выключэння абшару апавяшчэнняў"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Клавіятурны скарот для ўключэння/выключэння абшару апавяшчэнняў." msgstr "Клавіятурны скарот для ўключэння/выключэння абшару апавяшчэнняў."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Клавіятурны скарот для ўключэння запісу экрана" msgstr "Клавіятурны скарот для ўключэння запісу экрана"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Клавіятурны скарот для запуску/спынення ўбудаванага запісу экрана." msgstr "Клавіятурны скарот для запуску/спынення ўбудаванага запісу экрана."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Ужываная клавіятура" msgstr "Ужываная клавіятура"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Від ужыванай клавіятуры." msgstr "Від ужыванай клавіятуры."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Частата змены кадраў для запісу скрынкасту." msgstr "Частата змены кадраў для запісу скрынкасту."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -187,11 +204,11 @@ msgstr ""
"Частата змены кадраў выніковага скрынкасту, запісанага пры дапамозе абалонкі " "Частата змены кадраў выніковага скрынкасту, запісанага пры дапамозе абалонкі "
"GNOME (кадраў на секунду)." "GNOME (кадраў на секунду)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Канвеер gstreamer для кадавання скрынкастаў" msgstr "Канвеер gstreamer для кадавання скрынкастаў"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -217,11 +234,11 @@ msgstr ""
"queue ! webmmux\" і запісвае ў WEBM з дапамогай кодэка VP8. %T ўжываецца ў " "queue ! webmmux\" і запісвае ў WEBM з дапамогай кодэка VP8. %T ўжываецца ў "
"якасці замены аптымальнай для сістэмы колькасці ніцяў." "якасці замены аптымальнай для сістэмы колькасці ніцяў."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Пашырэнне файла для захавання скрынкасту" msgstr "Пашырэнне файла для захавання скрынкасту"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -246,11 +263,11 @@ msgstr ""
"Абярыце пашырэнне, каб настроіць графу з выплыўным спісам, якая знаходзіцца " "Абярыце пашырэнне, каб настроіць графу з выплыўным спісам, якая знаходзіцца "
"вышэй." "вышэй."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Сеанс..." msgstr "Сеанс..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Уваход" msgstr "Уваход"
@ -258,23 +275,23 @@ msgstr "Уваход"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Няма ў спісе?" msgstr "Няма ў спісе?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Скасаваць" msgstr "Скасаваць"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Увайсці" msgstr "Увайсці"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Акно ўваходу" msgstr "Акно ўваходу"
@ -283,8 +300,8 @@ msgstr "Акно ўваходу"
msgid "Power" msgid "Power"
msgstr "Праца сістэмы" msgstr "Праца сістэмы"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Прыпыніць камп'ютар" msgstr "Прыпыніць камп'ютар"
@ -292,8 +309,8 @@ msgstr "Прыпыніць камп'ютар"
msgid "Restart" msgid "Restart"
msgstr "Перазапусціць сістэму" msgstr "Перазапусціць сістэму"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Выключыць камп'ютар" msgstr "Выключыць камп'ютар"
@ -344,7 +361,7 @@ msgstr "НАСТРОЙКІ"
msgid "New Window" msgid "New Window"
msgstr "Новае акно" msgstr "Новае акно"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Выдаліць са спіса ўпадабанага" msgstr "Выдаліць са спіса ўпадабанага"
@ -508,16 +525,16 @@ msgstr "На гэтым тыдні"
msgid "Next week" msgid "Next week"
msgstr "На наступным тыдні" msgstr "На наступным тыдні"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Зменныя прыстасаванні" msgstr "Зменныя прыстасаванні"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Адкрыць у %s" msgstr "Адкрыць у %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Выняць" msgstr "Выняць"
@ -888,7 +905,7 @@ msgstr "Рэдагаваць конт"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Невядомая прычына" msgstr "Невядомая прычына"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Паказаць праграмы" msgstr "Паказаць праграмы"
@ -896,14 +913,14 @@ msgstr "Паказаць праграмы"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Настройкі даты і часу" msgstr "Настройкі даты і часу"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Адкрыць каляндар" msgstr "Адкрыць каляндар"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B, %Y" msgstr "%A, %e %B, %Y"
@ -1014,11 +1031,11 @@ msgstr "Усталяваць"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?" msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "трэй" msgstr "трэй"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавіятура" msgstr "Клавіятура"
@ -1071,19 +1088,19 @@ msgstr "Паглядзець выточны код"
msgid "Web Page" msgid "Web Page"
msgstr "Сеціўная старонка" msgstr "Сеціўная старонка"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Адкрыць" msgstr "Адкрыць"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Выдаліць" msgstr "Выдаліць"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Абшар апавяшчэнняў" msgstr "Абшар апавяшчэнняў"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Сістэмная інфармацыя" msgstr "Сістэмная інфармацыя"
@ -1147,7 +1164,7 @@ msgstr "Увядзіце загад:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1155,7 +1172,7 @@ msgstr[0] "%d новае паведамленне"
msgstr[1] "%d новыя паведамленні" msgstr[1] "%d новыя паведамленні"
msgstr[2] "%d новых паведамленняў" msgstr[2] "%d новых паведамленняў"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1195,7 +1212,7 @@ msgstr "Пароль"
msgid "Remember Password" msgid "Remember Password"
msgstr "Запомніць пароль" msgstr "Запомніць пароль"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Разблакіраваць" msgstr "Разблакіраваць"
@ -1314,7 +1331,7 @@ msgstr "Настройкі клавіятуры"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Настройкі мышы" msgstr "Настройкі мышы"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Настройкі гуку" msgstr "Настройкі гуку"
@ -1603,7 +1620,7 @@ msgid "Unknown"
msgstr "Невядомае" msgstr "Невядомае"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Гучнасць" msgstr "Гучнасць"
@ -1611,7 +1628,7 @@ msgstr "Гучнасць"
msgid "Microphone" msgid "Microphone"
msgstr "Мікрафон" msgstr "Мікрафон"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Увайсці іншым карыстальнікам" msgstr "Увайсці іншым карыстальнікам"
@ -1639,39 +1656,35 @@ msgstr "Бяздзейны"
msgid "Unavailable" msgid "Unavailable"
msgstr "Недаступны" msgstr "Недаступны"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Перамяніць карыстальніка"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Перамяніць сеанс"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Апавяшчэнні" msgstr "Апавяшчэнні"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Сістэмныя настройкі" msgstr "Сістэмныя настройкі"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Перамяніць карыстальніка"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Выйсці з сеанса" msgstr "Выйсці з сеанса"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Заблакіраваць" msgstr "Заблакіраваць"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Усталяваць абнаўленні і перазагрузіць камп'ютар" msgstr "Усталяваць абнаўленні і перазагрузіць камп'ютар"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Вам прызначаны стан занятасці для чату" msgstr "Вам прызначаны стан занятасці для чату"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1680,19 +1693,19 @@ msgstr ""
"сеціўны стан абноўлены інфармацыяй аб тым, што вы можаце не ўбачыць чужых " "сеціўны стан абноўлены інфармацыяй аб тым, што вы можаце не ўбачыць чужых "
"паведамленняў у час." "паведамленняў у час."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Вокны" msgstr "Вокны"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Праграмы" msgstr "Праграмы"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Пошук" msgstr "Пошук"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1701,12 +1714,12 @@ msgstr ""
"На жаль, на сёння не хапіла мудрасцяў:\n" "На жаль, на сёння не хапіла мудрасцяў:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Так сказаў Вяшчун %s" msgstr "Так сказаў Вяшчун %s"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Ваша ўлюбёнае велікоднае яйка" msgstr "Ваша ўлюбёнае велікоднае яйка"
@ -1743,19 +1756,19 @@ msgstr[2] "%u уваходаў"
msgid "System Sounds" msgid "System Sounds"
msgstr "Сістэмныя гукі" msgstr "Сістэмныя гукі"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Вывесці нумар версіі праграмы" msgstr "Вывесці нумар версіі праграмы"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Рэжым, які выкарыстоўвае GDM для экрана ўваходу" msgstr "Рэжым, які выкарыстоўвае GDM для экрана ўваходу"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Ужыць асаблівы рэжым, напрыклад, \"gdm\" для экрана ўваходу" msgstr "Ужыць асаблівы рэжым, напрыклад, \"gdm\" для экрана ўваходу"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Вывесці спіс магчымых рэжымаў" msgstr "Вывесці спіс магчымых рэжымаў"

135
po/el.po
View File

@ -4,8 +4,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.po.master\n" "Project-Id-Version: gnome-shell.po.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-16 20:41+0000\n"
"PO-Revision-Date: 2012-09-25 11:15+0200\n" "PO-Revision-Date: 2012-10-23 15:39+0200\n"
"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n" "Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
"Language-Team: team@gnome.gr\n" "Language-Team: team@gnome.gr\n"
"Language: el\n" "Language: el\n"
@ -23,7 +23,7 @@ msgstr "Στιγμιότυπα οθόνης"
#: ../data/50-gnome-shell-screenshot.xml.in.h:2 #: ../data/50-gnome-shell-screenshot.xml.in.h:2
msgid "Record a screencast" msgid "Record a screencast"
msgstr "Καταγραφή ενός βίντεο παρουσίασης" msgstr "Καταγραφή ενός βίντεο οθόνης"
#: ../data/50-gnome-shell-system.xml.in.h:1 #: ../data/50-gnome-shell-system.xml.in.h:1
msgid "System" msgid "System"
@ -182,21 +182,21 @@ msgstr "Ο τύπος του πληκτρολογίου που θα χρησιμ
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "" msgstr ""
"Ο ρυθμός καρέ που θα χρησιμοποιηθεί για την καταγραφή του βίντεο παρουσίασης." "Ο ρυθμός καρέ που θα χρησιμοποιηθεί για την καταγραφή του βίντεο οθόνης."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "" msgstr ""
"Ο ρυθμός καρέ του στιγμιότυπου που παράγεται από τον εγγραφέα βίντεο " "Ο ρυθμός καρέ του στιγμιότυπου που παράγεται από τον εγγραφέα βίντεο οθόνης "
"παρουσίασης του GNOME Shell σε καρέ ανά δευτερόλεπτο." "του GNOME Shell σε καρέ ανά δευτερόλεπτο."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "" msgstr ""
"Ο δίαυλος του gstreamer που χρησιμοποιήθηκε για την κωδικοποίηση του βίντεο " "Ο δίαυλος του gstreamer που χρησιμοποιήθηκε για την κωδικοποίηση του βίντεο "
"παρουσίασης" "οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
#, no-c-format #, no-c-format
@ -229,8 +229,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:28
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "" msgstr ""
"Επέκταση αρχείου που θα χρησιμοποιηθεί για την αποθήκευση του βίντεο " "Επέκταση αρχείου που θα χρησιμοποιηθεί για την αποθήκευση του βίντεο οθόνης"
"παρουσίασης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
msgid "" msgid ""
@ -238,7 +237,7 @@ msgid ""
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
"a different container format." "a different container format."
msgstr "" msgstr ""
"Το όνομα αρχείου για τα καταγεγραμμένα βίντεο παρουσίασης θα είναι μοναδικό, " "Το όνομα αρχείου για τα καταγεγραμμένα βίντεο οθόνης θα είναι μοναδικό, "
"βασισμένο στην τρέχουσα ημερομηνία και θα χρησιμοποιεί αυτή την επέκταση. Θα " "βασισμένο στην τρέχουσα ημερομηνία και θα χρησιμοποιεί αυτή την επέκταση. Θα "
"πρέπει να αλλάζει όταν γίνεται εγγραφή σε διαφορετικό πρότυπο περιέκτη." "πρέπει να αλλάζει όταν γίνεται εγγραφή σε διαφορετικό πρότυπο περιέκτη."
@ -259,11 +258,11 @@ msgstr ""
"Επιλέξτε μια επέκταση για να την ρυθμίσετε χρησιμοποιώντας το πλαίσιο " "Επιλέξτε μια επέκταση για να την ρυθμίσετε χρησιμοποιώντας το πλαίσιο "
"πολλαπλών επιλογών." "πολλαπλών επιλογών."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Συνεδρία..." msgstr "Συνεδρία..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Σύνδεση" msgstr "Σύνδεση"
@ -271,34 +270,33 @@ msgstr "Σύνδεση"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Δεν είστε στη λίστα;" msgstr "Δεν είστε στη λίστα;"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Ακύρωση" msgstr "Ακύρωση"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Σύνδεση" msgstr "Σύνδεση"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Παράθυρο σύνδεσης" msgstr "Παράθυρο σύνδεσης"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:35
#| msgid "Power Off"
msgid "Power" msgid "Power"
msgstr "Ενέργεια" msgstr "Ενέργεια"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Αναστολή" msgstr "Αναστολή"
@ -306,10 +304,10 @@ msgstr "Αναστολή"
msgid "Restart" msgid "Restart"
msgstr "Επανεκκίνηση" msgstr "Επανεκκίνηση"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Τερματισμός" msgstr "Απενεργοποίηση"
#: ../js/gdm/util.js:148 #: ../js/gdm/util.js:148
msgid "Authentication error" msgid "Authentication error"
@ -358,7 +356,7 @@ msgstr "ΡΥΘΜΙΣΕΙΣ"
msgid "New Window" msgid "New Window"
msgstr "Νέο παράθυρο" msgstr "Νέο παράθυρο"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Αφαίρεση από τα αγαπημένα" msgstr "Αφαίρεση από τα αγαπημένα"
@ -522,16 +520,16 @@ msgstr "Αυτή η εβδομάδα"
msgid "Next week" msgid "Next week"
msgstr "Επόμενη εβδομάδα" msgstr "Επόμενη εβδομάδα"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Αφαιρούμενες συσκευές" msgstr "Αφαιρούμενες συσκευές"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Άνοιγμα με %s" msgstr "Άνοιγμα με %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Εξαγωγή" msgstr "Εξαγωγή"
@ -651,7 +649,7 @@ msgstr "Συγνώμη, αυτό δεν λειτούργησε. Παρακαλώ
#: ../js/ui/components/recorder.js:44 #: ../js/ui/components/recorder.js:44
#, no-c-format #, no-c-format
msgid "Screencast from %d %t" msgid "Screencast from %d %t"
msgstr "Βίντεο παρουσίαση από %d %t" msgstr "Βίντεο οθόνης από %d %t"
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use #. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does. #. system-users for now as Empathy does.
@ -905,7 +903,7 @@ msgstr "Επεξεργασία λογαριασμού"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Άγνωστος λόγος" msgstr "Άγνωστος λόγος"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Προβολή εφαρμογών" msgstr "Προβολή εφαρμογών"
@ -913,14 +911,14 @@ msgstr "Προβολή εφαρμογών"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ρυθμίσεις ώρας και ημερομηνίας" msgstr "Ρυθμίσεις ώρας και ημερομηνίας"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Άνοιγμα ημερολογίου" msgstr "Άνοιγμα ημερολογίου"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %B %e, %Y" msgstr "%A %B %e, %Y"
@ -967,13 +965,13 @@ msgstr "Αποσύνδεση"
#: ../js/ui/endSessionDialog.js:81 #: ../js/ui/endSessionDialog.js:81
msgctxt "title" msgctxt "title"
msgid "Power Off" msgid "Power Off"
msgstr "Τερματισμός" msgstr "Απενεργοποίηση"
#: ../js/ui/endSessionDialog.js:82 #: ../js/ui/endSessionDialog.js:82
msgid "Click Power Off to quit these applications and power off the system." msgid "Click Power Off to quit these applications and power off the system."
msgstr "" msgstr ""
"Πατήστε Τερματισμός για να κλείσετε αυτές τις εφαρμογές και να " "Πατήστε Απενεργοποίηση για να κλείσετε αυτές τις εφαρμογές και να "
"απενεργοποιήσετε το σύστημα." "τερματίσετε το σύστημα."
#: ../js/ui/endSessionDialog.js:84 #: ../js/ui/endSessionDialog.js:84
#, c-format #, c-format
@ -994,7 +992,7 @@ msgstr "Επανεκκίνηση"
#: ../js/ui/endSessionDialog.js:92 #: ../js/ui/endSessionDialog.js:92
msgctxt "button" msgctxt "button"
msgid "Power Off" msgid "Power Off"
msgstr "Τερματισμός" msgstr "Απενεργοποίηση"
#: ../js/ui/endSessionDialog.js:98 #: ../js/ui/endSessionDialog.js:98
msgctxt "title" msgctxt "title"
@ -1027,11 +1025,11 @@ msgstr "Εγκατάσταση"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Λήψη και εγκατάσταση '%s' από το extensions.gnome.org ;" msgstr "Λήψη και εγκατάσταση '%s' από το extensions.gnome.org ;"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "περιοχή" msgstr "περιοχή"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Πληκτρολόγιο" msgstr "Πληκτρολόγιο"
@ -1084,19 +1082,19 @@ msgstr "Προβολή πηγής"
msgid "Web Page" msgid "Web Page"
msgstr "Ιστοσελίδα" msgstr "Ιστοσελίδα"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Άνοιγμα" msgstr "Άνοιγμα"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Αφαίρεση" msgstr "Αφαίρεση"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Περιοχή ειδοποιήσεων" msgstr "Περιοχή ειδοποιήσεων"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Πληροφορίες συστήματος" msgstr "Πληροφορίες συστήματος"
@ -1160,14 +1158,14 @@ msgstr "Παρακαλώ πληκτρολογήστε μία εντολή:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %B %d" msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d νέο μήνυμα" msgstr[0] "%d νέο μήνυμα"
msgstr[1] "%d νέα μηνύματα" msgstr[1] "%d νέα μηνύματα"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1206,7 +1204,7 @@ msgstr "Κωδικός"
msgid "Remember Password" msgid "Remember Password"
msgstr "Απομνημόνευση κωδικού" msgstr "Απομνημόνευση κωδικού"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Ξεκλείδωμα" msgstr "Ξεκλείδωμα"
@ -1325,7 +1323,7 @@ msgstr "Ρυθμίσεις πληκτρολογίου"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Ρυθμίσεις ποντικιού" msgstr "Ρυθμίσεις ποντικιού"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Ρυθμίσεις ήχου" msgstr "Ρυθμίσεις ήχου"
@ -1610,7 +1608,7 @@ msgid "Unknown"
msgstr "Άγνωστο" msgstr "Άγνωστο"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Ένταση ήχου" msgstr "Ένταση ήχου"
@ -1618,7 +1616,7 @@ msgstr "Ένταση ήχου"
msgid "Microphone" msgid "Microphone"
msgstr "Μικρόφωνο" msgstr "Μικρόφωνο"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Είσοδος ως άλλος χρήστης" msgstr "Είσοδος ως άλλος χρήστης"
@ -1646,39 +1644,35 @@ msgstr "Αδρανής"
msgid "Unavailable" msgid "Unavailable"
msgstr "Μη διαθέσιμος-η" msgstr "Μη διαθέσιμος-η"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Αλλαγή χρήστη"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Αλλαγή συνεδρίας"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Ειδοποιήσεις" msgstr "Ειδοποιήσεις"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Ρυθμίσεις συστήματος" msgstr "Ρυθμίσεις συστήματος"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Αλλαγή χρήστη"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Αποσύνδεση" msgstr "Αποσύνδεση"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Κλείδωμα" msgstr "Κλείδωμα"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Εγκατάσταση ενημερώσεων & επανεκκίνηση" msgstr "Εγκατάσταση ενημερώσεων & επανεκκίνηση"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Η κατάσταση συνομιλίας σας θα ορισθεί σε απασχολημένος" msgstr "Η κατάσταση συνομιλίας σας θα ορισθεί σε απασχολημένος"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1699,7 +1693,7 @@ msgstr "Εφαρμογές"
msgid "Search" msgid "Search"
msgstr "Αναζήτηση" msgstr "Αναζήτηση"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1708,12 +1702,12 @@ msgstr ""
"Συγγνώμη, κανένα απόφθεγμα για εσάς σήμερα:\n" "Συγγνώμη, κανένα απόφθεγμα για εσάς σήμερα:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s ο Προφήτης λέει" msgstr "%s ο Προφήτης λέει"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Το αγαπημένο σας Easter Egg" msgstr "Το αγαπημένο σας Easter Egg"
@ -1748,20 +1742,20 @@ msgstr[1] "%u είσοδοι"
msgid "System Sounds" msgid "System Sounds"
msgstr "Ήχοι συστήματος" msgstr "Ήχοι συστήματος"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Εκτύπωση έκδοσης" msgstr "Εκτύπωση έκδοσης"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Λειτουργία που απαιτείται από το GDM για την οθόνη σύνδεσης" msgstr "Λειτουργία που απαιτείται από το GDM για την οθόνη σύνδεσης"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Χρησιμοποιήστε μια συγκεκριμένη λειτουργία, π.χ \"gdm\" για την οθόνη εισόδου" "Χρησιμοποιήστε μια συγκεκριμένη λειτουργία, π.χ \"gdm\" για την οθόνη εισόδου"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Λίστα πιθανών λειτουργιών" msgstr "Λίστα πιθανών λειτουργιών"
@ -1790,6 +1784,9 @@ msgstr "Προεπιλογή"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Το παράθυρο πιστοποίησης έκλεισε από τον χρήστη" msgstr "Το παράθυρο πιστοποίησης έκλεισε από τον χρήστη"
#~ msgid "Switch Session"
#~ msgstr "Αλλαγή συνεδρίας"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "απενεργοποιημένοι πάροχοι OpenSearch" #~ msgstr "απενεργοποιημένοι πάροχοι OpenSearch"

159
po/es.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-15 23:38+0000\n"
"PO-Revision-Date: 2012-09-25 10:26+0200\n" "PO-Revision-Date: 2012-10-16 11:06+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: \n" "Language: \n"
@ -37,6 +37,16 @@ msgstr "Sistema"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Mostrar la bandeja de mensajes" msgstr "Mostrar la bandeja de mensajes"
#: ../data/50-gnome-shell-system.xml.in.h:3
#| msgid "Show Applications"
msgid "Show all applications"
msgstr "Mostrar todas las aplicaciones"
#: ../data/50-gnome-shell-system.xml.in.h:4
#| msgid "Keybinding to open the application menu"
msgid "Open the application menu"
msgstr "Abrir el menú de la aplicación"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -155,34 +165,47 @@ msgid "Keybinding to open the application menu."
msgstr "Asociación de teclas para abrir el menú de la aplicación." msgstr "Asociación de teclas para abrir el menú de la aplicación."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Asociación de teclas para la vista «Mostrar aplicaciones»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#| msgid "Keybinding to open the application menu."
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Asociación de teclas para abrir la vista «Mostrar aplicaciones» de la vista "
"de actividades."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes" msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes." msgstr "Asociación de teclas cambiar la visibilidad de la bandeja de mensajes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Asociación de teclas cambiar el grabador de pantalla" msgstr "Asociación de teclas cambiar el grabador de pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla." msgstr "Asociación de teclas para iniciar/detener el grabador de pantalla."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Qué teclado usar" msgstr "Qué teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "El tipo de teclado que usar." msgstr "El tipo de teclado que usar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Tasa de fotogramas usada para grabar «screencast»." msgstr "Tasa de fotogramas usada para grabar «screencast»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -190,11 +213,11 @@ msgstr ""
"La tasa de fotogramas de la grabación resultante grabada por el grabador de " "La tasa de fotogramas de la grabación resultante grabada por el grabador de "
"«screencast» de GNOME Shell, en fotogramas por segundo." "«screencast» de GNOME Shell, en fotogramas por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La tubería de gstreamer usada para codificar el «screencast»" msgstr "La tubería de gstreamer usada para codificar el «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -220,11 +243,11 @@ msgstr ""
"threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T " "threads=%T ! queue ! webmmux» y graba en WEBM usando el códec VP8. Se usa %T "
"como marcador de posición para el número de hilos óptimos en el sistema." "como marcador de posición para el número de hilos óptimos en el sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Extensión de archivo que usar para almacenar los «screencast»" msgstr "Extensión de archivo que usar para almacenar los «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -248,11 +271,11 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Seleccione una extensión que configurar usando la caja combinada de arriba." "Seleccione una extensión que configurar usando la caja combinada de arriba."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesión…" msgstr "Sesión…"
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
@ -260,34 +283,33 @@ msgstr "Iniciar sesión"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "¿No está en la lista?" msgstr "¿No está en la lista?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Ventana de inicio de sesión" msgstr "Ventana de inicio de sesión"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:35
#| msgid "Power Off"
msgid "Power" msgid "Power"
msgstr "Energía" msgstr "Energía"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@ -295,8 +317,8 @@ msgstr "Suspender"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
@ -347,7 +369,7 @@ msgstr "CONFIGURACIÓN"
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
@ -511,16 +533,16 @@ msgstr "Esta semana"
msgid "Next week" msgid "Next week"
msgstr "La semana que viene" msgstr "La semana que viene"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Dispositivos extraíbles" msgstr "Dispositivos extraíbles"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Expulsar" msgstr "Expulsar"
@ -894,7 +916,7 @@ msgstr "Editar cuenta"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón desconocida" msgstr "Razón desconocida"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Mostrar aplicaciones" msgstr "Mostrar aplicaciones"
@ -902,14 +924,14 @@ msgstr "Mostrar aplicaciones"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha" msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir calendario" msgstr "Abrir calendario"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y" msgstr "%A, %e de %B de %Y"
@ -1013,11 +1035,11 @@ msgstr "Instalar"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?" msgstr "¿Descargar e instalar «%s» desde extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "bandeja" msgstr "bandeja"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
@ -1070,19 +1092,19 @@ msgstr "Ver fuente"
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Abrir" msgstr "Abrir"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Bandeja de mensajes" msgstr "Bandeja de mensajes"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -1146,14 +1168,14 @@ msgstr "Introduzca un comando:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d mensaje nuevo" msgstr[0] "%d mensaje nuevo"
msgstr[1] "%d mensajes nuevos" msgstr[1] "%d mensajes nuevos"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1192,7 +1214,7 @@ msgstr "Contraseña"
msgid "Remember Password" msgid "Remember Password"
msgstr "Recordar contraseña" msgstr "Recordar contraseña"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@ -1310,7 +1332,7 @@ msgstr "Configuración del teclado"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Ajustes del ratón…" msgstr "Ajustes del ratón…"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Configuración del sonido" msgstr "Configuración del sonido"
@ -1595,7 +1617,7 @@ msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volumen" msgstr "Volumen"
@ -1603,7 +1625,7 @@ msgstr "Volumen"
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Iniciar sesión como otro usuario" msgstr "Iniciar sesión como otro usuario"
@ -1631,39 +1653,35 @@ msgstr "Inactivo"
msgid "Unavailable" msgid "Unavailable"
msgstr "No disponible" msgstr "No disponible"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Cambiar de sesión"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Notificaciones" msgstr "Notificaciones"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Configuración del sistema" msgstr "Configuración del sistema"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Cerrar la sesión" msgstr "Cerrar la sesión"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instalar actualizaciones y reiniciar" msgstr "Instalar actualizaciones y reiniciar"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Su estado del chat se establecerá a «ocupado»" msgstr "Su estado del chat se establecerá a «ocupado»"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1672,19 +1690,19 @@ msgstr ""
"chat. Su estado en línea se ha ajustado para que otros sepan que puede no " "chat. Su estado en línea se ha ajustado para que otros sepan que puede no "
"leer sus mensajes." "leer sus mensajes."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Ventanas" msgstr "Ventanas"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Aplicaciones" msgstr "Aplicaciones"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Buscar" msgstr "Buscar"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1693,12 +1711,12 @@ msgstr ""
"Hoy no tiene ningún mensaje:\n" "Hoy no tiene ningún mensaje:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s el oráculo dice" msgstr "%s el oráculo dice"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Su mensaje oculto favorito" msgstr "Su mensaje oculto favorito"
@ -1733,21 +1751,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sonidos del sistema" msgstr "Sonidos del sistema"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Imprimir versión" msgstr "Imprimir versión"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para la pantalla de inicio" msgstr "Modo usado por GDM para la pantalla de inicio"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de " "Usar un modo específico, por ejemplo, «gdm» para la pantalla de inicio de "
"sesión" "sesión"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar los modos posibles" msgstr "Listar los modos posibles"
@ -1776,6 +1794,9 @@ msgstr "Predeterminada"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "El usuario rechazó el diálogo de autenticación" msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "Switch Session"
#~ msgstr "Cambiar de sesión"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "proveedores OpenSearch desactivados" #~ msgstr "proveedores OpenSearch desactivados"

View File

@ -708,7 +708,7 @@ msgstr "ارسال در <b>%A</b>, <b>%B %d</b>, %Y"
#: ../js/ui/components/telepathyClient.js:988 #: ../js/ui/components/telepathyClient.js:988
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s با عنوان %s شناخته می‌شود" msgstr "%s با عنوان %s شناخته می‌شود"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
@ -723,7 +723,7 @@ msgstr "دعوتنامه به %s"
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1096
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s از شما دعوت می‌کند که به %s بپیوندید" msgstr "%s از شما دعوت می‌کند که به %s بپیوندید"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1098
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1177
@ -767,13 +767,13 @@ msgstr "پاسخگویی"
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1171
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s در حال ارسال %s به شما است" msgstr "%s در حال ارسال %s به شما است"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1206
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد" msgstr "%s اجازه دسترسی برای دیدن زمان‌هایی که شما برخط هستید را دارد"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1298
msgid "Network error" msgid "Network error"
@ -938,8 +938,8 @@ msgstr ""
#, c-format #, c-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." msgstr[0] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد." msgstr[1] "%s به طور خودکار در مدت %Id ثانیه از سیستم خارج خواهد شد."
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, c-format #, c-format
@ -1698,7 +1698,7 @@ msgstr ""
#: ../js/ui/wanda.js:121 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s پیشگو می‌گوید" msgstr "%s پیشگو می‌گوید"
#: ../js/ui/wanda.js:162 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
@ -1852,16 +1852,16 @@ msgstr "محاوره تایید هویت از طرف کاربر رد شد"
#~ msgstr "شبکه" #~ msgstr "شبکه"
#~ msgid "%s is online." #~ msgid "%s is online."
#~ msgstr "%s بر خط است." #~ msgstr "%s بر خط است."
#~ msgid "%s is offline." #~ msgid "%s is offline."
#~ msgstr "%s برون خط است." #~ msgstr "%s برون خط است."
#~ msgid "%s is away." #~ msgid "%s is away."
#~ msgstr "%s غایب است." #~ msgstr "%s غایب است."
#~ msgid "%s is busy." #~ msgid "%s is busy."
#~ msgstr "%s مشغول است." #~ msgstr "%s مشغول است."
#~ msgid "Hidden" #~ msgid "Hidden"
#~ msgstr "نامرئی" #~ msgstr "نامرئی"

146
po/gl.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-09-25 10:47+0200\n" "POT-Creation-Date: 2012-10-16 13:35+0200\n"
"PO-Revision-Date: 2012-09-25 10:48+0200\n" "PO-Revision-Date: 2012-10-16 14:22+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n" "Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n" "Language: gl\n"
@ -39,6 +39,14 @@ msgstr "Sistema"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Mostrar a bandexa de mensaxes" msgstr "Mostrar a bandexa de mensaxes"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "Mostrar todos os aplicativos"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "Abrir o menú de aplicativo"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -156,35 +164,46 @@ msgid "Keybinding to open the application menu."
msgstr "Combinación de teclas para abrir o menú de aplicativo." msgstr "Combinación de teclas para abrir o menú de aplicativo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Combinación de teclas para abrir a vista «Mostrar aplicativos»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Combinación de teclas para abrir a vista \"Mostrar aplicativos\" da Vista xera "
"de Actividades."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Combinación de teclas para mostrar/ocultar a área de mensaxes" msgstr "Combinación de teclas para mostrar/ocultar a área de mensaxes"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Combinación de teclas para mostrar/ocultar a área de mensaxes." msgstr "Combinación de teclas para mostrar/ocultar a área de mensaxes."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Combinación de teclas para trocar a gravadora de pantalla" msgstr "Combinación de teclas para trocar a gravadora de pantalla"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "" msgstr ""
"Combinación de teclas para iniciar/deter a gravadora de pantalla incrustada." "Combinación de teclas para iniciar/deter a gravadora de pantalla incrustada."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Que teclado usar" msgstr "Que teclado usar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "O tipo de teclado a usar." msgstr "O tipo de teclado a usar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Taxa de marcos usada para gravar «screencast»." msgstr "Taxa de marcos usada para gravar «screencast»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -192,11 +211,11 @@ msgstr ""
"A taxa de marcos da grabación resultante grabada polo grabador de " "A taxa de marcos da grabación resultante grabada polo grabador de "
"«screencast» de GNOME Shell, en marcos por segundo." "«screencast» de GNOME Shell, en marcos por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A tubería de gstreamer usada para codificar o «screenast»." msgstr "A tubería de gstreamer usada para codificar o «screenast»."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -222,11 +241,11 @@ msgstr ""
"queue ! webmmux» e grava en WEBM usando o códec VP8. Úsase %T como marcador " "queue ! webmmux» e grava en WEBM usando o códec VP8. Úsase %T como marcador "
"de posición para o número de fillos óptimos no sistema." "de posición para o número de fillos óptimos no sistema."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Extensión de ficheiro que usar para almacenar os «screencast»" msgstr "Extensión de ficheiro que usar para almacenar os «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -250,11 +269,11 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Seleccione unha extensión que configurar usando a caixa combinada de arriba." "Seleccione unha extensión que configurar usando a caixa combinada de arriba."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesión…" msgstr "Sesión…"
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
@ -262,23 +281,23 @@ msgstr "Iniciar sesión"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Non está na lista?" msgstr "Non está na lista?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Iniciar sesión" msgstr "Iniciar sesión"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Xanela de inicio de sesión" msgstr "Xanela de inicio de sesión"
@ -287,8 +306,8 @@ msgstr "Xanela de inicio de sesión"
msgid "Power" msgid "Power"
msgstr "Apagar" msgstr "Apagar"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Suspender" msgstr "Suspender"
@ -296,8 +315,8 @@ msgstr "Suspender"
msgid "Restart" msgid "Restart"
msgstr "Reiniciar" msgstr "Reiniciar"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Apagar" msgstr "Apagar"
@ -348,7 +367,7 @@ msgstr "CONFIGURACIÓN"
msgid "New Window" msgid "New Window"
msgstr "Xanela nova" msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Retirar dos marcadores" msgstr "Retirar dos marcadores"
@ -512,16 +531,16 @@ msgstr "Esta semana"
msgid "Next week" msgid "Next week"
msgstr "A vindeira semana" msgstr "A vindeira semana"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Dispositivos extraíbeis" msgstr "Dispositivos extraíbeis"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Abrir con %s" msgstr "Abrir con %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Expulsar" msgstr "Expulsar"
@ -895,7 +914,7 @@ msgstr "Editar conta"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razón descoñecida" msgstr "Razón descoñecida"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Mostrar aplicativos" msgstr "Mostrar aplicativos"
@ -903,14 +922,14 @@ msgstr "Mostrar aplicativos"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Preferencias de data e hora" msgstr "Preferencias de data e hora"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir o calendario" msgstr "Abrir o calendario"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a, %e de %B, %Y" msgstr "%a, %e de %B, %Y"
@ -1078,11 +1097,11 @@ msgstr "Abrir"
msgid "Remove" msgid "Remove"
msgstr "Retirar" msgstr "Retirar"
#: ../js/ui/messageTray.js:2088 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Bandexa de mensaxes" msgstr "Bandexa de mensaxes"
#: ../js/ui/messageTray.js:2551 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Información do sistema" msgstr "Información do sistema"
@ -1146,14 +1165,14 @@ msgstr "Escriba unha orde:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d mensaxe nova" msgstr[0] "%d mensaxe nova"
msgstr[1] "%d mensaxes novas" msgstr[1] "%d mensaxes novas"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1192,7 +1211,7 @@ msgstr "Contrasinal"
msgid "Remember Password" msgid "Remember Password"
msgstr "Lembrar o contrasinal" msgstr "Lembrar o contrasinal"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
@ -1310,7 +1329,7 @@ msgstr "Preferencias do teclado"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Preferencias do rato" msgstr "Preferencias do rato"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Preferencias do son" msgstr "Preferencias do son"
@ -1595,7 +1614,7 @@ msgid "Unknown"
msgstr "Descoñecido" msgstr "Descoñecido"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
@ -1603,7 +1622,7 @@ msgstr "Volume"
msgid "Microphone" msgid "Microphone"
msgstr "Micrófono" msgstr "Micrófono"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Iniciar sesión como outro usuario" msgstr "Iniciar sesión como outro usuario"
@ -1631,39 +1650,35 @@ msgstr "Inactivo"
msgid "Unavailable" msgid "Unavailable"
msgstr "Non dispoñíbel" msgstr "Non dispoñíbel"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Cambiar de sesión"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Notificacións" msgstr "Notificacións"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Preferencias do sistema" msgstr "Preferencias do sistema"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Saír da sesión" msgstr "Saír da sesión"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instalar actualizacións e reiniciar" msgstr "Instalar actualizacións e reiniciar"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "O seu estado de conversa definirase como «ocupado»" msgstr "O seu estado de conversa definirase como «ocupado»"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1672,19 +1687,19 @@ msgstr ""
"conversa. O seu estado de conexión axustouse para que outros saiban que non " "conversa. O seu estado de conexión axustouse para que outros saiban que non "
"quere ver as súas mensaxes." "quere ver as súas mensaxes."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Xanelas" msgstr "Xanelas"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Aplicativos" msgstr "Aplicativos"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Buscar" msgstr "Buscar"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1693,12 +1708,12 @@ msgstr ""
"Hoxe non ten ningunha mensaxe:\n" "Hoxe non ten ningunha mensaxe:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s o oráculo dí" msgstr "%s o oráculo dí"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "A súa mensaxe oculta favorita" msgstr "A súa mensaxe oculta favorita"
@ -1733,21 +1748,21 @@ msgstr[1] "%u entradas"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sons do sistema" msgstr "Sons do sistema"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Imprimir versión" msgstr "Imprimir versión"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Modo usado por GDM para a pantalla de inicio" msgstr "Modo usado por GDM para a pantalla de inicio"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de " "Usar un modo específico, por exemplo, «gdm» para a pantalla de inicio de "
"sesión" "sesión"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Listar os modos posíbeis" msgstr "Listar os modos posíbeis"
@ -1776,6 +1791,9 @@ msgstr "Predeterminado"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "O usuario rexeitou o diálogo de autenticación" msgstr "O usuario rexeitou o diálogo de autenticación"
#~ msgid "Switch Session"
#~ msgstr "Cambiar de sesión"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "fornecedores OpenSearch desactivados" #~ msgstr "fornecedores OpenSearch desactivados"

View File

@ -351,12 +351,12 @@ msgstr "הוספה למועדפים"
#: ../js/ui/appFavorites.js:87 #: ../js/ui/appFavorites.js:87
#, c-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s נוסף למועדפים שלך." msgstr "%s נוסף למועדפים שלך."
#: ../js/ui/appFavorites.js:118 #: ../js/ui/appFavorites.js:118
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s הוסר מהמועדפים שלך." msgstr "%s הוסר מהמועדפים שלך."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
@ -751,13 +751,13 @@ msgstr "מענה"
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1171
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s שולח/ת אליך %s" msgstr "%s שולח/ת אליך %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1206
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון" msgstr "%s רוצה לקבל הרשאות כדי לראות מתי מצבך הוא מקוון"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1298
msgid "Network error" msgid "Network error"
@ -1017,7 +1017,7 @@ msgstr "לא מותקנות הרחבות"
#: ../js/ui/lookingGlass.js:745 #: ../js/ui/lookingGlass.js:745
#, c-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s לא העלה שגיאות כלשהן." msgstr "%s לא העלה שגיאות כלשהן."
#: ../js/ui/lookingGlass.js:751 #: ../js/ui/lookingGlass.js:751
msgid "Hide Errors" msgid "Hide Errors"
@ -1436,7 +1436,7 @@ msgstr "חיוג אוטומטי"
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476 #: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476
#, c-format #, c-format
msgid "Auto %s" msgid "Auto %s"
msgstr "%s אוטומטי" msgstr "%s אוטומטי"
#: ../js/ui/status/network.js:855 #: ../js/ui/status/network.js:855
msgid "Auto bluetooth" msgid "Auto bluetooth"
@ -1688,7 +1688,7 @@ msgstr ""
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:123
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s, כה אמרה האוראקל" msgstr "%s, כה אמרה האוראקל"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:164
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
@ -1697,7 +1697,7 @@ msgstr "ביצת הפסחא האהובה עליך"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "'%s' מוכן" msgstr "'%s' מוכן"
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1 #: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
msgid "Evolution Calendar" msgid "Evolution Calendar"
@ -1845,16 +1845,16 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgstr "רשת" #~ msgstr "רשת"
#~ msgid "%s is online." #~ msgid "%s is online."
#~ msgstr "%s התחבר/ה." #~ msgstr "%s התחבר/ה."
#~ msgid "%s is offline." #~ msgid "%s is offline."
#~ msgstr "%s התנתק/ה." #~ msgstr "%s התנתק/ה."
#~ msgid "%s is away." #~ msgid "%s is away."
#~ msgstr "'%s' מרוחק/ת." #~ msgstr "'%s' מרוחק/ת."
#~ msgid "%s is busy." #~ msgid "%s is busy."
#~ msgstr "%s עסוק/ה." #~ msgstr "%s עסוק/ה."
#~ msgid "Hidden" #~ msgid "Hidden"
#~ msgstr "מוסתר" #~ msgstr "מוסתר"
@ -1887,7 +1887,7 @@ msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
#~ msgstr "הצגת ססמה" #~ msgstr "הצגת ססמה"
#~ msgid "%s has finished starting" #~ msgid "%s has finished starting"
#~ msgstr "%s סיים את תהליך ההתחלה" #~ msgstr "%s סיים את תהליך ההתחלה"
#~ msgid "Home Folder" #~ msgid "Home Folder"
#~ msgstr "תיקיית הבית" #~ msgstr "תיקיית הבית"

154
po/id.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-15 23:38+0000\n"
"PO-Revision-Date: 2012-09-25 09:53+0700\n" "PO-Revision-Date: 2012-10-16 07:11+0700\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n" "Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian <gnome@i15n.org>\n" "Language-Team: Indonesian <gnome@i15n.org>\n"
"Language: id\n" "Language: id\n"
@ -20,7 +20,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n" "Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-SourceCharset: UTF-8\n" "X-Poedit-SourceCharset: UTF-8\n"
"X-Generator: Poedit 1.5.3\n" "X-Generator: Poedit 1.5.4\n"
#: ../data/50-gnome-shell-screenshot.xml.in.h:1 #: ../data/50-gnome-shell-screenshot.xml.in.h:1
msgid "Screenshots" msgid "Screenshots"
@ -38,6 +38,14 @@ msgstr "Sistem"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Tampilkan baki pesan" msgstr "Tampilkan baki pesan"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "Tampilkan semua aplikasi"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "Buka menu aplikasi"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -155,34 +163,45 @@ msgid "Keybinding to open the application menu."
msgstr "Kombinasi tombol untuk membuka menu aplikasi." msgstr "Kombinasi tombol untuk membuka menu aplikasi."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Kombinasi tombol untuk membuka tilikan \"Tampilkan Aplikasi\""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr ""
"Kombinasi tombol untuk membuka tilikan Ringkasan Aktivitas \"Tampilkan "
"Aplikasi\"."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Kombinasi tombol untuk kenampakan baki pesan" msgstr "Kombinasi tombol untuk kenampakan baki pesan"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Kombinasi tombol untuk kenampakan baki pesan." msgstr "Kombinasi tombol untuk kenampakan baki pesan."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Kombinasi tombol untuk perekaman layar" msgstr "Kombinasi tombol untuk perekaman layar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Kombinasi tombol mulai/menghentikan perekam layar bawaan." msgstr "Kombinasi tombol mulai/menghentikan perekam layar bawaan."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Papan tik mana yang akan dipakai" msgstr "Papan tik mana yang akan dipakai"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Jenis papan tik yang akan dipakai." msgstr "Jenis papan tik yang akan dipakai."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Laju gambar untuk menyimpan tangkapan layar." msgstr "Laju gambar untuk menyimpan tangkapan layar."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -190,11 +209,11 @@ msgstr ""
"Laju frame dari hasil screencast yang direkam oleh perekam screencast GNOME " "Laju frame dari hasil screencast yang direkam oleh perekam screencast GNOME "
"Shell dalam frame per detik." "Shell dalam frame per detik."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Jalur pipa gstreamer yang dipakai untuk mengode screencast" msgstr "Jalur pipa gstreamer yang dipakai untuk mengode screencast"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -220,11 +239,11 @@ msgstr ""
"dan merekam ke WEBM memakai kodek VP8. %T digunakan sebagai pewakil untuk " "dan merekam ke WEBM memakai kodek VP8. %T digunakan sebagai pewakil untuk "
"perkiraan jumlah thread optimal pada sistem." "perkiraan jumlah thread optimal pada sistem."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Ekstensi berkas untuk menyimpan tangkapan layar" msgstr "Ekstensi berkas untuk menyimpan tangkapan layar"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -247,11 +266,11 @@ msgstr "Ekstensi"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Pilih ekstensi yang ingin dikonfigurasi pada kotak di atas." msgstr "Pilih ekstensi yang ingin dikonfigurasi pada kotak di atas."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesi..." msgstr "Sesi..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Masuk" msgstr "Masuk"
@ -259,34 +278,33 @@ msgstr "Masuk"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Tak masuk daftar?" msgstr "Tak masuk daftar?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Batal" msgstr "Batal"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Masuk" msgstr "Masuk"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Jendela Log Masuk" msgstr "Jendela Log Masuk"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:35
#| msgid "Power Off"
msgid "Power" msgid "Power"
msgstr "Daya" msgstr "Daya"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Suspensi" msgstr "Suspensi"
@ -294,8 +312,8 @@ msgstr "Suspensi"
msgid "Restart" msgid "Restart"
msgstr "Nyalakan Ulang" msgstr "Nyalakan Ulang"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Matikan" msgstr "Matikan"
@ -346,7 +364,7 @@ msgstr "PENGATURAN"
msgid "New Window" msgid "New Window"
msgstr "Jendela Baru" msgstr "Jendela Baru"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Hapus dari Favorit" msgstr "Hapus dari Favorit"
@ -510,16 +528,16 @@ msgstr "Minggu ini"
msgid "Next week" msgid "Next week"
msgstr "Minggu depan" msgstr "Minggu depan"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Perangkat Yang Dapat Dicabut" msgstr "Perangkat Yang Dapat Dicabut"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Buka dengan %s" msgstr "Buka dengan %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Keluarkan" msgstr "Keluarkan"
@ -891,7 +909,7 @@ msgstr "Sunting Akun"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Alasan yang tidak diketahui" msgstr "Alasan yang tidak diketahui"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Tampilkan Aplikasi" msgstr "Tampilkan Aplikasi"
@ -899,14 +917,14 @@ msgstr "Tampilkan Aplikasi"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Pengaturan Waktu dan Tanggal" msgstr "Pengaturan Waktu dan Tanggal"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Buka Kalender" msgstr "Buka Kalender"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y" msgstr "%A, %e %B %Y"
@ -1005,11 +1023,11 @@ msgstr "Pasang"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Unduh dan pasang '%s' dari extensions.gnome.org?" msgstr "Unduh dan pasang '%s' dari extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "baki" msgstr "baki"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Papan Ketik" msgstr "Papan Ketik"
@ -1062,19 +1080,19 @@ msgstr "Tilik Sumber"
msgid "Web Page" msgid "Web Page"
msgstr "Halaman Web" msgstr "Halaman Web"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Buka" msgstr "Buka"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Hapus" msgstr "Hapus"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Baki Pesan" msgstr "Baki Pesan"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Informasi Sistem" msgstr "Informasi Sistem"
@ -1139,13 +1157,13 @@ msgstr "Ketikkan perintah:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d pesan baru" msgstr[0] "%d pesan baru"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1183,7 +1201,7 @@ msgstr "Sandi"
msgid "Remember Password" msgid "Remember Password"
msgstr "Ingat Sandi" msgstr "Ingat Sandi"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Buka Kunci" msgstr "Buka Kunci"
@ -1301,7 +1319,7 @@ msgstr "Pengaturan Papan Ketik"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Pengaturan Tetikus" msgstr "Pengaturan Tetikus"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Pengaturan Suara" msgstr "Pengaturan Suara"
@ -1582,7 +1600,7 @@ msgid "Unknown"
msgstr "Tak Dikenal" msgstr "Tak Dikenal"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Volume" msgstr "Volume"
@ -1590,7 +1608,7 @@ msgstr "Volume"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Masuk sebagai pengguna lain" msgstr "Masuk sebagai pengguna lain"
@ -1618,39 +1636,35 @@ msgstr "Menganggur"
msgid "Unavailable" msgid "Unavailable"
msgstr "Tak tersedia" msgstr "Tak tersedia"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Ganti Pengguna"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Pindah Sesi"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Pemberitahuan" msgstr "Pemberitahuan"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Pengaturan Sistem" msgstr "Pengaturan Sistem"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Ganti Pengguna"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Keluar" msgstr "Keluar"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Kunci" msgstr "Kunci"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Pasang Pemutakhiran & Jalankan Ulang" msgstr "Pasang Pemutakhiran & Jalankan Ulang"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Status obrolan Anda akan ditata ke sibuk" msgstr "Status obrolan Anda akan ditata ke sibuk"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1659,19 +1673,19 @@ msgstr ""
"telah disesuaikan untuk memberitahu pihak lain bahwa Anda mungkin tak " "telah disesuaikan untuk memberitahu pihak lain bahwa Anda mungkin tak "
"melihat pesan mereka." "melihat pesan mereka."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Jendela" msgstr "Jendela"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Aplikasi" msgstr "Aplikasi"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Cari" msgstr "Cari"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1680,12 +1694,12 @@ msgstr ""
"Maaf, tidak ada kata-kata bijak bagi Anda hari ini:\n" "Maaf, tidak ada kata-kata bijak bagi Anda hari ini:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s sang Peramal berkata" msgstr "%s sang Peramal berkata"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Easter Egg kesukaan Anda" msgstr "Easter Egg kesukaan Anda"
@ -1718,19 +1732,19 @@ msgstr[0] "%u Masukan"
msgid "System Sounds" msgid "System Sounds"
msgstr "Suara Sistem" msgstr "Suara Sistem"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Versi Cetak" msgstr "Versi Cetak"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Mode yang dipakai oleh layar log masuk GDM" msgstr "Mode yang dipakai oleh layar log masuk GDM"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk" msgstr "Menggunakan mode tertentu, mis. \"gdm\" untuk layar masuk"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Menampilkan mode yang mungkin" msgstr "Menampilkan mode yang mungkin"

153
po/ja.po
View File

@ -12,9 +12,9 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-16 12:22+0000\n"
"PO-Revision-Date: 2012-09-25 09:10+0900\n" "PO-Revision-Date: 2012-10-16 10:53+0900\n"
"Last-Translator: Jiro Matsuzawa <jmatsuzawa@gnome.org>\n" "Last-Translator: Takayuki KUSANO <AE5T-KSN@asahi-net.or.jp>\n"
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n" "Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
"Language: ja\n" "Language: ja\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -39,6 +39,14 @@ msgstr "システム"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "メッセージトレイを表示する" msgstr "メッセージトレイを表示する"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "すべてのアプリケーションを表示"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "アプリケーションメニューを開く"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "GNOME Shell" msgstr "GNOME Shell"
@ -121,51 +129,59 @@ msgid "Keybinding to open the application menu."
msgstr "アプリケーションメニューを開くためのキーバインドです。" msgstr "アプリケーションメニューを開くためのキーバインドです。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "「アプリケーションの表示」のビューを開くキーバインド"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "アクティビティで「アプリケーションの表示」のビューを開くキーバインドです。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "メッセージトレイの表示・非表示を切り替えるキーバインド" msgstr "メッセージトレイの表示・非表示を切り替えるキーバインド"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "メッセージトレイを表示したり非表示にしたりするのを切り替えるキーバインドです。" msgstr "メッセージトレイを表示したり非表示にしたりするのを切り替えるキーバインドです。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "スクリーンレコーダー切り替えのキーバインド" msgstr "スクリーンレコーダー切り替えのキーバインド"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "内蔵のスクリーンレコーダーを起動したり止めたりするキーバインドです。" msgstr "内蔵のスクリーンレコーダーを起動したり止めたりするキーバインドです。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "使いたいキーボードの種類" msgstr "使いたいキーボードの種類"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "使いたいキーボードの種類です。" msgstr "使いたいキーボードの種類です。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "スクリーンキャスト録画のフレームレート" msgstr "スクリーンキャスト録画のフレームレート"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second." msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
msgstr "GNOME Shell のスクリーンキャストレコーダーで録画するスクリーンキャストの 1秒あたりのフレーム数です。" msgstr "GNOME Shell のスクリーンキャストレコーダーで録画するスクリーンキャストの 1秒あたりのフレーム数です。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "スクリーンキャストのエンコードに使用する Gstreamer パイプライン" msgstr "スクリーンキャストのエンコードに使用する Gstreamer パイプライン"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 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 "録画したものをエンコードするための Gstreamer パイプラインを設定します。構文は gst-launch のものに準拠します。パイプラインは未接続の録画用 sink pad を持つようにしてください。パイプラインは通常未接続の source pad を持ち、ファイルへ出力データを書き込みますが、出力方法については独自に定義することもできます。shout2send プラグインやその類似プラグインを経由して icecast サーバーへ出力データを送信するときは、この方法をとります。値が設定されていないか、空の場合は、既定のパイプライン 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' が使用され、VP8 コーデックを使用した WebM 形式で録画します。 '%T' はシステムの最適スレッド数の推量値を示すプレースホルダーです。" msgstr "録画したものをエンコードするための Gstreamer パイプラインを設定します。構文は gst-launch のものに準拠します。パイプラインは未接続の録画用 sink pad を持つようにしてください。パイプラインは通常未接続の source pad を持ち、ファイルへ出力データを書き込みますが、出力方法については独自に定義することもできます。shout2send プラグインやその類似プラグインを経由して icecast サーバーへ出力データを送信するときは、この方法をとります。値が設定されていないか、空の場合は、既定のパイプライン 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' が使用され、VP8 コーデックを使用した WebM 形式で録画します。 '%T' はシステムの最適スレッド数の推量値を示すプレースホルダーです。"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "ファイルに保存するスクリーンキャストのファイル拡張子" msgstr "ファイルに保存するスクリーンキャストのファイル拡張子"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
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 a different container format." 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 a different container format."
msgstr "録画したスクリーンキャストをファイルに保存する際は、日付を基にした固有の名前とこの拡張子をファイル名として使用します。異なる形式で録画するときは拡張子を変更する必要があります。" msgstr "録画したスクリーンキャストをファイルに保存する際は、日付を基にした固有の名前とこの拡張子をファイル名として使用します。異なる形式で録画するときは拡張子を変更する必要があります。"
@ -182,11 +198,11 @@ msgstr "拡張機能"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "設定する拡張機能を上部のコンボボックスから選択してください。" msgstr "設定する拡張機能を上部のコンボボックスから選択してください。"
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "セッション..." msgstr "セッション..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "サインイン" msgstr "サインイン"
@ -194,23 +210,23 @@ msgstr "サインイン"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "アカウントが見つかりませんか?" msgstr "アカウントが見つかりませんか?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "キャンセル" msgstr "キャンセル"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "サインイン" msgstr "サインイン"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "ログインウィンドウ" msgstr "ログインウィンドウ"
@ -219,8 +235,8 @@ msgstr "ログインウィンドウ"
msgid "Power" msgid "Power"
msgstr "電源" msgstr "電源"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "サスペンド" msgstr "サスペンド"
@ -228,8 +244,8 @@ msgstr "サスペンド"
msgid "Restart" msgid "Restart"
msgstr "再起動" msgstr "再起動"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "電源オフ" msgstr "電源オフ"
@ -280,7 +296,7 @@ msgstr "設定"
msgid "New Window" msgid "New Window"
msgstr "新しいウィンドウで開く" msgstr "新しいウィンドウで開く"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "お気に入りから削除" msgstr "お気に入りから削除"
@ -444,16 +460,16 @@ msgstr "今週"
msgid "Next week" msgid "Next week"
msgstr "来週" msgstr "来週"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "リムーバブルデバイス" msgstr "リムーバブルデバイス"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "%s で開く" msgstr "%s で開く"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "取り出し" msgstr "取り出し"
@ -814,7 +830,7 @@ msgstr "アカウントの編集"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "原因不明" msgstr "原因不明"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "アプリケーションの表示" msgstr "アプリケーションの表示"
@ -822,14 +838,14 @@ msgstr "アプリケーションの表示"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "日時の設定" msgstr "日時の設定"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "カレンダーを開く" msgstr "カレンダーを開く"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%Y年%B%e日 (%a)" msgstr "%Y年%B%e日 (%a)"
@ -926,11 +942,11 @@ msgstr "インストール"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "extensions.gnome.org から '%s' をダウンロードしてインストールしますか?" msgstr "extensions.gnome.org から '%s' をダウンロードしてインストールしますか?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "トレイ" msgstr "トレイ"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "キーボード" msgstr "キーボード"
@ -983,19 +999,19 @@ msgstr "ソースの表示"
msgid "Web Page" msgid "Web Page"
msgstr "ウェブページ" msgstr "ウェブページ"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "開く" msgstr "開く"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "削除" msgstr "削除"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "メッセージトレイ" msgstr "メッセージトレイ"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "システム情報" msgstr "システム情報"
@ -1059,13 +1075,13 @@ msgstr "コマンド:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%B%d日 %A" msgstr "%B%d日 %A"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d 件の新しいメッセージ" msgstr[0] "%d 件の新しいメッセージ"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1103,7 +1119,7 @@ msgstr "パスワード"
msgid "Remember Password" msgid "Remember Password"
msgstr "パスワードを保存" msgstr "パスワードを保存"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "ロック解除" msgstr "ロック解除"
@ -1221,7 +1237,7 @@ msgstr "キーボードの設定"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "マウスの設定" msgstr "マウスの設定"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "サウンドの設定" msgstr "サウンドの設定"
@ -1502,7 +1518,7 @@ msgid "Unknown"
msgstr "不明なデバイス" msgstr "不明なデバイス"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "音量" msgstr "音量"
@ -1510,7 +1526,7 @@ msgstr "音量"
msgid "Microphone" msgid "Microphone"
msgstr "マイク" msgstr "マイク"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "他のユーザーでログイン" msgstr "他のユーザーでログイン"
@ -1538,55 +1554,51 @@ msgstr "待機中"
msgid "Unavailable" msgid "Unavailable"
msgstr "オフライン" msgstr "オフライン"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "ユーザーの切り替え"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "セッションの切り替え"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "通知" msgstr "通知"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "システム設定" msgstr "システム設定"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "ユーザーの切り替え"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "ログアウト" msgstr "ログアウト"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "ロック" msgstr "ロック"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "更新のインストールと再起動" msgstr "更新のインストールと再起動"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "取り込み中に設定されます" msgstr "取り込み中に設定されます"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "チャットなどの通知メッセージが表示されなくなります。オンライン状態が変更され、あなたがメッセージに目を通せない状態にあることを、他の人が知ることができます。" msgstr "チャットなどの通知メッセージが表示されなくなります。オンライン状態が変更され、あなたがメッセージに目を通せない状態にあることを、他の人が知ることができます。"
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "ウィンドウ" msgstr "ウィンドウ"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "アプリケーション" msgstr "アプリケーション"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "検索" msgstr "検索"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1595,12 +1607,12 @@ msgstr ""
"すまない、今日は賢言がないのだ:\n" "すまない、今日は賢言がないのだ:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "預言者 %s 曰く" msgstr "預言者 %s 曰く"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "あなたの好きなイースターエッグ" msgstr "あなたの好きなイースターエッグ"
@ -1633,19 +1645,19 @@ msgstr[0] "入力数: %u"
msgid "System Sounds" msgid "System Sounds"
msgstr "システムのサウンド" msgstr "システムのサウンド"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "バージョンを表示" msgstr "バージョンを表示"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "ログイン画面で GDM が使用するモード" msgstr "ログイン画面で GDM が使用するモード"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "指定したモードを使用する (例: ログイン画面用の \"gdm\")" msgstr "指定したモードを使用する (例: ログイン画面用の \"gdm\")"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "使用可能なモードを一覧表示する" msgstr "使用可能なモードを一覧表示する"
@ -1674,6 +1686,9 @@ msgstr "既定"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "認証ダイアログはユーザーに拒否されました" msgstr "認証ダイアログはユーザーに拒否されました"
#~ msgid "Switch Session"
#~ msgstr "セッションの切り替え"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "OpenSearch プロバイダーを無効にする" #~ msgstr "OpenSearch プロバイダーを無効にする"

244
po/pl.po
View File

@ -11,8 +11,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-09-25 15:12+0200\n" "POT-Creation-Date: 2012-10-31 19:12+0100\n"
"PO-Revision-Date: 2012-09-25 15:13+0200\n" "PO-Revision-Date: 2012-10-31 19:13+0100\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n" "Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n" "Language: pl\n"
@ -142,62 +142,74 @@ msgstr ""
"użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus." "użytkownika. Wartość pochodzi ze spisu GsmPresenceStatus."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.in.h:13
msgid "Always show the 'Log out' menuitem in the user menu."
msgstr "Wyświetlanie elementu menu \"Wyloguj się\" w menu użytkownika."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
"user, single-session situations."
msgstr ""
"Ten klucz zastępuje automatyczne ukrywanie elementu menu \"Wyloguj się\" w "
"sytuacji, gdy istnieje tylko jeden użytkownik i jedna sesja."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "Wyświetlanie dnia tygodnia w kalendarzu" msgstr "Wyświetlanie dnia tygodnia w kalendarzu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr ""
"Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w " "Jeśli jest ustawione na \"true\", to wyświetla w kalendarzu dzień tygodnia w "
"formacie ISO." "formacie ISO."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Skrót do otwarcia menu programu" msgstr "Skrót do otwarcia menu programu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Skrót do otwarcia menu programu." msgstr "Skrót do otwarcia menu programu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania" msgstr "Skrót do przełączenia widoczności obszaru powiadamiania"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Skrót do przełączenia widoczności obszaru powiadamiania." msgstr "Skrót do przełączenia widoczności obszaru powiadamiania."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Skrót do przełączenia nagrywania ekranu" msgstr "Skrót do przełączenia nagrywania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu." msgstr "Skrót do uruchomienia/zatrzymania wbudowanego nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Której klawiatury używać" msgstr "Której klawiatury używać"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Typ używanej klawiatury." msgstr "Typ używanej klawiatury."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Liczba klatek na sekundę do nagrywania ekranu." msgstr "Liczba klatek na sekundę do nagrywania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu." msgstr "Liczba klatek na sekundę wynikowego nagrania ekranu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu" msgstr "Potok biblioteki GStreamer używany do zakodowania nagrania ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -222,11 +234,11 @@ msgstr ""
"i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na " "i nagrywa do formatu WebM używając kodeka VP8. %T jest zamieniane na "
"odgadniętą optymalną liczbę wątków dla komputera." "odgadniętą optymalną liczbę wątków dla komputera."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu" msgstr "Rozszerzenie pliku używane do przechowywania nagrań ekranu"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -252,11 +264,11 @@ msgstr ""
"Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola " "Proszę wybrać rozszerzenie do skonfigurowania używając powyższego pola "
"wyboru." "wyboru."
#: ../js/gdm/loginDialog.js:528 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesja..." msgstr "Sesja..."
#: ../js/gdm/loginDialog.js:676 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Proszę się zalogować" msgstr "Proszę się zalogować"
@ -264,23 +276,23 @@ msgstr "Proszę się zalogować"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:743 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Inny użytkownik?" msgstr "Inny użytkownik?"
#: ../js/gdm/loginDialog.js:896 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Anuluj" msgstr "Anuluj"
#: ../js/gdm/loginDialog.js:901 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Zaloguj" msgstr "Zaloguj"
#: ../js/gdm/loginDialog.js:1240 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Okno logowania" msgstr "Okno logowania"
@ -289,8 +301,8 @@ msgstr "Okno logowania"
msgid "Power" msgid "Power"
msgstr "Zasilanie" msgstr "Zasilanie"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:779
msgid "Suspend" msgid "Suspend"
msgstr "Uśpij" msgstr "Uśpij"
@ -298,8 +310,8 @@ msgstr "Uśpij"
msgid "Restart" msgid "Restart"
msgstr "Uruchom ponownie" msgstr "Uruchom ponownie"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:778
msgid "Power Off" msgid "Power Off"
msgstr "Wyłącz komputer" msgstr "Wyłącz komputer"
@ -350,7 +362,7 @@ msgstr "Ustawienia"
msgid "New Window" msgid "New Window"
msgstr "Nowe okno" msgstr "Nowe okno"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Usuń z ulubionych" msgstr "Usuń z ulubionych"
@ -514,16 +526,16 @@ msgstr "Ten tydzień"
msgid "Next week" msgid "Next week"
msgstr "Następny tydzień" msgstr "Następny tydzień"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Urządzenia wymienne" msgstr "Urządzenia wymienne"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otwórz za pomocą %s" msgstr "Otwórz za pomocą %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Wysuń" msgstr "Wysuń"
@ -680,35 +692,35 @@ msgstr "Wycisz"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:950
#, no-c-format #, no-c-format
msgid "Sent at <b>%X</b> on <b>%A</b>" msgid "Sent at <b>%X</b> on <b>%A</b>"
msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>" msgstr "Wysłano w dniu <b>%e %b</b> o godzinie <b>%H:%M</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25", #. Translators: this is a time format in the style of "Wednesday, May 25",
#. shown when you get a chat message in the same year. #. shown when you get a chat message in the same year.
#: ../js/ui/components/telepathyClient.js:954 #: ../js/ui/components/telepathyClient.js:956
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>" msgid "Sent on <b>%A</b>, <b>%B %d</b>"
msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>" msgstr "Wysłano w dniu <b>%d %B</b>, <b>%A</b>"
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012", #. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
#. shown when you get a chat message in a different year. #. shown when you get a chat message in a different year.
#: ../js/ui/components/telepathyClient.js:959 #: ../js/ui/components/telepathyClient.js:961
#, no-c-format #, no-c-format
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y" msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>" msgstr "Wysłano w dniu <b>%d %B</b> %Y, <b>%A</b>"
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. #. IM name.
#: ../js/ui/components/telepathyClient.js:988 #: ../js/ui/components/telepathyClient.js:990
#, c-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "Użytkownik %s jest teraz znany jako %s" msgstr "Użytkownik %s jest teraz znany jako %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1090
#, c-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Zaproszenie do pokoju %s" msgstr "Zaproszenie do pokoju %s"
@ -716,42 +728,42 @@ msgstr "Zaproszenie do pokoju %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. #. * for example.
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1098
#, c-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s" msgstr "Użytkownik %s zaprasza do dołączenia do pokoju %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1177 #: ../js/ui/components/telepathyClient.js:1179
#: ../js/ui/components/telepathyClient.js:1240 #: ../js/ui/components/telepathyClient.js:1242
msgid "Decline" msgid "Decline"
msgstr "Odmów" msgstr "Odmów"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1101
#: ../js/ui/components/telepathyClient.js:1178 #: ../js/ui/components/telepathyClient.js:1180
#: ../js/ui/components/telepathyClient.js:1241 #: ../js/ui/components/telepathyClient.js:1243
msgid "Accept" msgid "Accept"
msgstr "Zaakceptuj" msgstr "Zaakceptuj"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1131
#, c-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Wideorozmowa z użytkownikiem %s" msgstr "Wideorozmowa z użytkownikiem %s"
#. translators: argument is a contact name like Alice for example. #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1134
#, c-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Rozmowa z użytkownikiem %s" msgstr "Rozmowa z użytkownikiem %s"
#: ../js/ui/components/telepathyClient.js:1137 #: ../js/ui/components/telepathyClient.js:1139
#: ../js/ui/status/bluetooth.js:346 #: ../js/ui/status/bluetooth.js:346
msgid "Reject" msgid "Reject"
msgstr "Odrzuć" msgstr "Odrzuć"
#. translators: this is a button label (verb), not a noun #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1141
msgid "Answer" msgid "Answer"
msgstr "Odbierz" msgstr "Odbierz"
@ -760,111 +772,111 @@ msgstr "Odbierz"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. #.
#: ../js/ui/components/telepathyClient.js:1171 #: ../js/ui/components/telepathyClient.js:1173
#, c-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "Użytkownik %s przysyła plik %s" msgstr "Użytkownik %s przysyła plik %s"
#. To translators: The parameter is the contact's alias #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1206 #: ../js/ui/components/telepathyClient.js:1208
#, c-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu" msgstr "Użytkownik %s prosi o uprawnienie do wyświetlania stanu"
#: ../js/ui/components/telepathyClient.js:1298 #: ../js/ui/components/telepathyClient.js:1300
msgid "Network error" msgid "Network error"
msgstr "Błąd sieci" msgstr "Błąd sieci"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1302
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Uwierzytelnienie się nie powiodło" msgstr "Uwierzytelnienie się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1304
msgid "Encryption error" msgid "Encryption error"
msgstr "Błąd szyfrowania" msgstr "Błąd szyfrowania"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1306
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Nie podano certyfikatu" msgstr "Nie podano certyfikatu"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1308
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Certyfikat jest niezaufany" msgstr "Certyfikat jest niezaufany"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1310
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certyfikat wygasł" msgstr "Certyfikat wygasł"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1312
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certyfikat nie został aktywowany" msgstr "Certyfikat nie został aktywowany"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1314
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Nazwa komputera certyfikatu się nie zgadza" msgstr "Nazwa komputera certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1316
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Odcisk palca certyfikatu się nie zgadza" msgstr "Odcisk palca certyfikatu się nie zgadza"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1318
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certyfikat został samodzielnie podpisany" msgstr "Certyfikat został samodzielnie podpisany"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1320
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Stan jest ustawiony na offline" msgstr "Stan jest ustawiony na offline"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1322
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Szyfrowanie jest niedostępne" msgstr "Szyfrowanie jest niedostępne"
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1324
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Certyfikat jest nieprawidłowy" msgstr "Certyfikat jest nieprawidłowy"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1326
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Odrzucono połączenie" msgstr "Odrzucono połączenie"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1328
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Nie można nawiązać połączenia" msgstr "Nie można nawiązać połączenia"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1330
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Utracono połączenie" msgstr "Utracono połączenie"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1332
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "To konto jest już połączone z serwerem" msgstr "To konto jest już połączone z serwerem"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1334
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "" msgstr ""
"Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu" "Połączenie zostało zastąpione nowym z wykorzystaniem tego samego zasobu"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1336
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Konto już istnieje na serwerze" msgstr "Konto już istnieje na serwerze"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1338
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie" msgstr "Serwer jest obecnie zbyt zajęty, aby obsłużyć połączenie"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1340
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Certyfikat został unieważniony" msgstr "Certyfikat został unieważniony"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1342
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest " "Certyfikat używa niezabezpieczonego algorytmu szyfrowania lub jest "
"kryptograficznie słaby" "kryptograficznie słaby"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1344
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -872,30 +884,30 @@ msgstr ""
"Długość certyfikatu serwera lub głębokość jego łańcucha przekracza " "Długość certyfikatu serwera lub głębokość jego łańcucha przekracza "
"ograniczenia nałożone przez bibliotekę kryptograficzną" "ograniczenia nałożone przez bibliotekę kryptograficzną"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1346
msgid "Internal error" msgid "Internal error"
msgstr "Błąd wewnętrzny" msgstr "Błąd wewnętrzny"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1356
#, c-format #, c-format
msgid "Connection to %s failed" msgid "Connection to %s failed"
msgstr "Połączenie z kontem %s się nie powiodło" msgstr "Połączenie z kontem %s się nie powiodło"
#: ../js/ui/components/telepathyClient.js:1363 #: ../js/ui/components/telepathyClient.js:1365
msgid "Reconnect" msgid "Reconnect"
msgstr "Połącz ponownie" msgstr "Połącz ponownie"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1366
msgid "Edit account" msgid "Edit account"
msgstr "Modyfikuj konto" msgstr "Modyfikuj konto"
#: ../js/ui/components/telepathyClient.js:1409 #: ../js/ui/components/telepathyClient.js:1411
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Nieznana przyczyna" msgstr "Nieznana przyczyna"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Wyświetl programy" msgstr "Wyświetl programy"
@ -903,14 +915,14 @@ msgstr "Wyświetl programy"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ustawienia daty i czasu" msgstr "Ustawienia daty i czasu"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otwórz kalendarz" msgstr "Otwórz kalendarz"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y" msgstr "%A, %e %B %Y"
@ -1075,23 +1087,23 @@ msgstr "Wyświetl źródło"
msgid "Web Page" msgid "Web Page"
msgstr "Strona WWW" msgstr "Strona WWW"
#: ../js/ui/messageTray.js:1081 #: ../js/ui/messageTray.js:1084
msgid "Open" msgid "Open"
msgstr "Otwórz" msgstr "Otwórz"
#: ../js/ui/messageTray.js:1088 #: ../js/ui/messageTray.js:1091
msgid "Remove" msgid "Remove"
msgstr "Usuń" msgstr "Usuń"
#: ../js/ui/messageTray.js:2088 #: ../js/ui/messageTray.js:1543
msgid "Message Tray" msgid "Message Tray"
msgstr "Obszar powiadamiania" msgstr "Obszar powiadamiania"
#: ../js/ui/messageTray.js:2551 #: ../js/ui/messageTray.js:2549
msgid "System Information" msgid "System Information"
msgstr "Informacje systemowe" msgstr "Informacje systemowe"
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:373 #: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Nieznany" msgstr "Nieznany"
@ -1147,7 +1159,7 @@ msgstr "Proszę wprowadzić polecenie:"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format #. long format
#: ../js/ui/screenShield.js:79 #: ../js/ui/screenShield.js:80
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e %B" msgstr "%A, %e %B"
@ -1199,7 +1211,7 @@ msgstr "Hasło"
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamiętanie hasła" msgstr "Zapamiętanie hasła"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Odblokuj" msgstr "Odblokuj"
@ -1614,67 +1626,63 @@ msgstr "Głośność"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Zaloguj jako inny użytkownik" msgstr "Zaloguj jako inny użytkownik"
#: ../js/ui/userMenu.js:180 #: ../js/ui/userMenu.js:181
msgid "Available" msgid "Available"
msgstr "Dostępny" msgstr "Dostępny"
#: ../js/ui/userMenu.js:183 #: ../js/ui/userMenu.js:184
msgid "Busy" msgid "Busy"
msgstr "Zajęty" msgstr "Zajęty"
#: ../js/ui/userMenu.js:186 #: ../js/ui/userMenu.js:187
msgid "Invisible" msgid "Invisible"
msgstr "Niewidoczny" msgstr "Niewidoczny"
#: ../js/ui/userMenu.js:189 #: ../js/ui/userMenu.js:190
msgid "Away" msgid "Away"
msgstr "Nieobecny" msgstr "Nieobecny"
#: ../js/ui/userMenu.js:192 #: ../js/ui/userMenu.js:193
msgid "Idle" msgid "Idle"
msgstr "Bezczynny" msgstr "Bezczynny"
#: ../js/ui/userMenu.js:195 #: ../js/ui/userMenu.js:196
msgid "Unavailable" msgid "Unavailable"
msgstr "Niedostępny" msgstr "Niedostępny"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:744
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Przełącz sesję"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Powiadomienia" msgstr "Powiadomienia"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:752
msgid "System Settings" msgid "System Settings"
msgstr "Ustawienia systemu" msgstr "Ustawienia systemu"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:760
msgid "Switch User"
msgstr "Przełącz użytkownika"
#: ../js/ui/userMenu.js:765
msgid "Log Out" msgid "Log Out"
msgstr "Wyloguj się" msgstr "Wyloguj się"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:770
msgid "Lock" msgid "Lock"
msgstr "Zablokuj ekran" msgstr "Zablokuj ekran"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:785
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Zaktualizuj i uruchom ponownie" msgstr "Zaktualizuj i uruchom ponownie"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:803
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\"" msgstr "Stan komunikatora zostanie ustawiony na \"zajęty\""
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:804
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1696,7 +1704,7 @@ msgstr "Programy"
msgid "Search" msgid "Search"
msgstr "Wyszukiwanie" msgstr "Wyszukiwanie"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1705,12 +1713,12 @@ msgstr ""
"Nic mądrego na dzisiaj:\n" "Nic mądrego na dzisiaj:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Wyrocznia %s przemawia" msgstr "Wyrocznia %s przemawia"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Twój ulubiony żart" msgstr "Twój ulubiony żart"
@ -1747,23 +1755,23 @@ msgstr[2] "%u wejść"
msgid "System Sounds" msgid "System Sounds"
msgstr "Dźwięki systemowe" msgstr "Dźwięki systemowe"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Wyświetla wersję" msgstr "Wyświetla wersję"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Tryb używany przez GDM dla ekranu logowania" msgstr "Tryb używany przez GDM dla ekranu logowania"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania" msgstr "Używa podanego trybu, np. \"gdm\" dla ekranu logowania"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Wyświetla listę możliwych trybów" msgstr "Wyświetla listę możliwych trybów"
#: ../src/shell-app.c:621 #: ../src/shell-app.c:622
#, c-format #, c-format
msgid "Failed to launch '%s'" msgid "Failed to launch '%s'"
msgstr "Uruchomienie \"%s\" się nie powiodło" msgstr "Uruchomienie \"%s\" się nie powiodło"

2149
po/sk.po

File diff suppressed because it is too large Load Diff

150
po/sl.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 06:44+0000\n" "POT-Creation-Date: 2012-10-16 00:16+0000\n"
"PO-Revision-Date: 2012-09-25 08:56+0100\n" "PO-Revision-Date: 2012-10-16 07:53+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: Slovenian\n" "Language: Slovenian\n"
@ -37,6 +37,14 @@ msgstr "Sistem"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Pokaži sporočilno vrstico" msgstr "Pokaži sporočilno vrstico"
#: ../data/50-gnome-shell-system.xml.in.h:3
msgid "Show all applications"
msgstr "Pokaži vse programe"
#: ../data/50-gnome-shell-system.xml.in.h:4
msgid "Open the application menu"
msgstr "Odpri meni programov"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Gnome lupina" msgstr "Gnome lupina"
@ -119,51 +127,59 @@ msgid "Keybinding to open the application menu."
msgstr "Tipkovna bližnjica, ki odpre meni programov." msgstr "Tipkovna bližnjica, ki odpre meni programov."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
msgid "Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Tipkovna bližnjica, ki odpre pogled \"Pokaži programe\" v pregledu dejavnosti."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja" msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja." msgstr "Tipkovna bližnjica za preklop vidnosti vrstice sporočanja."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Tipkovna bližnjica za preklop snemalnika zaslona" msgstr "Tipkovna bližnjica za preklop snemalnika zaslona"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona" msgstr "Tipkovna bližnjica za začetek in ustavitev vgrajenega snemalnika zaslona"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Katera tipkovnica naj bo uporabljena?" msgstr "Katera tipkovnica naj bo uporabljena?"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Vrsta tipkovnice za uporabo." msgstr "Vrsta tipkovnice za uporabo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka." msgstr "Hitrost sličic uporabljena za snemanje zaslonskega posnetka."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second." msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
msgstr "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na sekundo." msgstr "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na sekundo."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka." msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system." msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 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 "Nastavi cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki se uporablja za program 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 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' in omogoča snemanje v zapis WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje najustreznejšega števila niti na sistemu." msgstr "Nastavi cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki se uporablja za program 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 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' in omogoča snemanje v zapis WEBM z uporabo kodeka VP8. Vrednost %T se uporablja kot ročnik za ugibanje najustreznejšega števila niti na sistemu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov" msgstr "Pripona datoteke uporabljene za shranjevanje zaslonskih posnetkov"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
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 a different container format." 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 a different container format."
msgstr "Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum in določena pripona. Pripona mora ustrezati zapisu zabojnika." msgstr "Ime datoteke zaslonskega posnetka bo enoznačno ime, kateremu bo dodan datum in določena pripona. Pripona mora ustrezati zapisu zabojnika."
@ -180,11 +196,11 @@ msgstr "Pripona"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj." msgstr "Razširitev za nastavljanje je mogoče izbrati iz spustnega seznama zgoraj."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Seja ..." msgstr "Seja ..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prijava" msgstr "Prijava"
@ -192,27 +208,27 @@ msgstr "Prijava"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Ali je ni na seznamu?" msgstr "Ali je ni na seznamu?"
#: ../js/gdm/loginDialog.js:895 #: ../js/gdm/loginDialog.js:889
#: ../js/ui/components/networkAgent.js:137 #: ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 #: ../js/ui/components/polkitAgent.js:162
#: ../js/ui/endSessionDialog.js:373 #: ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 #: ../js/ui/extensionDownloader.js:195
#: ../js/ui/shellMountOperation.js:396 #: ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 #: ../js/ui/status/bluetooth.js:427
#: ../js/ui/unlockDialog.js:166 #: ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Prekliči" msgstr "Prekliči"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prijava" msgstr "Prijava"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Prijavno okno" msgstr "Prijavno okno"
@ -222,9 +238,9 @@ msgid "Power"
msgstr "Napajanje" msgstr "Napajanje"
#: ../js/gdm/powerMenu.js:89 #: ../js/gdm/powerMenu.js:89
#: ../js/ui/userMenu.js:663 #: ../js/ui/userMenu.js:660
#: ../js/ui/userMenu.js:667 #: ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Zaustavi" msgstr "Zaustavi"
@ -233,9 +249,9 @@ msgid "Restart"
msgstr "Zaženi znova" msgstr "Zaženi znova"
#: ../js/gdm/powerMenu.js:99 #: ../js/gdm/powerMenu.js:99
#: ../js/ui/userMenu.js:665 #: ../js/ui/userMenu.js:662
#: ../js/ui/userMenu.js:667 #: ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Izklop" msgstr "Izklop"
@ -287,7 +303,7 @@ msgid "New Window"
msgstr "Novo okno" msgstr "Novo okno"
#: ../js/ui/appDisplay.js:678 #: ../js/ui/appDisplay.js:678
#: ../js/ui/dash.js:271 #: ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Odstrani iz priljubljenih" msgstr "Odstrani iz priljubljenih"
@ -451,16 +467,16 @@ msgstr "Ta teden"
msgid "Next week" msgid "Next week"
msgstr "Naslednji teden" msgstr "Naslednji teden"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Odstranljive naprave" msgstr "Odstranljive naprave"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Odpri s programom %s" msgstr "Odpri s programom %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Izvrzi" msgstr "Izvrzi"
@ -821,8 +837,8 @@ msgstr "Uredi račun"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Neznan vzrok" msgstr "Neznan vzrok"
#: ../js/ui/dash.js:245 #: ../js/ui/dash.js:253
#: ../js/ui/dash.js:273 #: ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Pokaži programe" msgstr "Pokaži programe"
@ -830,14 +846,14 @@ msgstr "Pokaži programe"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Nastavitve časa in datuma" msgstr "Nastavitve časa in datuma"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Odpri koledar" msgstr "Odpri koledar"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a, %e. %b., %R" msgstr "%a, %e. %b., %R"
@ -1015,11 +1031,11 @@ msgstr "Odpri"
msgid "Remove" msgid "Remove"
msgstr "Odstrani" msgstr "Odstrani"
#: ../js/ui/messageTray.js:2088 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Vrstica sporočanja" msgstr "Vrstica sporočanja"
#: ../js/ui/messageTray.js:2551 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Podrobnosti sistema" msgstr "Podrobnosti sistema"
@ -1084,7 +1100,7 @@ msgstr "Vnos ukaza:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %m." msgstr "%A, %d. %m."
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1093,7 +1109,7 @@ msgstr[1] "%d novo sporočilo"
msgstr[2] "%d novi sporočili" msgstr[2] "%d novi sporočili"
msgstr[3] "%d nova sporočila" msgstr[3] "%d nova sporočila"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1135,7 +1151,7 @@ msgid "Remember Password"
msgstr "Zapomni si geslo" msgstr "Zapomni si geslo"
#: ../js/ui/shellMountOperation.js:400 #: ../js/ui/shellMountOperation.js:400
#: ../js/ui/unlockDialog.js:169 #: ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Odkleni" msgstr "Odkleni"
@ -1261,7 +1277,7 @@ msgid "Mouse Settings"
msgstr "Nastavitve miške" msgstr "Nastavitve miške"
#: ../js/ui/status/bluetooth.js:269 #: ../js/ui/status/bluetooth.js:269
#: ../js/ui/status/volume.js:236 #: ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Nastavitve zvoka" msgstr "Nastavitve zvoka"
@ -1562,7 +1578,7 @@ msgstr "Neznano"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 #: ../js/ui/status/volume.js:47
#: ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Glasnost" msgstr "Glasnost"
@ -1570,7 +1586,7 @@ msgstr "Glasnost"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Prijava kot drug uporabnik" msgstr "Prijava kot drug uporabnik"
@ -1598,56 +1614,51 @@ msgstr "Nedejavno"
msgid "Unavailable" msgid "Unavailable"
msgstr "Nedostopno" msgstr "Nedostopno"
#: ../js/ui/userMenu.js:618 #: ../js/ui/userMenu.js:740
#: ../js/ui/userMenu.js:759
msgid "Switch User"
msgstr "Preklopi uporabnika"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Preklopi sejo"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Obvestila" msgstr "Obvestila"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Sistemske nastavitve" msgstr "Sistemske nastavitve"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Preklopi uporabnika"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Odjava" msgstr "Odjava"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Zakleni" msgstr "Zakleni"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Namesti posodobitve in ponovno zaženi" msgstr "Namesti posodobitve in ponovno zaženi"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno" msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages." msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
msgstr "Obveščanje je zdaj onemogočeno, vključno s sporočili klepeta. Vaše stanje povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil morda ne boste opazili." msgstr "Obveščanje je zdaj onemogočeno, vključno s sporočili klepeta. Vaše stanje povezanosti se je prilagodilo, da bodo drugi vedeli, da njihovih sporočil morda ne boste opazili."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Okna" msgstr "Okna"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Programi" msgstr "Programi"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Poišči" msgstr "Poišči"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1656,12 +1667,12 @@ msgstr ""
"Za danes ni modrosti:\n" "Za danes ni modrosti:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Riba %s pravi" msgstr "Riba %s pravi"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Vaše priljubljeno velikonočno jajce" msgstr "Vaše priljubljeno velikonočno jajce"
@ -1700,19 +1711,19 @@ msgstr[3] "%u dovodi naprave"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sistemski zvoki" msgstr "Sistemski zvoki"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Izpiši različico" msgstr "Izpiši različico"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Način uporabljen v GDM za prijavni naslov" msgstr "Način uporabljen v GDM za prijavni naslov"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Uporabi poseben način, npr.: \"gdm\" za prijavni zaslon" msgstr "Uporabi poseben način, npr.: \"gdm\" za prijavni zaslon"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Seznam mogočih načinov" msgstr "Seznam mogočih načinov"
@ -1741,6 +1752,9 @@ msgstr "Privzeto"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Uporabnik je zavrnil pogovorno okno overitve" msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "Switch Session"
#~ msgstr "Preklopi sejo"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "ponudniki OpenSearch so bili onemogočeni" #~ msgstr "ponudniki OpenSearch so bili onemogočeni"

161
po/sr.po
View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-25 00:06+0000\n" "POT-Creation-Date: 2012-10-15 23:38+0000\n"
"PO-Revision-Date: 2012-09-27 05:24+0200\n" "PO-Revision-Date: 2012-10-16 20:23+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n" "Language: sr\n"
@ -36,6 +36,16 @@ msgstr "Систем"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Прикажите фиоку порука" msgstr "Прикажите фиоку порука"
#: ../data/50-gnome-shell-system.xml.in.h:3
#| msgid "Show Applications"
msgid "Show all applications"
msgstr "Прикажи све програме"
#: ../data/50-gnome-shell-system.xml.in.h:4
#| msgid "Keybinding to open the application menu"
msgid "Open the application menu"
msgstr "Отворите изборник програма"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Гномова шкољка" msgstr "Гномова шкољка"
@ -143,41 +153,52 @@ msgstr "Ако је изабрано, приказује ИСО дан у нед
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Свеза тастера за отварање изборника програма" msgstr "Пречица за отварање изборника програма"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Свеза тастера за отварање изборника програма." msgstr "Пречица за отварање изборника програма."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Пречица за отварање прегледа „Прикажи програме“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#| msgid "Keybinding to open the application menu."
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Пречица за отварање прегледа „Прикажи програме“ у прегледу активности."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Пречица за окидање видљивости фиоке порука" msgstr "Пречица за окидање видљивости фиоке порука"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Пречица за окидање видљивости фиоке порука." msgstr "Пречица за окидање видљивости фиоке порука."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Пречица за окидање читача екрана" msgstr "Пречица за окидање читача екрана"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Пречица за покретање/заустављање уграђеног снимача екрана." msgstr "Пречица за покретање/заустављање уграђеног снимача екрана."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Која ће тастатура бити коришћена" msgstr "Која ће тастатура бити коришћена"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Врста тастатуре за употребу." msgstr "Врста тастатуре за употребу."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Учестаност кадрова за видео снимак екрана." msgstr "Учестаност кадрова за видео снимак екрана."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -185,11 +206,11 @@ msgstr ""
"Учестаност кадрова снимка снимљених помоћу Гномове шкољке у кадровима по " "Учестаност кадрова снимка снимљених помоћу Гномове шкољке у кадровима по "
"секунди." "секунди."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Процесни ланац Гстримера коришћен за кодирање видео снимка екрана" msgstr "Процесни ланац Гстримера коришћен за кодирање видео снимка екрана"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
@ -216,11 +237,11 @@ msgstr ""
"ВП8 кодек. „%T“ се користи као носилац за откривање при оптималном прорачуну " "ВП8 кодек. „%T“ се користи као носилац за откривање при оптималном прорачуну "
"нити на систему." "нити на систему."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Проширење датотеке за чување видео снимака екрана" msgstr "Проширење датотеке за чување видео снимака екрана"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -243,11 +264,11 @@ msgstr "Проширење"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Изаберите проширење за подешавање користећи прозорче за избор." msgstr "Изаберите проширење за подешавање користећи прозорче за избор."
#: ../js/gdm/loginDialog.js:527 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Сесија..." msgstr "Сесија..."
#: ../js/gdm/loginDialog.js:675 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Пријавите се" msgstr "Пријавите се"
@ -255,34 +276,33 @@ msgstr "Пријавите се"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:742 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Није на списку?" msgstr "Није на списку?"
#: ../js/gdm/loginDialog.js:895 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Откажи" msgstr "Откажи"
#: ../js/gdm/loginDialog.js:900 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Пријави ме" msgstr "Пријави ме"
#: ../js/gdm/loginDialog.js:1239 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Прозор за пријављивање" msgstr "Прозор за пријављивање"
#. Translators: accessible name of the power menu in the login screen #. Translators: accessible name of the power menu in the login screen
#: ../js/gdm/powerMenu.js:35 #: ../js/gdm/powerMenu.js:35
#| msgid "Power Off"
msgid "Power" msgid "Power"
msgstr "Угаси" msgstr "Угаси"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:663 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:778 #: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Обустави" msgstr "Обустави"
@ -290,8 +310,8 @@ msgstr "Обустави"
msgid "Restart" msgid "Restart"
msgstr "Поново покрени" msgstr "Поново покрени"
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:665 ../js/ui/userMenu.js:667 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:777 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Угаси" msgstr "Угаси"
@ -342,7 +362,7 @@ msgstr "ПОДЕШАВАЊА"
msgid "New Window" msgid "New Window"
msgstr "Нови прозор" msgstr "Нови прозор"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Уклони из омиљених" msgstr "Уклони из омиљених"
@ -506,16 +526,16 @@ msgstr "Ове недеље"
msgid "Next week" msgid "Next week"
msgstr "Следеће недеље" msgstr "Следеће недеље"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Уклоњиви уређаји" msgstr "Уклоњиви уређаји"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Отвори програмом %s" msgstr "Отвори програмом %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Избаци" msgstr "Избаци"
@ -884,7 +904,7 @@ msgstr "Уреди налог"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Непознат разлог" msgstr "Непознат разлог"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Прикажи програме" msgstr "Прикажи програме"
@ -892,14 +912,14 @@ msgstr "Прикажи програме"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Подешавања датума и времена" msgstr "Подешавања датума и времена"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Отвори календар" msgstr "Отвори календар"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %b, %R" msgstr "%A, %e. %b, %R"
@ -1012,11 +1032,11 @@ msgstr "Инсталирај"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Да преузмем и да инсталирам „%s“ са extensions.gnome.org?" msgstr "Да преузмем и да инсталирам „%s“ са extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "фиока" msgstr "фиока"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:195 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Тастатура" msgstr "Тастатура"
@ -1069,19 +1089,19 @@ msgstr "Прикажи код"
msgid "Web Page" msgid "Web Page"
msgstr "Веб страница" msgstr "Веб страница"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Отвори" msgstr "Отвори"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Уклони" msgstr "Уклони"
#: ../js/ui/messageTray.js:2055 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Фиока порука" msgstr "Фиока порука"
#: ../js/ui/messageTray.js:2511 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Подаци о систему" msgstr "Подаци о систему"
@ -1145,7 +1165,7 @@ msgstr "Унесите наредбу:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1154,7 +1174,7 @@ msgstr[1] "%d нове поруке"
msgstr[2] "%d нових порука" msgstr[2] "%d нових порука"
msgstr[3] "Једна нова порука" msgstr[3] "Једна нова порука"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1195,7 +1215,7 @@ msgstr "Лозинка"
msgid "Remember Password" msgid "Remember Password"
msgstr "Запамти лозинку" msgstr "Запамти лозинку"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Откључај" msgstr "Откључај"
@ -1313,7 +1333,7 @@ msgstr "Подешавања тастатуре"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Подешавања миша" msgstr "Подешавања миша"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Подешавања звука" msgstr "Подешавања звука"
@ -1606,7 +1626,7 @@ msgid "Unknown"
msgstr "Непознат" msgstr "Непознат"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Јачина звука" msgstr "Јачина звука"
@ -1614,7 +1634,7 @@ msgstr "Јачина звука"
msgid "Microphone" msgid "Microphone"
msgstr "Микрофон" msgstr "Микрофон"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Пријавите се као други корсник" msgstr "Пријавите се као други корсник"
@ -1642,39 +1662,35 @@ msgstr "Мирује"
msgid "Unavailable" msgid "Unavailable"
msgstr "Недоступан" msgstr "Недоступан"
#: ../js/ui/userMenu.js:618 ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Промени корисника"
#: ../js/ui/userMenu.js:619
msgid "Switch Session"
msgstr "Промени сесију"
#: ../js/ui/userMenu.js:743
msgid "Notifications" msgid "Notifications"
msgstr "Обавештења" msgstr "Обавештења"
#: ../js/ui/userMenu.js:751 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Подешавања система" msgstr "Подешавања система"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Промени корисника"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Одјави ме" msgstr "Одјави ме"
#: ../js/ui/userMenu.js:769 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Закључај" msgstr "Закључај"
#: ../js/ui/userMenu.js:784 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Инсталирај ажурирања и поново покрени" msgstr "Инсталирај ажурирања и поново покрени"
#: ../js/ui/userMenu.js:802 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Ваше стање ћаскања ће бити постављено на заузето" msgstr "Ваше стање ћаскања ће бити постављено на заузето"
#: ../js/ui/userMenu.js:803 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1683,19 +1699,19 @@ msgstr ""
"мрежи је подешено тако да ће остали знати да ви не можете видети њихове " "мрежи је подешено тако да ће остали знати да ви не можете видети њихове "
"поруке." "поруке."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Прозори" msgstr "Прозори"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Програми" msgstr "Програми"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Тражи" msgstr "Тражи"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1704,12 +1720,12 @@ msgstr ""
"Извините, данас за вас нема мудрости:\n" "Извините, данас за вас нема мудрости:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Пророк је рекао %s" msgstr "Пророк је рекао %s"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Ваше омиљено ускршње јаје" msgstr "Ваше омиљено ускршње јаје"
@ -1748,19 +1764,19 @@ msgstr[3] "Један улаз"
msgid "System Sounds" msgid "System Sounds"
msgstr "Системски звуци" msgstr "Системски звуци"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Исписује издање" msgstr "Исписује издање"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Који режим користи ГДМ за екран пријављивања" msgstr "Који режим користи ГДМ за екран пријављивања"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Користи нарочит режим, нпр. „gdm“ за екран пријављивања" msgstr "Користи нарочит режим, нпр. „gdm“ за екран пријављивања"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Исписује могуће режиме" msgstr "Исписује могуће режиме"
@ -1789,6 +1805,9 @@ msgstr "Основно"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Корисник је одбацио прозорче за потврђивање идентитета" msgstr "Корисник је одбацио прозорче за потврђивање идентитета"
#~ msgid "Switch Session"
#~ msgstr "Промени сесију"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "искључени „OpenSearch“ достављачи" #~ msgstr "искључени „OpenSearch“ достављачи"

View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2012-09-19 11:02+0000\n" "POT-Creation-Date: 2012-10-15 23:38+0000\n"
"PO-Revision-Date: 2012-09-20 20:20+0200\n" "PO-Revision-Date: 2012-10-16 20:23+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n" "Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <gnom@prevod.org>\n" "Language-Team: Serbian <gnom@prevod.org>\n"
"Language: sr\n" "Language: sr\n"
@ -29,15 +29,23 @@ msgid "Record a screencast"
msgstr "Snimite radni tok ekrana" msgstr "Snimite radni tok ekrana"
#: ../data/50-gnome-shell-system.xml.in.h:1 #: ../data/50-gnome-shell-system.xml.in.h:1
#| msgid "File System"
msgid "System" msgid "System"
msgstr "Sistem" msgstr "Sistem"
#: ../data/50-gnome-shell-system.xml.in.h:2 #: ../data/50-gnome-shell-system.xml.in.h:2
#| msgid "Message Tray"
msgid "Show the message tray" msgid "Show the message tray"
msgstr "Prikažite fioku poruka" msgstr "Prikažite fioku poruka"
#: ../data/50-gnome-shell-system.xml.in.h:3
#| msgid "Show Applications"
msgid "Show all applications"
msgstr "Prikaži sve programe"
#: ../data/50-gnome-shell-system.xml.in.h:4
#| msgid "Keybinding to open the application menu"
msgid "Open the application menu"
msgstr "Otvorite izbornik programa"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Gnomova školjka" msgstr "Gnomova školjka"
@ -145,41 +153,52 @@ msgstr "Ako je izabrano, prikazuje ISO dan u nedelji u kalendaru."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.in.h:15
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
msgstr "Sveza tastera za otvaranje izbornika programa" msgstr "Prečica za otvaranje izbornika programa"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "Keybinding to open the application menu." msgid "Keybinding to open the application menu."
msgstr "Sveza tastera za otvaranje izbornika programa." msgstr "Prečica za otvaranje izbornika programa."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
#| msgid "Keybinding to open the application menu"
msgid "Keybinding to open the \"Show Applications\" view"
msgstr "Prečica za otvaranje pregleda „Prikaži programe“"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
#| msgid "Keybinding to open the application menu."
msgid ""
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
msgstr "Prečica za otvaranje pregleda „Prikaži programe“ u pregledu aktivnosti."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
msgid "Keybinding to toggle the visibility of the message tray" msgid "Keybinding to toggle the visibility of the message tray"
msgstr "Prečica za okidanje vidljivosti fioke poruka" msgstr "Prečica za okidanje vidljivosti fioke poruka"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18 #: ../data/org.gnome.shell.gschema.xml.in.in.h:20
msgid "Keybinding to toggle the visibility of the message tray." msgid "Keybinding to toggle the visibility of the message tray."
msgstr "Prečica za okidanje vidljivosti fioke poruka." msgstr "Prečica za okidanje vidljivosti fioke poruka."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.in.h:21
msgid "Keybinding to toggle the screen recorder" msgid "Keybinding to toggle the screen recorder"
msgstr "Prečica za okidanje čitača ekrana" msgstr "Prečica za okidanje čitača ekrana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.in.h:22
msgid "Keybinding to start/stop the builtin screen recorder." msgid "Keybinding to start/stop the builtin screen recorder."
msgstr "Prečica za pokretanje/zaustavljanje ugrađenog snimača ekrana." msgstr "Prečica za pokretanje/zaustavljanje ugrađenog snimača ekrana."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.in.h:23
msgid "Which keyboard to use" msgid "Which keyboard to use"
msgstr "Koja će tastatura biti korišćena" msgstr "Koja će tastatura biti korišćena"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.in.h:24
msgid "The type of keyboard to use." msgid "The type of keyboard to use."
msgstr "Vrsta tastature za upotrebu." msgstr "Vrsta tastature za upotrebu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.in.h:25
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "Učestanost kadrova za video snimak ekrana." msgstr "Učestanost kadrova za video snimak ekrana."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24 #: ../data/org.gnome.shell.gschema.xml.in.in.h:26
msgid "" msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's " "The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second." "screencast recorder in frames-per-second."
@ -187,23 +206,12 @@ msgstr ""
"Učestanost kadrova snimka snimljenih pomoću Gnomove školjke u kadrovima po " "Učestanost kadrova snimka snimljenih pomoću Gnomove školjke u kadrovima po "
"sekundi." "sekundi."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25 #: ../data/org.gnome.shell.gschema.xml.in.in.h:27
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Procesni lanac Gstrimera korišćen za kodiranje video snimka ekrana" msgstr "Procesni lanac Gstrimera korišćen za kodiranje video snimka ekrana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27 #: ../data/org.gnome.shell.gschema.xml.in.in.h:29
#, no-c-format #, no-c-format
#| msgid ""
#| "Sets the GStreamer pipeline used to encode recordings. It follows the "
#| "syntax used for gst-launch. The pipeline should have an unconnected sink "
#| "pad where the recorded video is recorded. It will normally have a "
#| "unconnected source pad; output from that pad will be written into the "
#| "output file. However the pipeline can also take care of its own output - "
#| "this might be used to send the output to an icecast server via shout2send "
#| "or similar. When unset or set to an empty value, the default pipeline "
#| "will be used. This is currently '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."
msgid "" msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax " "Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where " "used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -221,19 +229,19 @@ msgstr ""
"da ima jedan nepovezani padiljon sinhronizacije za čuvanje snimljenog videa. " "da ima jedan nepovezani padiljon sinhronizacije za čuvanje snimljenog videa. "
"Normalno će imati nepovezan padiljon izvora; izlaz sa ovog padiljona će biti " "Normalno će imati nepovezan padiljon izvora; izlaz sa ovog padiljona će biti "
"zapisivan u izlaznu datoteku. Ipak procesni lanac može da radi sa sopstvenim " "zapisivan u izlaznu datoteku. Ipak procesni lanac može da radi sa sopstvenim "
"izlazom — ovo može biti korišćeno za slanje izlaza na ajskast server preko " "izlazom — ovo može biti korišćeno za slanje izlaza na ajskast server preko d"
"d„shout2sen“ ili slične naredbe. Kada ova opcija nije postavljena ili je " "„shout2sen“ ili slične naredbe. Kada ova opcija nije postavljena ili je "
"postavljena na neku praznu vrednost, biće korišćen podrazumevani procesni " "postavljena na neku praznu vrednost, biće korišćen podrazumevani procesni "
"lanac. A to je trenutno „vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 " "lanac. A to je trenutno „vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 "
"deadline=1000000 threads=%T ! queue ! webmmux“ i zapisuje u „WEBM“ " "deadline=1000000 threads=%T ! queue ! webmmux“ i zapisuje u „WEBM“ koristeći "
"koristeći VP8 kodek. „%T“ se koristi kao nosilac za otkrivanje pri optimalnom " "VP8 kodek. „%T“ se koristi kao nosilac za otkrivanje pri optimalnom proračunu "
"proračunu niti na sistemu." "niti na sistemu."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28 #: ../data/org.gnome.shell.gschema.xml.in.in.h:30
msgid "File extension used for storing the screencast" msgid "File extension used for storing the screencast"
msgstr "Proširenje datoteke za čuvanje video snimaka ekrana" msgstr "Proširenje datoteke za čuvanje video snimaka ekrana"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "" msgid ""
"The filename for recorded screencasts will be a unique filename based on the " "The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to " "current date, and use this extension. It should be changed when recording to "
@ -256,11 +264,11 @@ msgstr "Proširenje"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor." msgstr "Izaberite proširenje za podešavanje koristeći prozorče za izbor."
#: ../js/gdm/loginDialog.js:526 #: ../js/gdm/loginDialog.js:529
msgid "Session..." msgid "Session..."
msgstr "Sesija..." msgstr "Sesija..."
#: ../js/gdm/loginDialog.js:674 #: ../js/gdm/loginDialog.js:677
msgctxt "title" msgctxt "title"
msgid "Sign In" msgid "Sign In"
msgstr "Prijavite se" msgstr "Prijavite se"
@ -268,42 +276,46 @@ msgstr "Prijavite se"
#. translators: this message is shown below the user list on the #. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for #. login screen. It can be activated to reveal an entry for
#. manually entering the username. #. manually entering the username.
#: ../js/gdm/loginDialog.js:741 #: ../js/gdm/loginDialog.js:736
msgid "Not listed?" msgid "Not listed?"
msgstr "Nije na spisku?" msgstr "Nije na spisku?"
#: ../js/gdm/loginDialog.js:894 ../js/ui/components/networkAgent.js:137 #: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373 #: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:166 #: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
msgid "Cancel" msgid "Cancel"
msgstr "Otkaži" msgstr "Otkaži"
#: ../js/gdm/loginDialog.js:899 #: ../js/gdm/loginDialog.js:894
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Prijavi me" msgstr "Prijavi me"
#: ../js/gdm/loginDialog.js:1238 #: ../js/gdm/loginDialog.js:1215
msgid "Login Window" msgid "Login Window"
msgstr "Prozor za prijavljivanje" msgstr "Prozor za prijavljivanje"
#: ../js/gdm/powerMenu.js:88 ../js/ui/userMenu.js:658 ../js/ui/userMenu.js:662 #. Translators: accessible name of the power menu in the login screen
#: ../js/ui/userMenu.js:773 #: ../js/gdm/powerMenu.js:35
msgid "Power"
msgstr "Ugasi"
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:775
msgid "Suspend" msgid "Suspend"
msgstr "Obustavi" msgstr "Obustavi"
#: ../js/gdm/powerMenu.js:93 #: ../js/gdm/powerMenu.js:94
msgid "Restart" msgid "Restart"
msgstr "Ponovo pokreni" msgstr "Ponovo pokreni"
#: ../js/gdm/powerMenu.js:98 ../js/ui/userMenu.js:660 ../js/ui/userMenu.js:662 #: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:662 ../js/ui/userMenu.js:664
#: ../js/ui/userMenu.js:772 #: ../js/ui/userMenu.js:774
msgid "Power Off" msgid "Power Off"
msgstr "Ugasi" msgstr "Ugasi"
#: ../js/gdm/util.js:148 #: ../js/gdm/util.js:148
#| msgid "Authentication Required"
msgid "Authentication error" msgid "Authentication error"
msgstr "Greška potvrđivanja identiteta" msgstr "Greška potvrđivanja identiteta"
@ -350,7 +362,7 @@ msgstr "PODEŠAVANJA"
msgid "New Window" msgid "New Window"
msgstr "Novi prozor" msgstr "Novi prozor"
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:271 #: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Ukloni iz omiljenih" msgstr "Ukloni iz omiljenih"
@ -514,16 +526,16 @@ msgstr "Ove nedelje"
msgid "Next week" msgid "Next week"
msgstr "Sledeće nedelje" msgstr "Sledeće nedelje"
#: ../js/ui/components/autorunManager.js:278 #: ../js/ui/components/autorunManager.js:297
msgid "Removable Devices" msgid "Removable Devices"
msgstr "Uklonjivi uređaji" msgstr "Uklonjivi uređaji"
#: ../js/ui/components/autorunManager.js:575 #: ../js/ui/components/autorunManager.js:594
#, c-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otvori programom %s" msgstr "Otvori programom %s"
#: ../js/ui/components/autorunManager.js:601 #: ../js/ui/components/autorunManager.js:620
msgid "Eject" msgid "Eject"
msgstr "Izbaci" msgstr "Izbaci"
@ -892,7 +904,7 @@ msgstr "Uredi nalog"
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Nepoznat razlog" msgstr "Nepoznat razlog"
#: ../js/ui/dash.js:245 ../js/ui/dash.js:273 #: ../js/ui/dash.js:253 ../js/ui/dash.js:292
msgid "Show Applications" msgid "Show Applications"
msgstr "Prikaži programe" msgstr "Prikaži programe"
@ -900,14 +912,14 @@ msgstr "Prikaži programe"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Podešavanja datuma i vremena" msgstr "Podešavanja datuma i vremena"
#: ../js/ui/dateMenu.js:109 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Otvori kalendar" msgstr "Otvori kalendar"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:201
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %b, %R" msgstr "%A, %e. %b, %R"
@ -1020,11 +1032,11 @@ msgstr "Instaliraj"
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Da preuzmem i da instaliram „%s“ sa extensions.gnome.org?" msgstr "Da preuzmem i da instaliram „%s“ sa extensions.gnome.org?"
#: ../js/ui/keyboard.js:327 #: ../js/ui/keyboard.js:337
msgid "tray" msgid "tray"
msgstr "fioka" msgstr "fioka"
#: ../js/ui/keyboard.js:561 ../js/ui/status/keyboard.js:194 #: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
#: ../js/ui/status/power.js:205 #: ../js/ui/status/power.js:205
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatura" msgstr "Tastatura"
@ -1077,19 +1089,19 @@ msgstr "Prikaži kod"
msgid "Web Page" msgid "Web Page"
msgstr "Veb stranica" msgstr "Veb stranica"
#: ../js/ui/messageTray.js:1080 #: ../js/ui/messageTray.js:1081
msgid "Open" msgid "Open"
msgstr "Otvori" msgstr "Otvori"
#: ../js/ui/messageTray.js:1087 #: ../js/ui/messageTray.js:1088
msgid "Remove" msgid "Remove"
msgstr "Ukloni" msgstr "Ukloni"
#: ../js/ui/messageTray.js:2052 #: ../js/ui/messageTray.js:1540
msgid "Message Tray" msgid "Message Tray"
msgstr "Fioka poruka" msgstr "Fioka poruka"
#: ../js/ui/messageTray.js:2508 #: ../js/ui/messageTray.js:2547
msgid "System Information" msgid "System Information"
msgstr "Podaci o sistemu" msgstr "Podaci o sistemu"
@ -1153,7 +1165,7 @@ msgstr "Unesite naredbu:"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d. %B" msgstr "%A, %d. %B"
#: ../js/ui/screenShield.js:144 #: ../js/ui/screenShield.js:143
#, c-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1162,7 +1174,7 @@ msgstr[1] "%d nove poruke"
msgstr[2] "%d novih poruka" msgstr[2] "%d novih poruka"
msgstr[3] "Jedna nova poruka" msgstr[3] "Jedna nova poruka"
#: ../js/ui/screenShield.js:146 #: ../js/ui/screenShield.js:145
#, c-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
@ -1203,7 +1215,7 @@ msgstr "Lozinka"
msgid "Remember Password" msgid "Remember Password"
msgstr "Zapamti lozinku" msgstr "Zapamti lozinku"
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:169 #: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
msgid "Unlock" msgid "Unlock"
msgstr "Otključaj" msgstr "Otključaj"
@ -1321,7 +1333,7 @@ msgstr "Podešavanja tastature"
msgid "Mouse Settings" msgid "Mouse Settings"
msgstr "Podešavanja miša" msgstr "Podešavanja miša"
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:236 #: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
msgid "Sound Settings" msgid "Sound Settings"
msgstr "Podešavanja zvuka" msgstr "Podešavanja zvuka"
@ -1379,11 +1391,11 @@ msgstr "Molim unesite PIN naznačen na uređaju."
msgid "OK" msgid "OK"
msgstr "U redu" msgstr "U redu"
#: ../js/ui/status/keyboard.js:227 #: ../js/ui/status/keyboard.js:228
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Prikaži raspored tastature" msgstr "Prikaži raspored tastature"
#: ../js/ui/status/keyboard.js:232 #: ../js/ui/status/keyboard.js:233
msgid "Region and Language Settings" msgid "Region and Language Settings"
msgstr "Podešavanja regiona i jezika" msgstr "Podešavanja regiona i jezika"
@ -1614,7 +1626,7 @@ msgid "Unknown"
msgstr "Nepoznat" msgstr "Nepoznat"
#. Translators: This is the label for audio volume #. Translators: This is the label for audio volume
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:223 #: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
msgid "Volume" msgid "Volume"
msgstr "Jačina zvuka" msgstr "Jačina zvuka"
@ -1622,67 +1634,63 @@ msgstr "Jačina zvuka"
msgid "Microphone" msgid "Microphone"
msgstr "Mikrofon" msgstr "Mikrofon"
#: ../js/ui/unlockDialog.js:176 #: ../js/ui/unlockDialog.js:177
msgid "Log in as another user" msgid "Log in as another user"
msgstr "Prijavite se kao drugi korsnik" msgstr "Prijavite se kao drugi korsnik"
#: ../js/ui/userMenu.js:175 #: ../js/ui/userMenu.js:180
msgid "Available" msgid "Available"
msgstr "Dostupan" msgstr "Dostupan"
#: ../js/ui/userMenu.js:178 #: ../js/ui/userMenu.js:183
msgid "Busy" msgid "Busy"
msgstr "Zauzet" msgstr "Zauzet"
#: ../js/ui/userMenu.js:181 #: ../js/ui/userMenu.js:186
msgid "Invisible" msgid "Invisible"
msgstr "Nevidljiv" msgstr "Nevidljiv"
#: ../js/ui/userMenu.js:184 #: ../js/ui/userMenu.js:189
msgid "Away" msgid "Away"
msgstr "Odsutan" msgstr "Odsutan"
#: ../js/ui/userMenu.js:187 #: ../js/ui/userMenu.js:192
msgid "Idle" msgid "Idle"
msgstr "Miruje" msgstr "Miruje"
#: ../js/ui/userMenu.js:190 #: ../js/ui/userMenu.js:195
msgid "Unavailable" msgid "Unavailable"
msgstr "Nedostupan" msgstr "Nedostupan"
#: ../js/ui/userMenu.js:613 ../js/ui/userMenu.js:754 #: ../js/ui/userMenu.js:740
msgid "Switch User"
msgstr "Promeni korisnika"
#: ../js/ui/userMenu.js:614
msgid "Switch Session"
msgstr "Promeni sesiju"
#: ../js/ui/userMenu.js:738
msgid "Notifications" msgid "Notifications"
msgstr "Obaveštenja" msgstr "Obaveštenja"
#: ../js/ui/userMenu.js:746 #: ../js/ui/userMenu.js:748
msgid "System Settings" msgid "System Settings"
msgstr "Podešavanja sistema" msgstr "Podešavanja sistema"
#: ../js/ui/userMenu.js:759 #: ../js/ui/userMenu.js:756
msgid "Switch User"
msgstr "Promeni korisnika"
#: ../js/ui/userMenu.js:761
msgid "Log Out" msgid "Log Out"
msgstr "Odjavi me" msgstr "Odjavi me"
#: ../js/ui/userMenu.js:764 #: ../js/ui/userMenu.js:766
msgid "Lock" msgid "Lock"
msgstr "Zaključaj" msgstr "Zaključaj"
#: ../js/ui/userMenu.js:779 #: ../js/ui/userMenu.js:781
msgid "Install Updates & Restart" msgid "Install Updates & Restart"
msgstr "Instaliraj ažuriranja i ponovo pokreni" msgstr "Instaliraj ažuriranja i ponovo pokreni"
#: ../js/ui/userMenu.js:797 #: ../js/ui/userMenu.js:799
msgid "Your chat status will be set to busy" msgid "Your chat status will be set to busy"
msgstr "Vaše stanje ćaskanja će biti postavljeno na zauzeto" msgstr "Vaše stanje ćaskanja će biti postavljeno na zauzeto"
#: ../js/ui/userMenu.js:798 #: ../js/ui/userMenu.js:800
msgid "" msgid ""
"Notifications are now disabled, including chat messages. Your online status " "Notifications are now disabled, including chat messages. Your online status "
"has been adjusted to let others know that you might not see their messages." "has been adjusted to let others know that you might not see their messages."
@ -1691,19 +1699,19 @@ msgstr ""
"mreži je podešeno tako da će ostali znati da vi ne možete videti njihove " "mreži je podešeno tako da će ostali znati da vi ne možete videti njihove "
"poruke." "poruke."
#: ../js/ui/viewSelector.js:85 #: ../js/ui/viewSelector.js:87
msgid "Windows" msgid "Windows"
msgstr "Prozori" msgstr "Prozori"
#: ../js/ui/viewSelector.js:89 #: ../js/ui/viewSelector.js:91
msgid "Applications" msgid "Applications"
msgstr "Programi" msgstr "Programi"
#: ../js/ui/viewSelector.js:93 #: ../js/ui/viewSelector.js:95
msgid "Search" msgid "Search"
msgstr "Traži" msgstr "Traži"
#: ../js/ui/wanda.js:119 #: ../js/ui/wanda.js:117
#, c-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
@ -1712,12 +1720,12 @@ msgstr ""
"Izvinite, danas za vas nema mudrosti:\n" "Izvinite, danas za vas nema mudrosti:\n"
"%s" "%s"
#: ../js/ui/wanda.js:123 #: ../js/ui/wanda.js:121
#, c-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Prorok je rekao %s" msgstr "Prorok je rekao %s"
#: ../js/ui/wanda.js:164 #: ../js/ui/wanda.js:162
msgid "Your favorite Easter Egg" msgid "Your favorite Easter Egg"
msgstr "Vaše omiljeno uskršnje jaje" msgstr "Vaše omiljeno uskršnje jaje"
@ -1756,19 +1764,19 @@ msgstr[3] "Jedan ulaz"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sistemski zvuci" msgstr "Sistemski zvuci"
#: ../src/main.c:330 #: ../src/main.c:332
msgid "Print version" msgid "Print version"
msgstr "Ispisuje izdanje" msgstr "Ispisuje izdanje"
#: ../src/main.c:336 #: ../src/main.c:338
msgid "Mode used by GDM for login screen" msgid "Mode used by GDM for login screen"
msgstr "Koji režim koristi GDM za ekran prijavljivanja" msgstr "Koji režim koristi GDM za ekran prijavljivanja"
#: ../src/main.c:342 #: ../src/main.c:344
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "Koristi naročit režim, npr. „gdm“ za ekran prijavljivanja" msgstr "Koristi naročit režim, npr. „gdm“ za ekran prijavljivanja"
#: ../src/main.c:348 #: ../src/main.c:350
msgid "List possible modes" msgid "List possible modes"
msgstr "Ispisuje moguće režime" msgstr "Ispisuje moguće režime"
@ -1797,6 +1805,9 @@ msgstr "Osnovno"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Korisnik je odbacio prozorče za potvrđivanje identiteta" msgstr "Korisnik je odbacio prozorče za potvrđivanje identiteta"
#~ msgid "Switch Session"
#~ msgstr "Promeni sesiju"
#~ msgid "disabled OpenSearch providers" #~ msgid "disabled OpenSearch providers"
#~ msgstr "isključeni „OpenSearch“ dostavljači" #~ msgstr "isključeni „OpenSearch“ dostavljači"

View File

@ -218,12 +218,12 @@ msgstr "يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:91 #: ../js/ui/appFavorites.js:91
#, c-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى." msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:122 #: ../js/ui/appFavorites.js:122
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ." msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
@ -437,7 +437,7 @@ msgstr "يېقىنقى تۈرلەر"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
#, c-format #, c-format
msgid "Log Out %s" msgid "Log Out %s"
msgstr "%s تىزىمدىن چىقىش" msgstr "%s تىزىمدىن چىقىش"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:70
msgid "Log Out" msgid "Log Out"
@ -452,7 +452,7 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:66 #: ../js/ui/endSessionDialog.js:66
#, c-format #, c-format
msgid "%s will be logged out automatically in %d seconds." msgid "%s will be logged out automatically in %d seconds."
msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز." msgstr "%s تىزىمدىن %d سېكۇنتتىن كېيىن ئۆزلۈكىدىن چىقىسىز."
#: ../js/ui/endSessionDialog.js:67 #: ../js/ui/endSessionDialog.js:67
#, c-format #, c-format
@ -566,7 +566,7 @@ msgstr "سىزىقچە"
#: ../js/ui/panel.js:533 #: ../js/ui/panel.js:533
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "%s چېكىن" msgstr "%s چېكىن"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
@ -799,7 +799,7 @@ msgstr "رەت قىل"
#: ../js/ui/status/bluetooth.js:408 #: ../js/ui/status/bluetooth.js:408
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ" msgstr "%s نىڭ جەزملىشىنى جۈپلەشتۈرۈۋاتىدۇ"
#: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448 #: ../js/ui/status/bluetooth.js:414 ../js/ui/status/bluetooth.js:448
#, c-format #, c-format
@ -823,7 +823,7 @@ msgstr "ماسلاشمىدى"
#: ../js/ui/status/bluetooth.js:441 #: ../js/ui/status/bluetooth.js:441
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى" msgstr "%s دىن كەلگەن جۈپلەش ئىلتىماسى"
#: ../js/ui/status/bluetooth.js:449 #: ../js/ui/status/bluetooth.js:449
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
@ -1074,22 +1074,22 @@ msgstr "مىكروفون"
#: ../js/ui/telepathyClient.js:335 #: ../js/ui/telepathyClient.js:335
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s توردا." msgstr "%s توردا."
#: ../js/ui/telepathyClient.js:340 #: ../js/ui/telepathyClient.js:340
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s توردا يوق." msgstr "%s توردا يوق."
#: ../js/ui/telepathyClient.js:343 #: ../js/ui/telepathyClient.js:343
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "%s يوق." msgstr "%s يوق."
#: ../js/ui/telepathyClient.js:346 #: ../js/ui/telepathyClient.js:346
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s ئالدىراش." msgstr "%s ئالدىراش."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
@ -1114,7 +1114,7 @@ msgstr "ئىزدە"
#: ../js/ui/windowAttentionHandler.js:42 #: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s باشلاشنى تاماملىدى" msgstr "%s باشلاشنى تاماملىدى"
#: ../js/ui/windowAttentionHandler.js:44 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format

View File

@ -113,7 +113,6 @@ shell_public_headers_h = \
shell-generic-container.h \ shell-generic-container.h \
shell-gtk-embed.h \ shell-gtk-embed.h \
shell-global.h \ shell-global.h \
shell-idle-monitor.h \
shell-invert-lightness-effect.h \ shell-invert-lightness-effect.h \
shell-mobile-providers.h \ shell-mobile-providers.h \
shell-mount-operation.h \ shell-mount-operation.h \
@ -158,7 +157,6 @@ libgnome_shell_la_SOURCES = \
shell-generic-container.c \ shell-generic-container.c \
shell-gtk-embed.c \ shell-gtk-embed.c \
shell-global.c \ shell-global.c \
shell-idle-monitor.c \
shell-invert-lightness-effect.c \ shell-invert-lightness-effect.c \
shell-keyring-prompt.h \ shell-keyring-prompt.h \
shell-keyring-prompt.c \ shell-keyring-prompt.c \

View File

@ -31,7 +31,6 @@
#include <string.h> #include <string.h>
#define HANDLE_LIBICAL_MEMORY #define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h> #include <libecal/libecal.h>
#include <libedataserverui/libedataserverui.h>
#undef CALENDAR_ENABLE_DEBUG #undef CALENDAR_ENABLE_DEBUG
#include "calendar-debug.h" #include "calendar-debug.h"

View File

@ -34,7 +34,6 @@
#include <unistd.h> #include <unistd.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <gtk/gtk.h>
#define HANDLE_LIBICAL_MEMORY #define HANDLE_LIBICAL_MEMORY
#include <libecal/libecal.h> #include <libecal/libecal.h>
@ -985,9 +984,11 @@ on_name_lost (GDBusConnection *connection,
const gchar *name, const gchar *name,
gpointer user_data) gpointer user_data)
{ {
GMainLoop *main_loop = user_data;
g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n", g_print ("gnome-shell-calendar-server[%d]: Lost (or failed to acquire) the name " BUS_NAME " - exiting\n",
(gint) getpid ()); (gint) getpid ());
gtk_main_quit (); g_main_loop_quit (main_loop);
} }
static void static void
@ -1003,11 +1004,13 @@ stdin_channel_io_func (GIOChannel *source,
GIOCondition condition, GIOCondition condition,
gpointer data) gpointer data)
{ {
GMainLoop *main_loop = data;
if (condition & G_IO_HUP) if (condition & G_IO_HUP)
{ {
g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n", g_debug ("gnome-shell-calendar-server[%d]: Got HUP on stdin - exiting\n",
(gint) getpid ()); (gint) getpid ());
gtk_main_quit (); g_main_loop_quit (main_loop);
} }
else else
{ {
@ -1022,6 +1025,7 @@ main (int argc,
{ {
GError *error; GError *error;
GOptionContext *opt_context; GOptionContext *opt_context;
GMainLoop *main_loop;
gint ret; gint ret;
guint name_owner_id; guint name_owner_id;
GIOChannel *stdin_channel; GIOChannel *stdin_channel;
@ -1031,9 +1035,7 @@ main (int argc,
name_owner_id = 0; name_owner_id = 0;
stdin_channel = NULL; stdin_channel = NULL;
/* We need to initialize GTK+ since evolution-data-server may decide to use g_type_init ();
* GTK+ to pop up a dialog box */
gtk_init (&argc, &argv);
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
g_assert (introspection_data != NULL); g_assert (introspection_data != NULL);
@ -1048,11 +1050,15 @@ main (int argc,
goto out; goto out;
} }
main_loop = g_main_loop_new (NULL, FALSE);
stdin_channel = g_io_channel_unix_new (STDIN_FILENO); stdin_channel = g_io_channel_unix_new (STDIN_FILENO);
g_io_add_watch (stdin_channel, g_io_add_watch_full (stdin_channel,
G_IO_HUP, G_PRIORITY_DEFAULT,
stdin_channel_io_func, G_IO_HUP,
NULL); stdin_channel_io_func,
g_main_loop_ref (main_loop),
(GDestroyNotify) g_main_loop_unref);
name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION, name_owner_id = g_bus_own_name (G_BUS_TYPE_SESSION,
BUS_NAME, BUS_NAME,
@ -1061,10 +1067,12 @@ main (int argc,
on_bus_acquired, on_bus_acquired,
on_name_acquired, on_name_acquired,
on_name_lost, on_name_lost,
NULL, g_main_loop_ref (main_loop),
NULL); (GDestroyNotify) g_main_loop_unref);
gtk_main (); g_main_loop_run (main_loop);
g_main_loop_unref (main_loop);
ret = 0; ret = 0;

View File

@ -240,8 +240,6 @@ main (int argc,
{ {
guint name_owner_id; guint name_owner_id;
g_type_init ();
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
g_assert (introspection_data != NULL); g_assert (introspection_data != NULL);

View File

@ -361,8 +361,6 @@ main (int argc, char **argv)
int ecode; int ecode;
TpDebugSender *sender; TpDebugSender *sender;
g_type_init ();
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE); textdomain (GETTEXT_PACKAGE);

View File

@ -92,7 +92,6 @@ main(int argc, char **argv)
g_error ("option parsing failed: %s", error->message); g_error ("option parsing failed: %s", error->message);
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
g_type_init ();
_shell_global_init (NULL); _shell_global_init (NULL);
global = shell_global_get (); global = shell_global_get ();

View File

@ -73,6 +73,7 @@ struct _ShellApp
char *window_id_string; char *window_id_string;
char *casefolded_name; char *casefolded_name;
char *casefolded_generic_name;
char *name_collation_key; char *name_collation_key;
char *casefolded_exec; char *casefolded_exec;
char **casefolded_keywords; char **casefolded_keywords;
@ -1310,6 +1311,7 @@ static void
shell_app_init_search_data (ShellApp *app) shell_app_init_search_data (ShellApp *app)
{ {
const char *name; const char *name;
const char *generic_name;
const char *exec; const char *exec;
const char * const *keywords; const char * const *keywords;
char *normalized_exec; char *normalized_exec;
@ -1319,6 +1321,12 @@ shell_app_init_search_data (ShellApp *app)
name = g_app_info_get_name (G_APP_INFO (appinfo)); name = g_app_info_get_name (G_APP_INFO (appinfo));
app->casefolded_name = shell_util_normalize_and_casefold (name); app->casefolded_name = shell_util_normalize_and_casefold (name);
generic_name = g_desktop_app_info_get_generic_name (appinfo);
if (generic_name)
app->casefolded_generic_name = shell_util_normalize_and_casefold (generic_name);
else
app->casefolded_generic_name = NULL;
exec = g_app_info_get_executable (G_APP_INFO (appinfo)); exec = g_app_info_get_executable (G_APP_INFO (appinfo));
normalized_exec = shell_util_normalize_and_casefold (exec); normalized_exec = shell_util_normalize_and_casefold (exec);
app->casefolded_exec = trim_exec_line (normalized_exec); app->casefolded_exec = trim_exec_line (normalized_exec);
@ -1388,6 +1396,18 @@ _shell_app_match_search_terms (ShellApp *app,
current_match = MATCH_SUBSTRING; current_match = MATCH_SUBSTRING;
} }
if (app->casefolded_generic_name)
{
p = strstr (app->casefolded_generic_name, term);
if (p != NULL)
{
if (p == app->casefolded_generic_name || *(p - 1) == ' ')
current_match = MATCH_PREFIX;
else if (current_match < MATCH_PREFIX)
current_match = MATCH_SUBSTRING;
}
}
if (app->casefolded_exec) if (app->casefolded_exec)
{ {
p = strstr (app->casefolded_exec, term); p = strstr (app->casefolded_exec, term);
@ -1497,6 +1517,7 @@ shell_app_finalize (GObject *object)
g_free (app->window_id_string); g_free (app->window_id_string);
g_free (app->casefolded_name); g_free (app->casefolded_name);
g_free (app->casefolded_generic_name);
g_free (app->name_collation_key); g_free (app->name_collation_key);
g_free (app->casefolded_exec); g_free (app->casefolded_exec);
g_strfreev (app->casefolded_keywords); g_strfreev (app->casefolded_keywords);

View File

@ -1693,43 +1693,3 @@ shell_global_get_session_mode (ShellGlobal *global)
return global->session_mode; return global->session_mode;
} }
/**
* shell_global_create_xrootpmap_texture:
* @global: The #ShellGlobal
*
* This returns the _XROOTPMAP_ID pixmap that gdm should have stuffed
* in the root window. The goal here is to allow a smooth fade between
* plymouth and the shell greeter. This is also a workaround for gjs not
* supporting raw xlib types.
*
* Returns: (transfer floating): A #ClutterActor that represents the
* _XROOTPMAP_ID pixmap property from the root window.
*/
ClutterActor *
shell_global_create_xrootpmap_texture (ShellGlobal *global)
{
Atom res_type;
int res_format;
unsigned long res_nitems, bytesafter;
unsigned char *data;
Pixmap root_pixmap_id = None;
g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
if (XGetWindowProperty (global->xdisplay,
DefaultRootWindow (global->xdisplay),
XInternAtom (global->xdisplay, "_XROOTPMAP_ID", False),
0, G_MAXLONG, False, XA_PIXMAP,
&res_type, &res_format, &res_nitems, &bytesafter, &data) == Success)
{
if (res_type == XA_PIXMAP && res_format == 32 && res_nitems == 1)
root_pixmap_id = * (Pixmap *) data;
XFree (data);
}
if (root_pixmap_id != None)
return clutter_x11_texture_pixmap_new_with_pixmap (root_pixmap_id);
else
return NULL;
}

View File

@ -136,8 +136,6 @@ void shell_global_reexec_self (ShellGlobal *global);
const char * shell_global_get_session_mode (ShellGlobal *global); const char * shell_global_get_session_mode (ShellGlobal *global);
ClutterActor * shell_global_create_xrootpmap_texture (ShellGlobal *global);
G_END_DECLS G_END_DECLS
#endif /* __SHELL_GLOBAL_H__ */ #endif /* __SHELL_GLOBAL_H__ */

View File

@ -1,429 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Adapted from gnome-session/gnome-session/gs-idle-monitor.c
*
* Copyright (C) 2012 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: William Jon McCann <mccann@jhu.edu>
*
*/
#include "config.h"
#include <time.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/extensions/sync.h>
#include <glib.h>
#include <gdk/gdkx.h>
#include <gdk/gdk.h>
#include "shell-idle-monitor.h"
#define SHELL_IDLE_MONITOR_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorPrivate))
struct ShellIdleMonitorPrivate
{
Display *display;
GHashTable *watches;
int sync_event_base;
XSyncCounter counter;
};
typedef struct
{
Display *display;
guint id;
XSyncValue interval;
ShellIdleMonitorWatchFunc callback;
gpointer user_data;
GDestroyNotify notify;
XSyncAlarm xalarm_positive;
XSyncAlarm xalarm_negative;
} ShellIdleMonitorWatch;
static guint32 watch_serial = 1;
G_DEFINE_TYPE (ShellIdleMonitor, shell_idle_monitor, G_TYPE_OBJECT)
static gint64
_xsyncvalue_to_int64 (XSyncValue value)
{
return ((guint64) XSyncValueHigh32 (value)) << 32
| (guint64) XSyncValueLow32 (value);
}
static XSyncValue
_int64_to_xsyncvalue (gint64 value)
{
XSyncValue ret;
XSyncIntsToValue (&ret, value, ((guint64)value) >> 32);
return ret;
}
static void
shell_idle_monitor_dispose (GObject *object)
{
ShellIdleMonitor *monitor;
monitor = SHELL_IDLE_MONITOR (object);
if (monitor->priv->watches != NULL) {
g_hash_table_destroy (monitor->priv->watches);
monitor->priv->watches = NULL;
}
G_OBJECT_CLASS (shell_idle_monitor_parent_class)->dispose (object);
}
static gboolean
_find_alarm (gpointer key,
ShellIdleMonitorWatch *watch,
XSyncAlarm *alarm)
{
/* g_debug ("Searching for %d in %d,%d", (int)*alarm, (int)watch->xalarm_positive, (int)watch->xalarm_negative); */
if (watch->xalarm_positive == *alarm
|| watch->xalarm_negative == *alarm) {
return TRUE;
}
return FALSE;
}
static ShellIdleMonitorWatch *
find_watch_for_alarm (ShellIdleMonitor *monitor,
XSyncAlarm alarm)
{
ShellIdleMonitorWatch *watch;
watch = g_hash_table_find (monitor->priv->watches,
(GHRFunc)_find_alarm,
&alarm);
return watch;
}
static void
handle_alarm_notify_event (ShellIdleMonitor *monitor,
XSyncAlarmNotifyEvent *alarm_event)
{
ShellIdleMonitorWatch *watch;
gboolean condition;
if (alarm_event->state == XSyncAlarmDestroyed) {
return;
}
watch = find_watch_for_alarm (monitor, alarm_event->alarm);
if (watch == NULL) {
/* g_debug ("Unable to find watch for alarm %d", (int)alarm_event->alarm); */
return;
}
/* g_debug ("Watch %d fired, idle time = %" G_GINT64_FORMAT,
watch->id,
_xsyncvalue_to_int64 (alarm_event->counter_value)); */
if (alarm_event->alarm == watch->xalarm_positive) {
condition = TRUE;
} else {
condition = FALSE;
}
if (watch->callback != NULL) {
watch->callback (monitor,
watch->id,
condition,
watch->user_data);
}
}
static GdkFilterReturn
xevent_filter (GdkXEvent *xevent,
GdkEvent *event,
ShellIdleMonitor *monitor)
{
XEvent *ev;
XSyncAlarmNotifyEvent *alarm_event;
ev = xevent;
if (ev->xany.type != monitor->priv->sync_event_base + XSyncAlarmNotify) {
return GDK_FILTER_CONTINUE;
}
alarm_event = xevent;
handle_alarm_notify_event (monitor, alarm_event);
return GDK_FILTER_CONTINUE;
}
static gboolean
init_xsync (ShellIdleMonitor *monitor)
{
int sync_error_base;
int res;
int major;
int minor;
int i;
int ncounters;
XSyncSystemCounter *counters;
res = XSyncQueryExtension (monitor->priv->display,
&monitor->priv->sync_event_base,
&sync_error_base);
if (! res) {
g_warning ("ShellIdleMonitor: Sync extension not present");
return FALSE;
}
res = XSyncInitialize (monitor->priv->display, &major, &minor);
if (! res) {
g_warning ("ShellIdleMonitor: Unable to initialize Sync extension");
return FALSE;
}
counters = XSyncListSystemCounters (monitor->priv->display, &ncounters);
for (i = 0; i < ncounters; i++) {
if (counters[i].name != NULL
&& strcmp (counters[i].name, "IDLETIME") == 0) {
monitor->priv->counter = counters[i].counter;
break;
}
}
XSyncFreeSystemCounterList (counters);
if (monitor->priv->counter == None) {
g_warning ("ShellIdleMonitor: IDLETIME counter not found");
return FALSE;
}
gdk_window_add_filter (NULL, (GdkFilterFunc)xevent_filter, monitor);
return TRUE;
}
static GObject *
shell_idle_monitor_constructor (GType type,
guint n_construct_properties,
GObjectConstructParam *construct_properties)
{
ShellIdleMonitor *monitor;
monitor = SHELL_IDLE_MONITOR (G_OBJECT_CLASS (shell_idle_monitor_parent_class)->constructor (type,
n_construct_properties,
construct_properties));
monitor->priv->display = GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
if (! init_xsync (monitor)) {
g_object_unref (monitor);
return NULL;
}
return G_OBJECT (monitor);
}
static void
shell_idle_monitor_class_init (ShellIdleMonitorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->dispose = shell_idle_monitor_dispose;
object_class->constructor = shell_idle_monitor_constructor;
g_type_class_add_private (klass, sizeof (ShellIdleMonitorPrivate));
}
static guint32
get_next_watch_serial (void)
{
guint32 serial;
serial = watch_serial++;
if ((gint32)watch_serial < 0) {
watch_serial = 1;
}
/* FIXME: make sure it isn't in the hash */
return serial;
}
static ShellIdleMonitorWatch *
idle_monitor_watch_new (guint interval)
{
ShellIdleMonitorWatch *watch;
watch = g_slice_new0 (ShellIdleMonitorWatch);
watch->interval = _int64_to_xsyncvalue ((gint64)interval);
watch->id = get_next_watch_serial ();
watch->xalarm_positive = None;
watch->xalarm_negative = None;
return watch;
}
static void
idle_monitor_watch_free (ShellIdleMonitorWatch *watch)
{
if (watch == NULL) {
return;
}
if (watch->notify != NULL) {
watch->notify (watch->user_data);
}
if (watch->xalarm_positive != None) {
XSyncDestroyAlarm (watch->display, watch->xalarm_positive);
}
if (watch->xalarm_negative != None) {
XSyncDestroyAlarm (watch->display, watch->xalarm_negative);
}
g_slice_free (ShellIdleMonitorWatch, watch);
}
static void
shell_idle_monitor_init (ShellIdleMonitor *monitor)
{
monitor->priv = SHELL_IDLE_MONITOR_GET_PRIVATE (monitor);
monitor->priv->watches = g_hash_table_new_full (NULL,
NULL,
NULL,
(GDestroyNotify)idle_monitor_watch_free);
monitor->priv->counter = None;
}
/**
* shell_idle_monitor_get:
*
* Returns: (transfer none): the global #ShellIdleMonitor.
*/
ShellIdleMonitor *
shell_idle_monitor_get (void)
{
static ShellIdleMonitor *idle_monitor;
if (G_UNLIKELY (idle_monitor == NULL))
idle_monitor = g_object_new (SHELL_TYPE_IDLE_MONITOR,
NULL);
return idle_monitor;
}
static gboolean
_xsync_alarm_set (ShellIdleMonitor *monitor,
ShellIdleMonitorWatch *watch)
{
XSyncAlarmAttributes attr;
XSyncValue delta;
guint flags;
flags = XSyncCACounter
| XSyncCAValueType
| XSyncCATestType
| XSyncCAValue
| XSyncCADelta
| XSyncCAEvents;
XSyncIntToValue (&delta, 0);
attr.trigger.counter = monitor->priv->counter;
attr.trigger.value_type = XSyncAbsolute;
attr.trigger.wait_value = watch->interval;
attr.delta = delta;
attr.events = TRUE;
attr.trigger.test_type = XSyncPositiveTransition;
if (watch->xalarm_positive != None) {
/* g_debug ("ShellIdleMonitor: updating alarm for positive transition wait=%" G_GINT64_FORMAT,
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
XSyncChangeAlarm (monitor->priv->display, watch->xalarm_positive, flags, &attr);
} else {
/* g_debug ("ShellIdleMonitor: creating new alarm for positive transition wait=%" G_GINT64_FORMAT,
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
watch->xalarm_positive = XSyncCreateAlarm (monitor->priv->display, flags, &attr);
}
attr.trigger.wait_value = _int64_to_xsyncvalue (_xsyncvalue_to_int64 (watch->interval) - 1);
attr.trigger.test_type = XSyncNegativeTransition;
if (watch->xalarm_negative != None) {
/* g_debug ("ShellIdleMonitor: updating alarm for negative transition wait=%" G_GINT64_FORMAT,
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
XSyncChangeAlarm (monitor->priv->display, watch->xalarm_negative, flags, &attr);
} else {
/* g_debug ("ShellIdleMonitor: creating new alarm for negative transition wait=%" G_GINT64_FORMAT,
_xsyncvalue_to_int64 (attr.trigger.wait_value)); */
watch->xalarm_negative = XSyncCreateAlarm (monitor->priv->display, flags, &attr);
}
return TRUE;
}
guint
shell_idle_monitor_add_watch (ShellIdleMonitor *monitor,
guint interval,
ShellIdleMonitorWatchFunc callback,
gpointer user_data,
GDestroyNotify notify)
{
ShellIdleMonitorWatch *watch;
g_return_val_if_fail (SHELL_IS_IDLE_MONITOR (monitor), 0);
g_return_val_if_fail (callback != NULL, 0);
watch = idle_monitor_watch_new (interval);
watch->display = monitor->priv->display;
watch->callback = callback;
watch->user_data = user_data;
watch->notify = notify;
_xsync_alarm_set (monitor, watch);
g_hash_table_insert (monitor->priv->watches,
GUINT_TO_POINTER (watch->id),
watch);
return watch->id;
}
void
shell_idle_monitor_remove_watch (ShellIdleMonitor *monitor,
guint id)
{
g_return_if_fail (SHELL_IS_IDLE_MONITOR (monitor));
g_hash_table_remove (monitor->priv->watches,
GUINT_TO_POINTER (id));
}
gint64
shell_idle_monitor_get_idletime (ShellIdleMonitor *monitor)
{
XSyncValue value;
if (!XSyncQueryCounter (monitor->priv->display, monitor->priv->counter, &value))
return FALSE;
return _xsyncvalue_to_int64 (value);
}

View File

@ -1,74 +0,0 @@
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
*
* Adapted from gnome-session/gnome-session/gs-idle-monitor.h
*
* Copyright (C) 2012 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Authors: William Jon McCann <mccann@jhu.edu>
*
*/
#ifndef __SHELL_IDLE_MONITOR_H
#define __SHELL_IDLE_MONITOR_H
#include <glib-object.h>
G_BEGIN_DECLS
#define SHELL_TYPE_IDLE_MONITOR (shell_idle_monitor_get_type ())
#define SHELL_IDLE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitor))
#define SHELL_IDLE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorClass))
#define SHELL_IS_IDLE_MONITOR(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SHELL_TYPE_IDLE_MONITOR))
#define SHELL_IS_IDLE_MONITOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), SHELL_TYPE_IDLE_MONITOR))
#define SHELL_IDLE_MONITOR_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), SHELL_TYPE_IDLE_MONITOR, ShellIdleMonitorClass))
typedef struct ShellIdleMonitorPrivate ShellIdleMonitorPrivate;
typedef struct
{
GObject parent;
ShellIdleMonitorPrivate *priv;
} ShellIdleMonitor;
typedef struct
{
GObjectClass parent_class;
} ShellIdleMonitorClass;
typedef void (*ShellIdleMonitorWatchFunc) (ShellIdleMonitor *monitor,
guint id,
gboolean condition,
gpointer user_data);
GType shell_idle_monitor_get_type (void);
ShellIdleMonitor * shell_idle_monitor_get (void);
guint shell_idle_monitor_add_watch (ShellIdleMonitor *monitor,
guint interval,
ShellIdleMonitorWatchFunc callback,
gpointer user_data,
GDestroyNotify notify);
void shell_idle_monitor_remove_watch (ShellIdleMonitor *monitor,
guint id);
gint64 shell_idle_monitor_get_idletime (ShellIdleMonitor *monitor);
G_END_DECLS
#endif /* __SHELL_IDLE_MONITOR_H */

View File

@ -11,6 +11,8 @@
#define GST_USE_UNSTABLE_API #define GST_USE_UNSTABLE_API
#include <gst/gst.h> #include <gst/gst.h>
#include <gtk/gtk.h>
#include "shell-recorder-src.h" #include "shell-recorder-src.h"
#include "shell-recorder.h" #include "shell-recorder.h"
#include "shell-screen-grabber.h" #include "shell-screen-grabber.h"
@ -65,7 +67,7 @@ struct _ShellRecorder {
int framerate; int framerate;
char *pipeline_description; char *pipeline_description;
char *filename; char *file_template;
/* We might have multiple pipelines that are finishing encoding /* We might have multiple pipelines that are finishing encoding
* to go along with the current pipeline where we are recording. * to go along with the current pipeline where we are recording.
@ -90,6 +92,7 @@ struct _RecorderPipeline
GstElement *pipeline; GstElement *pipeline;
GstElement *src; GstElement *src;
int outfile; int outfile;
char *filename;
}; };
static void recorder_set_stage (ShellRecorder *recorder, static void recorder_set_stage (ShellRecorder *recorder,
@ -98,8 +101,8 @@ static void recorder_set_framerate (ShellRecorder *recorder,
int framerate); int framerate);
static void recorder_set_pipeline (ShellRecorder *recorder, static void recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
static void recorder_set_filename (ShellRecorder *recorder, static void recorder_set_file_template (ShellRecorder *recorder,
const char *filename); const char *file_template);
static void recorder_pipeline_set_caps (RecorderPipeline *pipeline); static void recorder_pipeline_set_caps (RecorderPipeline *pipeline);
static void recorder_pipeline_closed (RecorderPipeline *pipeline); static void recorder_pipeline_closed (RecorderPipeline *pipeline);
@ -109,7 +112,7 @@ enum {
PROP_STAGE, PROP_STAGE,
PROP_FRAMERATE, PROP_FRAMERATE,
PROP_PIPELINE, PROP_PIPELINE,
PROP_FILENAME PROP_FILE_TEMPLATE
}; };
G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT); G_DEFINE_TYPE(ShellRecorder, shell_recorder, G_TYPE_OBJECT);
@ -269,18 +272,6 @@ static void
shell_recorder_finalize (GObject *object) shell_recorder_finalize (GObject *object)
{ {
ShellRecorder *recorder = SHELL_RECORDER (object); ShellRecorder *recorder = SHELL_RECORDER (object);
GSList *l;
for (l = recorder->pipelines; l; l = l->next)
{
RecorderPipeline *pipeline = l->data;
/* Remove the back-reference. The pipeline will be freed
* when it finishes. (Or when the process exits, but that's
* out of our control.)
*/
pipeline->recorder = NULL;
}
if (recorder->update_memory_used_timeout) if (recorder->update_memory_used_timeout)
g_source_remove (recorder->update_memory_used_timeout); g_source_remove (recorder->update_memory_used_timeout);
@ -290,7 +281,7 @@ shell_recorder_finalize (GObject *object)
recorder_set_stage (recorder, NULL); recorder_set_stage (recorder, NULL);
recorder_set_pipeline (recorder, NULL); recorder_set_pipeline (recorder, NULL);
recorder_set_filename (recorder, NULL); recorder_set_file_template (recorder, NULL);
g_object_unref (recorder->grabber); g_object_unref (recorder->grabber);
@ -917,22 +908,22 @@ recorder_set_pipeline (ShellRecorder *recorder,
} }
static void static void
recorder_set_filename (ShellRecorder *recorder, recorder_set_file_template (ShellRecorder *recorder,
const char *filename) const char *file_template)
{ {
if (filename == recorder->filename || if (file_template == recorder->file_template ||
(filename && recorder->filename && strcmp (recorder->filename, filename) == 0)) (file_template && recorder->file_template && strcmp (recorder->file_template, file_template) == 0))
return; return;
if (recorder->current_pipeline) if (recorder->current_pipeline)
shell_recorder_close (recorder); shell_recorder_close (recorder);
if (recorder->filename) if (recorder->file_template)
g_free (recorder->filename); g_free (recorder->file_template);
recorder->filename = g_strdup (filename); recorder->file_template = g_strdup (file_template);
g_object_notify (G_OBJECT (recorder), "filename"); g_object_notify (G_OBJECT (recorder), "file-template");
} }
static void static void
@ -954,8 +945,8 @@ shell_recorder_set_property (GObject *object,
case PROP_PIPELINE: case PROP_PIPELINE:
recorder_set_pipeline (recorder, g_value_get_string (value)); recorder_set_pipeline (recorder, g_value_get_string (value));
break; break;
case PROP_FILENAME: case PROP_FILE_TEMPLATE:
recorder_set_filename (recorder, g_value_get_string (value)); recorder_set_file_template (recorder, g_value_get_string (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -982,8 +973,8 @@ shell_recorder_get_property (GObject *object,
case PROP_PIPELINE: case PROP_PIPELINE:
g_value_set_string (value, recorder->pipeline_description); g_value_set_string (value, recorder->pipeline_description);
break; break;
case PROP_FILENAME: case PROP_FILE_TEMPLATE:
g_value_set_string (value, recorder->filename); g_value_set_string (value, recorder->file_template);
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@ -1027,9 +1018,9 @@ shell_recorder_class_init (ShellRecorderClass *klass)
G_PARAM_READWRITE)); G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, g_object_class_install_property (gobject_class,
PROP_FILENAME, PROP_FILE_TEMPLATE,
g_param_spec_string ("filename", g_param_spec_string ("file-template",
"Filename", "File Template",
"The filename template to use for output files", "The filename template to use for output files",
NULL, NULL,
G_PARAM_READWRITE)); G_PARAM_READWRITE));
@ -1149,13 +1140,14 @@ get_absolute_path (char *maybe_relative)
* be opened. * be opened.
*/ */
static int static int
recorder_open_outfile (ShellRecorder *recorder) recorder_open_outfile (ShellRecorder *recorder,
char **outfilename)
{ {
const char *pattern; const char *pattern;
int flags; int flags;
int outfile = -1; int outfile = -1;
pattern = recorder->filename; pattern = recorder->file_template;
if (!pattern) if (!pattern)
return -1; return -1;
@ -1230,8 +1222,12 @@ recorder_open_outfile (ShellRecorder *recorder)
{ {
g_printerr ("Recording to %s\n", path); g_printerr ("Recording to %s\n", path);
if (outfilename != NULL)
*outfilename = path;
else
g_free (path);
g_string_free (filename, TRUE); g_string_free (filename, TRUE);
g_free (path);
goto out; goto out;
} }
@ -1269,7 +1265,8 @@ recorder_pipeline_add_sink (RecorderPipeline *pipeline)
return TRUE; return TRUE;
} }
pipeline->outfile = recorder_open_outfile (pipeline->recorder); pipeline->outfile = recorder_open_outfile (pipeline->recorder,
&pipeline->filename);
if (pipeline->outfile == -1) if (pipeline->outfile == -1)
goto out; goto out;
@ -1344,6 +1341,10 @@ recorder_pipeline_free (RecorderPipeline *pipeline)
if (pipeline->outfile != -1) if (pipeline->outfile != -1)
close (pipeline->outfile); close (pipeline->outfile);
g_free (pipeline->filename);
g_clear_object (&pipeline->recorder);
g_free (pipeline); g_free (pipeline);
} }
@ -1393,6 +1394,10 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
if (pipeline->recorder) if (pipeline->recorder)
{ {
GtkRecentManager *recent_manager;
GFile *file;
char *uri;
ShellRecorder *recorder = pipeline->recorder; ShellRecorder *recorder = pipeline->recorder;
if (pipeline == recorder->current_pipeline) if (pipeline == recorder->current_pipeline)
{ {
@ -1401,6 +1406,15 @@ recorder_pipeline_closed (RecorderPipeline *pipeline)
shell_recorder_close (recorder); shell_recorder_close (recorder);
} }
recent_manager = gtk_recent_manager_get_default ();
file = g_file_new_for_path (pipeline->filename);
uri = g_file_get_uri (file);
gtk_recent_manager_add_item (recent_manager,
uri);
g_free (uri);
g_object_unref (file);
recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline); recorder->pipelines = g_slist_remove (recorder->pipelines, pipeline);
} }
@ -1452,7 +1466,7 @@ recorder_open_pipeline (ShellRecorder *recorder)
GstBus *bus; GstBus *bus;
pipeline = g_new0(RecorderPipeline, 1); pipeline = g_new0(RecorderPipeline, 1);
pipeline->recorder = recorder; pipeline->recorder = g_object_ref (recorder);
pipeline->outfile = - 1; pipeline->outfile = - 1;
pipeline_description = recorder->pipeline_description; pipeline_description = recorder->pipeline_description;
@ -1555,10 +1569,10 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
} }
/** /**
* shell_recorder_set_filename: * shell_recorder_set_file_template:
* @recorder: the #ShellRecorder * @recorder: the #ShellRecorder
* @filename: the filename template to use for output files, * @file_template: the filename template to use for output files,
* or %NULL for the defalt value. * or %NULL for the defalt value.
* *
* Sets the filename that will be used when creating output * Sets the filename that will be used when creating output
* files. This is only used if the configured pipeline has an * files. This is only used if the configured pipeline has an
@ -1573,12 +1587,12 @@ shell_recorder_set_framerate (ShellRecorder *recorder,
* The default value is 'shell-%d%u-%c.ogg'. * The default value is 'shell-%d%u-%c.ogg'.
*/ */
void void
shell_recorder_set_filename (ShellRecorder *recorder, shell_recorder_set_file_template (ShellRecorder *recorder,
const char *filename) const char *file_template)
{ {
g_return_if_fail (SHELL_IS_RECORDER (recorder)); g_return_if_fail (SHELL_IS_RECORDER (recorder));
recorder_set_filename (recorder, filename); recorder_set_file_template (recorder, file_template);
} }
@ -1593,7 +1607,7 @@ shell_recorder_set_filename (ShellRecorder *recorder,
* should have an unconnected sink pad where the recorded * should have an unconnected sink pad where the recorded
* video is recorded. It will normally have a unconnected * video is recorded. It will normally have a unconnected
* source pad; output from that pad will be written into the * source pad; output from that pad will be written into the
* output file. (See shell_recorder_set_filename().) However * output file. (See shell_recorder_set_file_template().) However
* the pipeline can also take care of its own output - this * the pipeline can also take care of its own output - this
* might be used to send the output to an icecast server * might be used to send the output to an icecast server
* via shout2send or similar. * via shout2send or similar.

View File

@ -32,8 +32,8 @@ ShellRecorder *shell_recorder_new (ClutterStage *stage);
void shell_recorder_set_framerate (ShellRecorder *recorder, void shell_recorder_set_framerate (ShellRecorder *recorder,
int framerate); int framerate);
void shell_recorder_set_filename (ShellRecorder *recorder, void shell_recorder_set_file_template (ShellRecorder *recorder,
const char *filename); const char *file_template);
void shell_recorder_set_pipeline (ShellRecorder *recorder, void shell_recorder_set_pipeline (ShellRecorder *recorder,
const char *pipeline); const char *pipeline);
gboolean shell_recorder_record (ShellRecorder *recorder); gboolean shell_recorder_record (ShellRecorder *recorder);

View File

@ -42,6 +42,9 @@ struct _StTextureCachePrivate
/* Presently this is used to de-duplicate requests for GIcons and async URIs. */ /* Presently this is used to de-duplicate requests for GIcons and async URIs. */
GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */ GHashTable *outstanding_requests; /* char * -> AsyncTextureLoadData * */
/* File monitors to evict cache data on changes */
GHashTable *file_monitors; /* char * -> GFileMonitor * */
}; };
static void st_texture_cache_dispose (GObject *object); static void st_texture_cache_dispose (GObject *object);
@ -50,6 +53,7 @@ static void st_texture_cache_finalize (GObject *object);
enum enum
{ {
ICON_THEME_CHANGED, ICON_THEME_CHANGED,
TEXTURE_FILE_CHANGED,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -92,33 +96,14 @@ st_texture_cache_class_init (StTextureCacheClass *klass)
0, /* no default handler slot */ 0, /* no default handler slot */
NULL, NULL, NULL, NULL, NULL, NULL,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
}
/** signals[TEXTURE_FILE_CHANGED] =
* st_texture_cache_clear_uri: g_signal_new ("texture-file-changed",
* @cache: A #StTextureCache G_TYPE_FROM_CLASS (klass),
* @uri: URI of cached object G_SIGNAL_RUN_LAST,
* 0, /* no default handler slot */
* If the given @uri is known to have been modified NULL, NULL, NULL,
* externally, this function may be used to invalidate G_TYPE_NONE, 1, G_TYPE_STRING);
* the in-memory cache.
*/
void
st_texture_cache_clear_uri (StTextureCache *cache,
const char *uri)
{
char *key;
g_return_if_fail (ST_IS_TEXTURE_CACHE (cache));
g_return_if_fail (uri != NULL);
key = g_strconcat (CACHE_PREFIX_URI, uri, NULL);
g_hash_table_remove (cache->priv->keyed_cache, key);
g_free (key);
key = g_strconcat (CACHE_PREFIX_URI_FOR_CAIRO, uri, NULL);
g_hash_table_remove (cache->priv->keyed_cache, key);
g_free (key);
} }
/* Evicts all cached textures for named icons */ /* Evicts all cached textures for named icons */
@ -164,6 +149,9 @@ st_texture_cache_init (StTextureCache *self)
g_free, cogl_handle_unref); g_free, cogl_handle_unref);
self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal, self->priv->outstanding_requests = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, NULL); g_free, NULL);
self->priv->file_monitors = g_hash_table_new_full (g_str_hash, g_str_equal,
g_object_unref, g_object_unref);
} }
static void static void
@ -179,13 +167,9 @@ st_texture_cache_dispose (GObject *object)
self->priv->icon_theme = NULL; self->priv->icon_theme = NULL;
} }
if (self->priv->keyed_cache) g_clear_pointer (&self->priv->keyed_cache, g_hash_table_destroy);
g_hash_table_destroy (self->priv->keyed_cache); g_clear_pointer (&self->priv->outstanding_requests, g_hash_table_destroy);
self->priv->keyed_cache = NULL; g_clear_pointer (&self->priv->file_monitors, g_hash_table_destroy);
if (self->priv->outstanding_requests)
g_hash_table_destroy (self->priv->outstanding_requests);
self->priv->outstanding_requests = NULL;
G_OBJECT_CLASS (st_texture_cache_parent_class)->dispose (object); G_OBJECT_CLASS (st_texture_cache_parent_class)->dispose (object);
} }
@ -1039,6 +1023,52 @@ load_from_pixbuf (GdkPixbuf *pixbuf)
return CLUTTER_ACTOR (texture); return CLUTTER_ACTOR (texture);
} }
static void
file_changed_cb (GFileMonitor *monitor,
GFile *file,
GFile *other,
GFileMonitorEvent event_type,
gpointer user_data)
{
StTextureCache *cache = user_data;
char *uri, *key;
if (event_type != G_FILE_MONITOR_EVENT_CHANGED)
return;
uri = g_file_get_uri (file);
key = g_strconcat (CACHE_PREFIX_URI, uri, NULL);
g_hash_table_remove (cache->priv->keyed_cache, key);
g_free (key);
key = g_strconcat (CACHE_PREFIX_URI_FOR_CAIRO, uri, NULL);
g_hash_table_remove (cache->priv->keyed_cache, key);
g_free (key);
g_signal_emit (cache, signals[TEXTURE_FILE_CHANGED], 0, uri);
g_free (uri);
}
static void
ensure_monitor_for_uri (StTextureCache *cache,
const gchar *uri)
{
StTextureCachePrivate *priv = cache->priv;
GFile *file = g_file_new_for_uri (uri);
if (g_hash_table_lookup (priv->file_monitors, uri) == NULL)
{
GFileMonitor *monitor = g_file_monitor_file (file, G_FILE_MONITOR_NONE,
NULL, NULL);
g_signal_connect (monitor, "changed",
G_CALLBACK (file_changed_cb), cache);
g_hash_table_insert (priv->file_monitors, g_strdup (uri), monitor);
}
g_object_unref (file);
}
typedef struct { typedef struct {
gchar *path; gchar *path;
gint grid_width, grid_height; gint grid_width, grid_height;
@ -1161,41 +1191,6 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
return actor; return actor;
} }
/**
* st_texture_cache_load_icon_name:
* @cache: The texture cache instance
* @theme_node: (allow-none): a #StThemeNode
* @name: Name of a themed icon
* @size: Size of themed icon
*
* Load a themed icon into a texture. The colors used for symbolic
* icons are derived from @theme_node.
*
* Return Value: (transfer none): A new #ClutterTexture for the icon
*/
ClutterActor *
st_texture_cache_load_icon_name (StTextureCache *cache,
StThemeNode *theme_node,
const char *name,
gint size)
{
ClutterActor *texture;
GIcon *themed;
themed = g_themed_icon_new_with_default_fallbacks (name);
texture = load_gicon_with_colors (cache, themed, size,
theme_node ? st_theme_node_get_icon_colors (theme_node) : NULL);
g_object_unref (themed);
if (texture == NULL)
{
texture = (ClutterActor *) create_default_texture ();
clutter_actor_set_size (texture, size, size);
}
return texture;
}
/** /**
* st_texture_cache_load_uri_async: * st_texture_cache_load_uri_async:
* @cache: The texture cache instance * @cache: The texture cache instance
@ -1246,6 +1241,8 @@ st_texture_cache_load_uri_async (StTextureCache *cache,
load_texture_async (cache, request); load_texture_async (cache, request);
} }
ensure_monitor_for_uri (cache, uri);
return CLUTTER_ACTOR (texture); return CLUTTER_ACTOR (texture);
} }
@ -1283,6 +1280,8 @@ st_texture_cache_load_uri_sync_to_cogl_texture (StTextureCache *cache,
else else
cogl_handle_ref (texdata); cogl_handle_ref (texdata);
ensure_monitor_for_uri (cache, uri);
out: out:
g_free (key); g_free (key);
return texdata; return texdata;
@ -1322,6 +1321,8 @@ st_texture_cache_load_uri_sync_to_cairo_surface (StTextureCache *cache,
else else
cairo_surface_reference (surface); cairo_surface_reference (surface);
ensure_monitor_for_uri (cache, uri);
out: out:
g_free (key); g_free (key);
return surface; return surface;

View File

@ -68,9 +68,6 @@ GType st_texture_cache_get_type (void) G_GNUC_CONST;
StTextureCache* st_texture_cache_get_default (void); StTextureCache* st_texture_cache_get_default (void);
void st_texture_cache_clear_uri (StTextureCache *cache,
const gchar *uri);
ClutterActor * ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache, st_texture_cache_load_sliced_image (StTextureCache *cache,
const gchar *path, const gchar *path,
@ -81,11 +78,6 @@ ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
GObject *object, GObject *object,
const char *property_name); const char *property_name);
ClutterActor *st_texture_cache_load_icon_name (StTextureCache *cache,
StThemeNode *theme_node,
const char *name,
gint size);
ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache, ClutterActor *st_texture_cache_load_gicon (StTextureCache *cache,
StThemeNode *theme_node, StThemeNode *theme_node,
GIcon *icon, GIcon *icon,

View File

@ -1018,6 +1018,7 @@ _st_theme_resolve_url (StTheme *theme,
const char *base_filename = NULL; const char *base_filename = NULL;
char *dirname; char *dirname;
char *filename; char *filename;
char *canonicalized_path;
/* Handle absolute file:/ URLs */ /* Handle absolute file:/ URLs */
if (g_str_has_prefix (url, "file:") || if (g_str_has_prefix (url, "file:") ||
@ -1034,7 +1035,7 @@ _st_theme_resolve_url (StTheme *theme,
g_error_free (error); g_error_free (error);
} }
return NULL; return filename;
} }
/* Guard against http:/ URLs */ /* Guard against http:/ URLs */
@ -1050,7 +1051,19 @@ _st_theme_resolve_url (StTheme *theme,
/* Assume anything else is a relative URL, and "resolve" it /* Assume anything else is a relative URL, and "resolve" it
*/ */
if (url[0] == '/') if (url[0] == '/')
return g_strdup (url); {
canonicalized_path = realpath (url, NULL);
if (g_mem_is_system_malloc ())
{
filename = canonicalized_path;
}
else
{
filename = g_strdup (canonicalized_path);
free (canonicalized_path);
}
return filename;
}
base_filename = g_hash_table_lookup (theme->filenames_by_stylesheet, base_stylesheet); base_filename = g_hash_table_lookup (theme->filenames_by_stylesheet, base_stylesheet);
@ -1062,7 +1075,19 @@ _st_theme_resolve_url (StTheme *theme,
dirname = g_path_get_dirname (base_filename); dirname = g_path_get_dirname (base_filename);
filename = g_build_filename (dirname, url, NULL); filename = g_build_filename (dirname, url, NULL);
canonicalized_path = realpath (filename, NULL);
g_free (dirname); g_free (dirname);
g_free (filename);
if (g_mem_is_system_malloc ())
{
filename = canonicalized_path;
}
else
{
filename = g_strdup (canonicalized_path);
free (canonicalized_path);
}
return filename; return filename;
} }

View File

@ -269,6 +269,39 @@ st_widget_remove_transition (StWidget *widget)
} }
} }
static void
st_widget_texture_cache_changed (StTextureCache *cache,
const char *uri,
gpointer user_data)
{
StWidget *actor = ST_WIDGET (user_data);
StThemeNode *node = actor->priv->theme_node;
StBorderImage *border_image;
char *path;
gboolean changed;
if (node == NULL)
return;
path = g_filename_from_uri (uri, NULL, NULL);
changed = g_strcmp0 (st_theme_node_get_background_image (node), path) == 0;
border_image = st_theme_node_get_border_image (node);
if (!changed && border_image)
changed = strcmp (st_border_image_get_filename (border_image), path) == 0;
g_free (path);
if (!changed)
return;
st_theme_node_invalidate_paint_state (node);
if (CLUTTER_ACTOR_IS_MAPPED (CLUTTER_ACTOR (actor)))
clutter_actor_queue_redraw (CLUTTER_ACTOR (actor));
}
static void static void
st_widget_dispose (GObject *gobject) st_widget_dispose (GObject *gobject)
{ {
@ -302,6 +335,10 @@ st_widget_dispose (GObject *gobject)
priv->label_actor = NULL; priv->label_actor = NULL;
} }
g_signal_handlers_disconnect_by_func (st_texture_cache_get_default (),
st_widget_texture_cache_changed,
actor);
g_clear_object (&priv->prev_first_child); g_clear_object (&priv->prev_first_child);
g_clear_object (&priv->prev_last_child); g_clear_object (&priv->prev_last_child);
@ -1470,6 +1507,8 @@ st_widget_init (StWidget *actor)
g_signal_connect (actor, "notify::first-child", G_CALLBACK (st_widget_first_child_notify), NULL); g_signal_connect (actor, "notify::first-child", G_CALLBACK (st_widget_first_child_notify), NULL);
g_signal_connect (actor, "notify::last-child", G_CALLBACK (st_widget_last_child_notify), NULL); g_signal_connect (actor, "notify::last-child", G_CALLBACK (st_widget_last_child_notify), NULL);
g_signal_connect (st_texture_cache_get_default (), "texture-file-changed",
G_CALLBACK (st_widget_texture_cache_changed), actor);
} }
static void static void
@ -2760,38 +2799,3 @@ st_widget_get_focus_chain (StWidget *widget)
{ {
return ST_WIDGET_GET_CLASS (widget)->get_focus_chain (widget); return ST_WIDGET_GET_CLASS (widget)->get_focus_chain (widget);
} }
/**
* st_widget_clear_background_image:
* @widget: An #StWidget
*
* Force a reload of the background-image property. Usually properties
* are cached heavily to avoid unnecessary work on paint, this method
* will force the cache to be recreated.
*/
void
st_widget_clear_background_image (StWidget *actor)
{
GFile *file;
const char *path;
char *uri;
if (actor->priv->theme_node == NULL)
return;
path = st_theme_node_get_background_image (actor->priv->theme_node);
if (path == NULL)
return;
file = g_file_new_for_path (path);
uri = g_file_get_uri (file);
st_texture_cache_clear_uri (st_texture_cache_get_default (), uri);
st_theme_node_invalidate_paint_state (actor->priv->theme_node);
if (CLUTTER_ACTOR_IS_MAPPED (CLUTTER_ACTOR (actor)))
clutter_actor_queue_redraw (CLUTTER_ACTOR (actor));
g_object_unref (file);
g_free (uri);
}

View File

@ -142,8 +142,6 @@ ClutterActor * st_widget_get_label_actor (StWidget *widg
void st_widget_set_label_actor (StWidget *widget, void st_widget_set_label_actor (StWidget *widget,
ClutterActor *label); ClutterActor *label);
void st_widget_clear_background_image (StWidget *widget);
/* Only to be used by sub-classes of StWidget */ /* Only to be used by sub-classes of StWidget */
void st_widget_style_changed (StWidget *widget); void st_widget_style_changed (StWidget *widget);
StThemeNode * st_widget_get_theme_node (StWidget *widget); StThemeNode * st_widget_get_theme_node (StWidget *widget);

View File

@ -3,6 +3,7 @@
#define GST_USE_UNSTABLE_API #define GST_USE_UNSTABLE_API
#include "shell-recorder.h" #include "shell-recorder.h"
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <gtk/gtk.h>
#include <gst/gst.h> #include <gst/gst.h>
/* Very simple test of the ShellRecorder class; shows some text strings /* Very simple test of the ShellRecorder class; shows some text strings
@ -11,23 +12,34 @@
static ShellRecorder *recorder = NULL; static ShellRecorder *recorder = NULL;
static gboolean static gboolean
stop_recording_timeout (gpointer data) stop_recording_timeout (ClutterActor *stage)
{ {
if (recorder) if (recorder)
{ {
shell_recorder_close (recorder); shell_recorder_close (recorder);
/* quit when the recorder finishes closing
*/
g_object_weak_ref (G_OBJECT (recorder),
(GWeakNotify)
clutter_actor_destroy,
stage);
g_object_unref (recorder); g_object_unref (recorder);
} }
else
clutter_main_quit (); {
clutter_actor_destroy (stage);
}
return FALSE; return FALSE;
} }
static void static void
on_animation_completed (ClutterAnimation *animation) on_animation_completed (ClutterAnimation *animation,
ClutterStage *stage)
{ {
g_timeout_add (1000, stop_recording_timeout, NULL); g_timeout_add (1000, (GSourceFunc) stop_recording_timeout, stage);
} }
static void static void
@ -35,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
gpointer data) gpointer data)
{ {
recorder = shell_recorder_new (CLUTTER_STAGE (stage)); recorder = shell_recorder_new (CLUTTER_STAGE (stage));
shell_recorder_set_filename (recorder, "test-recorder.ogg"); shell_recorder_set_file_template (recorder, "test-recorder.ogg");
shell_recorder_record (recorder); shell_recorder_record (recorder);
} }
@ -46,6 +58,7 @@ int main (int argc, char **argv)
ClutterAnimation *animation; ClutterAnimation *animation;
ClutterColor red, green, blue; ClutterColor red, green, blue;
gtk_init (&argc, &argv);
gst_init (&argc, &argv); gst_init (&argc, &argv);
if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS) if (clutter_init (&argc, &argv) != CLUTTER_INIT_SUCCESS)
return 1; return 1;
@ -69,7 +82,7 @@ int main (int argc, char **argv)
"y", 240.0, "y", 240.0,
NULL); NULL);
g_signal_connect (animation, "completed", g_signal_connect (animation, "completed",
G_CALLBACK (on_animation_completed), NULL); G_CALLBACK (on_animation_completed), stage);
text = g_object_new (CLUTTER_TYPE_TEXT, text = g_object_new (CLUTTER_TYPE_TEXT,
"text", "Blue", "text", "Blue",
@ -110,7 +123,5 @@ int main (int argc, char **argv)
clutter_main (); clutter_main ();
g_object_unref (stage);
return 0; return 0;
} }

34
tests/interactive/test-title.js Executable file
View File

@ -0,0 +1,34 @@
#!/usr/bin/env gjs
const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop;
function nextTitle() {
let length = Math.random() * 20;
let str = '';
for (let i = 0; i < length; i++) {
// 97 == 'a'
str += String.fromCharCode(97 + Math.random() * 26);
}
return str;
}
function main() {
Gtk.init(null);
let win = new Gtk.Window({ title: nextTitle() });
win.connect('destroy', Gtk.main_quit);
win.present();
Mainloop.timeout_add(5000, function() {
win.title = nextTitle();
return true;
});
Gtk.main();
}
main();