Compare commits

..

148 Commits

Author SHA1 Message Date
ca09595350 Bump version to 2.91.4 2010-12-22 18:44:11 -05:00
b1dc2d967e Bump GTK+ minimum version to 2.91.7
Needed for new gdk_x11_window_* functions.
2010-12-22 16:38:17 -05:00
c546ad9720 Fix for gdk/x11 changes
Handle the move of gdk_window_lookup() and gdk_window_foreign_new()
into the gdk_x11_ namespace.
2010-12-22 16:26:08 -05:00
53f53c5a91 TelepathyClient: make chat notifications resident
This ensures that chat notifications don't get removed from
the message tray when clicked.

https://bugzilla.gnome.org/show_bug.cgi?id=637810
2010-12-22 15:27:46 -05:00
d2f675e41c Remove check for GTK+-3.0 compiled Mutter
Mutter no longer optionally builds with GTK+-2.0, so we don't
need to check for it. And the specific form of the check broke
with recent changes to the naming of libraries for GTK+.
2010-12-22 14:37:03 -05:00
d66370aecb gnome-shell.modules: Build vala 0.11.2
Now required by dconf
2010-12-22 13:49:36 -05:00
1694148bdb popupMenu: don't animate menus when switching from one to another
Don't do the "slide" effect when moving from one menu to another; only
do it when opening the first menu, or closing a menu without opening
another one.

https://bugzilla.gnome.org/show_bug.cgi?id=634755
2010-12-21 17:11:38 -05:00
7d0eeef90a panel: fix up calendar-vs-menu handling on clock
Give the clock's right-click menu its own PopupMenuManager so that if
you drop down another menu and then mouseover the clock it doesn't
pop up the right-click menu.

https://bugzilla.gnome.org/show_bug.cgi?id=634755
2010-12-21 17:10:36 -05:00
23f3af832c StIcon: fix typo
After having freed pending_texture, we should nullify it, not an
unrelated actor.
2010-12-21 22:54:27 +01:00
52a87a22ec appDisplay: Add translator comment for "All" filter
The correct translation for "All" depends on context in some
languages, so add a translator comment.

https://bugzilla.gnome.org/show_bug.cgi?id=637559
2010-12-21 20:10:16 +01:00
ea63f7562f Updated Hebrew translation. 2010-12-21 12:59:40 +02:00
d3de4e3fbd ctrlAltTabManager: implement Ctrl-Alt-Tab
Add CtrlAltTabManager, which allows tabbing between StFocusManager
groups, and fix up the panel to be keyboard navigable.

https://bugzilla.gnome.org/show_bug.cgi?id=618885
2010-12-20 17:43:01 -05:00
f326595202 popupMenu: fix up grab/ungrab handling
Fix the panel menus to avoid unnecessarily bouncing out of modal (bug
634194) and to do a better job of keeping the keyboard focus in the
right place

https://bugzilla.gnome.org/show_bug.cgi?id=618885
2010-12-20 17:43:00 -05:00
4dd4c9f99f Use more actor.grab_key_focus() and less stage.connect('key-press-event')
Until recently, the clutter keyboard focus was almost always kept on
the stage, and bits of code that wanted to do stuff with the keyboard
would just watch for key-press-events on the stage. In several places,
the code wasn't even bothering to ensure that the focus was on the
stage, which caused problems with other actors that explicitly grabbed
focus.

A previous fix for this (f21403fd) was to always reset the focus to
the stage after calling pushModal(), but a better fix is to just
actually make use of the keyboard focus everywhere rather than having
everyone try to read events off the stage.

Now pushModal(actor) also does actor.grab_key_focus(), and various
bits of code have been changed to read key events off their own
toplevels rather than off the stage, meaning there's no chance of them
accidentally getting someone else's events.

https://bugzilla.gnome.org/show_bug.cgi?id=618885
2010-12-20 17:32:07 -05:00
69bed929af l10n: Updated Italian translation 2010-12-20 22:55:45 +01:00
db457db060 BluetoothStatus: s/Ok/OK in user visible button 2010-12-20 22:07:28 +01:00
12c113a7a7 l10n: add missing bluetooth.js to POTFILES.in 2010-12-20 21:41:21 +01:00
be96cb9291 Make gnome-shell-clock-preferences work again
Thanks Owen and Colin for debugging this:

<davidz> does anyone have a clue about this cryptic error message: http://fpaste.org/aWgh/ ?
<owen> davidz: well, I'd guess some sort of syntax error...
<walters> hmm
 possibly but unlikely fallout from my js versioning
<owen> oh, it's happening here too
 walters: exactly
 Adding --js-version=1.8 to the wrapper script fixes
 walters: I thought you were defaulting to allowing extensions?
<walters> actually, let's do that now anyways

Signed-off-by: David Zeuthen <davidz@redhat.com>
2010-12-20 15:07:10 -05:00
bfc7b98e1d PopupMenu: restore the arrow when fast closing the menu
When closing a submenu because the parent is closing, we skip the
animation, but we need to restore the arrow anyway.
2010-12-20 18:16:59 +01:00
054f498201 BluetoothStatus: hide the additional separator if no devices are shown
Sometimes devices are reported by BluetoothApplet, but are not shown,
so we should not count them to decide whether to show the device
separator.
2010-12-20 17:58:12 +01:00
6024b87d27 PopupMenu: handle submenus inline
Instead of showing submenus on the left side, make PopupSubMenuMenuItem
act like an expander. The sub menu is toggled on click, opened on
right/enter/space on the parent item, closed on left on any item
or when closing the parent menu.

https://bugzilla.gnome.org/show_bug.cgi?id=633476
2010-12-20 17:46:31 +01:00
59b1aa26bb [l10n] Updated Estonian translation 2010-12-20 14:30:54 +02:00
f96bc5c052 Updated Spanish translation 2010-12-19 13:14:51 +01:00
67c05e07b1 Updated Hebrew translation. 2010-12-19 01:04:51 +02:00
dafaab66b1 iconGrid: Exclude hidden children from the layout
As all children were considered for the grid's layout, hidden items showed up as
empty space. Instead, exclude hidden children from the layout, so that the grid is
only made up of visible items.

https://bugzilla.gnome.org/show_bug.cgi?id=631537
2010-12-18 22:23:38 +03:00
4fd24da4e4 app-display: Implement filtering applications by category
Add a list of filters to the application view of the view selector, as in the latest mockups

https://bugzilla.gnome.org/show_bug.cgi?id=631537
2010-12-18 22:23:33 +03:00
bdfc516715 StTextureCache: Plug leaks in tiled image loading
We weren't freeing the whole pixbuf, nor were we the GList of
subpixbufs.  Plug both of these leaks in the error handling path
and in the default case.

All of the unreffing/cleanup should happen in the GDestroyNotify
for the result, not some in the handler.

https://bugzilla.gnome.org/show_bug.cgi?id=636489
2010-12-18 13:44:37 -05:00
94da2531e7 configure: Fix case if HAVE_BLUETOOTH is false
We still need to AC_SUBST here.
2010-12-18 13:39:07 -05:00
9e99a8c25a Bluetooth status indicator
Introduce the new Bluetooth indicator in the System Status area. It
is written in JS with St and uses the new GnomeBluetoothApplet library.

https://bugzilla.gnome.org/show_bug.cgi?id=618312
2010-12-18 19:10:15 +01:00
bc83890c39 Updated Spanish translation 2010-12-18 14:37:27 +01:00
2d55eab62e Remove 'What's using power...' menu option
The dialog brought up by the "what's using power.." option is currently
more confusing than useful to the user. n

https://bugzilla.gnome.org/show_bug.cgi?id=636982
2010-12-17 14:18:28 -05:00
d66207bc68 Updated Norwegian bokmål translation 2010-12-17 14:19:35 +01:00
9f39ce5d27 Explicitly specify JS version
See bug 636652 for rationale.

https://bugzilla.gnome.org/show_bug.cgi?id=636983
2010-12-16 17:40:17 -05:00
eef194c3aa shell-info: Use transient notifications
According to the designers, system notifications should be transient;
so now that transient notifications are supported properly, make use
of it instead of using a timeout to remove the associated source.
2010-12-16 22:55:11 +01:00
22f4aabadf NotificationDaemon: add support for transient notifications
Transient notifications are removed after being shown. If the summary
is being shown while they appear, they are represented in it by a new
source icon.

We always create a new source for new transient notifications to
ensure that they don't replace the latest persistent notification
associated with the source. Because we generally don't want any
new or resident notifications to be replaced by others, associating
multiple notifications with a source is the next thing we will
implement.

https://bugzilla.gnome.org/show_bug.cgi?id=633412
2010-12-16 15:50:29 -05:00
2a19d5f143 NotificationDaemon: add support for resident notifications
Resident notifications don't get removed when they are clicked or
one of their actions is invoked, and are only removed when the app
that created them requests them to be removed or sends another
notification.

Remove the source when a notification associated with it is removed.
Except if the source is a tray icon.

Make sure that we pop down the tray when a notification is clicked
or one of the actions of a non-resident notification is selected.

Based on the initial patch by Jonathan Matthew.

https://bugzilla.gnome.org/show_bug.cgi?id=633412
2010-12-16 15:49:47 -05:00
7279cc1db8 Overview: Remove invisible animations
Given that the grid view is gone there is no point in animating the
window previews on all workspaces anymore so just do it for the current
one avoid taking a slow down caused by animating windows on other workspaces.

https://bugzilla.gnome.org/show_bug.cgi?id=637353
2010-12-16 20:24:08 +01:00
e41b0bc16d Remove unused workspace._visible property 2010-12-16 20:23:45 +01:00
e3aab2a90f tests: Fix scrolling in border.js and border-radius.js
In both tests the scrolled actor's width was fixed to the stage
width, so that the scroll bars ended up outside the visible area.

Fix by adding an outer container with a fixed width and expanding
the scroll view to fill the available area.
2010-12-16 18:09:03 +01:00
7eec8a899a popupMenu: Improve menu item layout
Mixing submenu menuitems and toggle menuitems results in poor layout.
The fix is to right-align the submenu arrows. Since we already need to
right-align the battery percentages as well, add alignment support to
PopupBaseMenuItem.addActor(), and update stuff for that.

Also remove the "column" param from addActor() since it hadn't
actually been implemented correctly before.

https://bugzilla.gnome.org/show_bug.cgi?id=633476
2010-12-16 09:01:24 -05:00
3262b63325 overview: mark Windows and Application as translatable 2010-12-16 00:30:21 +01:00
be59876c60 Updated Spanish translation 2010-12-15 21:59:37 +01:00
26f395bb84 [l10n] force no-c-format for "sent at ..." message
"Sent at %X on %A" was incorrectly marked as c-format in PO files;
forcing the no-c-format to allow custom format in translations.
2010-12-13 23:12:51 +01:00
7653cf6ad0 Updated Hebrew translation. 2010-12-13 23:52:06 +02:00
3203dc549c Updated Italian translation 2010-12-13 22:40:28 +01:00
4ae9c978ce Add missing telepathyClient.js to POTFILES.in 2010-12-13 21:47:28 +01:00
cb5c18c783 st-theme-node: Support non-uniform border widths
While non-uniform border widths were parsed correctly, an arbitrary
side's width was picked when painting, so that each border ended up
with the same width and the widths specified in CSS were ignored.

At least for sides between non-rounded corners, using a different
border width can be reasonable, for instance at screen edges.

Different border widths around rounded corners are kind of crack,
but then it would be lame not to support it ...

https://bugzilla.gnome.org/show_bug.cgi?id=607500
2010-12-13 18:15:00 +01:00
cb2babb1a0 st-theme-node: Improve borders with gradient backgrounds
For gradient backgrounds, borders were implemented by filling the
background shape with the border color first, and then scaling down
the path to draw the background.

The result is not correct[0], which is especially visible if the border
width is greater than the border radius - so instead of scaling down
the original path, use a separate path for the background.

The result is consistent with the borders we draw for non-gradient
backgrounds, and much closer to the correct standard behavior.

[0] http://www.w3.org/TR/css3-background/#the-border-radius

https://bugzilla.gnome.org/show_bug.cgi?id=607500
2010-12-13 18:15:00 +01:00
c648a5f117 StThemeNode: handle url() in inline styles better
non-absolute paths specified as url()'s in
stylesheets are resolved to be relative to the location
of the stylesheets they are in.

Inline styles don't have physical styleshseets sitting on disk,
which leads to a crash in the url resolving code.

This commit ensures that we don't try to use the stylesheet associated
with a url, if there isn't one to use.

This commit doesn't try to handle relative paths in inline styles.
It only prevents crashes when absolute paths are used.

https://bugzilla.gnome.org/show_bug.cgi?id=636975
2010-12-13 11:48:36 -05:00
e562c863f7 Update Simplified Chinese translation. 2010-12-12 15:45:36 +08:00
cdaf8f3d19 Updated Slovenian translation 2010-12-11 20:41:16 +01:00
a33aab07e6 Updated Spanish translation 2010-12-11 16:45:05 +01:00
26a5197d33 Updated Galician translations 2010-12-10 23:30:32 +01:00
8be2800486 ShellGlobal: Remove root_pixmap left-over
Still had a few references to the root_pixmap actor that was removed
when we switched to using the root actor support in Mutter.
2010-12-09 19:14:26 -05:00
a2528a7a98 StIcon: fill the structure corretly in _init
GSlice already fills with zeros when allocating, but we need to
set the shadow_material field appropriately.

https://bugzilla.gnome.org/show_bug.cgi?id=634814
2010-12-09 22:27:32 +01:00
2332e2b0c5 StIcon: remove implementation of ::map and ::unmap
They're not needed since Clutter 1.5.8, which internally
keeps a list of children, used by the default implementations of
::map and ::unmap.

https://bugzilla.gnome.org/show_bug.cgi?id=634814
2010-12-09 22:27:11 +01:00
a70f1f449b StIcon: don't show the icon until fully loaded
When updating the texture, keep the old one until the new one is
loaded.

https://bugzilla.gnome.org/show_bug.cgi?id=634814
2010-12-09 17:59:28 +01:00
e425a183f7 gdm: pull async fix from upstream
This prevents a race at start up that could prevent the user
from getting loaded properly.

In the near future we need to drop the gdm user code entirely
and switch to using the accountsservice library.
2010-12-07 14:31:35 -05:00
0bbeb733a2 Updated Brazilian Portuguese translation 2010-12-07 09:01:21 -02:00
ff77994204 Add missing deps for st-enum-types.h
st-enum-types.h needs to be regenerated when the St header files
change.
2010-12-06 17:33:33 -05:00
563951b789 Updated Norwegian bokmål translation 2010-12-06 19:06:24 +01:00
ea65f5e795 Updated Hebrew translation. 2010-12-05 01:42:58 +02:00
670048e555 StScrollView: Remove default shadow style
Remove the default shadow style but still allow StScrollView users to use a shadow by explicitly setting it.

https://bugzilla.gnome.org/show_bug.cgi?id=635647
2010-12-04 12:16:58 +01:00
35b5cb9860 magnifier: Fix DND when the magnifier is active
Hide the zoom regions from pick so that they do not interfere with
the picking done by DND in search for _delegate objects.

https://bugzilla.gnome.org/show_bug.cgi?id=634560
2010-12-03 20:38:25 +01:00
978cf9d3ab Fix redundant calls to global.get_pointer()
Since we are keeping a current pointer position anyways, we
don't have to continually call global.get_pointer() which is
a round trip to the magnifier; make ZoomRegion simply fetch
a current position stored in the Magnifier object.

https://bugzilla.gnome.org/show_bug.cgi?id=633553
2010-12-03 14:21:57 -05:00
96fb6d8f16 Improve the algorithm for proportional mouse tracking
Change the proportional algorithm so stop moving the zoom region
when cursor is in a "padding region" at the edge of the screen.
(The padding region is a 10th of the screen at 2x zoom, and smaller
for higher zooms.)

Based on earlier versions from Jon McCann and Florian Muellner.

https://bugzilla.gnome.org/show_bug.cgi?id=629950
2010-12-03 14:21:57 -05:00
c5c66ceb98 Refactor Magnifier.ZoomRegion to avoid permanent Clutter.Clone
This basic point of this change is to avoid always creating a
hidden Clutter.Clone actor for the default present-but-not-active
zoom region. The position of the viewport and region of interest
are now stored in member variables, and the actors are only created
and updated when the region is active.

Other significant changes:

 * Unused public functions are removed or made private
 * The mouse tracking position is immediately  updated when options
   like the zoom are changed, not just on the next mouse motion.
 * ZoomRegion.setROI() now updates the zoom, not just the position;
   a FIXME is added to the D-Bus interface for a place where the
   D-Bus interface contains duplicate possibly conflicting information
 * Lens-mode is now only effectively off when the magnifier is
   fullscreen, instead of actually modifying the member variable;
   this makes things work properly when changing out of full-screen
   mode.
 * When the clamping to screen edges is turned on, we now immediately
   clamp.
 * The handling of setting the position to fullscreen as compared
   to just setting the viewport to fullscreen is untangled.

https://bugzilla.gnome.org/show_bug.cgi?id=633582
2010-12-03 14:21:57 -05:00
1efb0213c5 window-manager: Swap workspace order for RTL locales
Workspaces should be aligned from right to left in RTL locales, so
take the text direction into account when switching workspaces.

https://bugzilla.gnome.org/show_bug.cgi?id=634691
2010-12-03 18:25:49 +01:00
1a466cfce4 gnome-shell.modules: add libcanberra as a dependency of Mutter
libcanberra is an (optional) dependency of Mutter; since we have
it in the moduleset we need to mark the dependency so things get
built in the right order.
2010-12-03 11:14:29 -05:00
46ba718ab2 LookingGlass: Use GSettings for monospace-font-name
Convert code to look up and watch the configured monospace font
to use GSettings instead of GConf.

https://bugzilla.gnome.org/show_bug.cgi?id=636155
2010-12-03 11:14:29 -05:00
b40cc2c294 statusMenu: Force the overview mode of the settings
When launching gnome-control-center, request it to show
the overview rather than just presenting the current window.

https://bugzilla.gnome.org/show_bug.cgi?id=636317
2010-12-03 14:43:56 +00:00
c86da9afbd Updated Tamil translation 2010-12-03 18:45:22 +05:30
d00933f044 adding fa to LINGUAS 2010-12-03 13:46:34 +03:30
172f78daad Updating Persian Translation 2010-12-03 13:45:51 +03:30
d7cc82909a a11y-status: Use single quotes for non-translatable strings
Fix the usage of single vs double quotes according to our coding
conventions.
2010-12-03 00:20:16 +01:00
7ce65e421b Fix compilation against latest GTK+-3 changes
GDK_WINDOW_XWINDOW has been removed. All calls should use
gdk_x11_window_get_xid() instead.
2010-12-02 17:12:07 -06:00
0c8941715d Rename side-by-side tiling key
It's now called edge_tiling since it can do more than
just side-by-side tiling.

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 17:19:25 -05:00
5ba9bb7a67 Updated Spanish translation 2010-12-02 19:09:57 +01:00
7b73df78c6 Fix display of remaining time
When there is less than an hour remaining, there was a format() call missing
which made the power status menu display "%d minutes remaining".

https://bugzilla.gnome.org/show_bug.cgi?id=635728
2010-12-01 18:50:16 -05:00
43d479c786 Don't pass an (out) argument to meta_window_get_outer_rect()
Mutter now has the needed (out) annotation, so we have to use the
return value instead of passing a reference to a rectangle.
2010-12-01 22:43:02 +01:00
b9eca84d34 telepathyClient: Implement Sent signals.
This will allow us to update our notifications when
someone uses a different Telepathy client to send
messages.

https://bugzilla.gnome.org/show_bug.cgi?id=635991
2010-12-01 13:46:07 -05:00
aef005f451 PowerStatus: show separate hour and minutes for primary device
Show "%d hours %d minutes" instead of "%d minutes", for better
readability.

https://bugzilla.gnome.org/show_bug.cgi?id=635728
2010-12-01 19:12:11 +01:00
24669e3ba7 a11y-status: Use GSettings to access the magnifier
The magnifier should be enabled/disabled via the appropriate
GSettings key - otherwise the setting gets out of sync with the
actual state of the magnifier.

https://bugzilla.gnome.org/show_bug.cgi?id=636151
2010-12-01 14:26:16 +01:00
e99eefbb00 update for Punjabi by A S Alam 2010-12-01 08:24:25 +05:30
08b84b1449 app-display: Popup menus to the left in RTL locales
The popup menus of application icons in both the dash and the app view
are positioned on the right of the icon. In the case of the dash this
results in the menu being displayed off-screen in RTL locales, so move it
to the opposite side instead.

https://bugzilla.gnome.org/show_bug.cgi?id=635645
2010-12-01 00:02:16 +01:00
7c980f42c9 message-tray: Fix typo
At one place, we set State.SHOWNING instead of State.SHOWING.

Thanks to Jasper St. Pierre for spotting this.
2010-11-30 17:56:59 +01:00
42366e4be4 overview: Use a symbolic icon for notifications
Notifications from the system should use symbolic icons.

Also fix up the summary area CSS so the icon gets the right colors.

https://bugzilla.gnome.org/show_bug.cgi?id=636137
2010-11-30 11:26:30 -05:00
991a0c642b PowerStatus: make the primary device activatable
If the primary device is not virtual, make it open
gnome-power-statistics on activate.

https://bugzilla.gnome.org/show_bug.cgi?id=635880
2010-11-30 15:49:09 +01:00
6aac51a2a7 popupMenu: give sliders a minimum width
The simpler volume menu resulted in a slider that was too short. Fix
that.

https://bugzilla.gnome.org/show_bug.cgi?id=635393
2010-11-30 07:16:36 -05:00
6adc12368c boxpointer: don't draw the arrow overlapping the corners
In some circumstances, a boxpointer would draw itself with the arrow
partially overlapping the rounded corner, causing things to not line
up correctly. Don't do that.

And while we're at it, don't draw the pointer very very close to the
corner either, since it looks odd if the corner flows directly into
the arrow.

https://bugzilla.gnome.org/show_bug.cgi?id=635393
2010-11-30 07:14:20 -05:00
eb2ee3f259 Bump version to 2.91.3 2010-11-29 17:58:04 -05:00
8b5cd4ef0f calendar: Take week start and month/year ordering from GTK+-3
Despite of switching to GTK+-3 unconditionally, those settings were
still taken from GTK+-2.
2010-11-29 22:47:14 +01:00
4517f60630 environment: Get text direction from GTK+-3
Despite of switching to GTK+-3 unconditionally, the default text
direction was still taken from GTK+-2.
2010-11-29 22:00:37 +01:00
b25bad9995 notificationDaemon: fix escaping in xchat rewrite rules
https://bugzilla.gnome.org/show_bug.cgi?id=635712
2010-11-29 14:31:20 -05:00
c9b178b193 Touch up padding again this time with the correct box 2010-11-29 14:03:07 -05:00
6b0fe1b0b0 Add padding on the left of the notification scrollbar
It looks better that way.

https://bugzilla.gnome.org/show_bug.cgi?id=630752
2010-11-29 13:29:57 -05:00
c908a060b8 Touch up the spacing and style of the app view
Adds more padding between app icons, left aligns the view,
removes the ugly separator, adds some margin on the right.
2010-11-29 13:16:20 -05:00
063fc8e29c Updated Galician translations 2010-11-29 17:33:20 +01:00
d870fef122 StBoxLayout: report correct paint volume when scrolled
When scrolled, st_box_layout_apply_transform() includes the scroll
offset and affects paint volumes. This is right for our children, but
our paint volume is determined by our allocation and borders and
doesn't scroll, so we need to reverse-compensate, the same as we do
when painting.

https://bugzilla.gnome.org/show_bug.cgi?id=630932
2010-11-29 11:23:47 -05:00
6b723ed72a StImText: add get_paint_volume()
Since StImText isn't a StWidget, it needs it's own implementation
of get_paint_volume() to enable clipped redraws.

https://bugzilla.gnome.org/show_bug.cgi?id=630932
2010-11-29 11:23:47 -05:00
56fb7e2c58 St: Take advantage of clipped redraws
In order to take advantage of clipped redraws (only redraw the
parts that actually changed), we have to inform clutter about
our paint_volume by implementing the get_paint_volume virtual
method.

As this feature had been added in in clutter 1.5.x we now require
that.

https://bugzilla.gnome.org/show_bug.cgi?id=630932
2010-11-29 11:23:47 -05:00
41a5282b7e gnome-shell.css: don't override the chat-response entry's height
We were forcing the chat-response entry to have too small a height,
making underscores not show up. We're already setting the font size,
so we should just let the entry request the height it needs based on
that.

https://bugzilla.gnome.org/show_bug.cgi?id=635471
2010-11-29 11:13:15 -05:00
6f9ede569e workspace-indicators: Add hover indication
Scale up indicators on hover to hint at their clickability.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:54 +01:00
e2e11b1a29 overview: Update animation
Update the animation on entering/leaving the overview to only zoom
the window previews and fade other elements.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:54 +01:00
b59daac6f3 dash: Improve DND to dash and allow reordering
Show a positional indicator where a new favorite will be added and
make the favorites re-orderable. Also allow the removal of favorites
using drag-and-drop according to the mockups.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:54 +01:00
5fef9188c9 workspaces: Change handling of window-drag signals
Delegate the emission of the window-drag-begin/window-drag-end
signals to overview functions, as done already for other items.
This will enable objects to react to those signals without having
access to the workspace objects / the workspaces view.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:54 +01:00
2c5d825c87 search-display: Change the default display to use iconGrid
Current mockups display all search results as icons as used by
application results, so change the default result display to use
iconGrid/BaseIcon. Remove the custom application results display,
as it is no longer needed.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
d5d7d8a391 overview: Add ViewSelector to the overview
Add the view selector and adjust the positioning of elements in the
overview. Unlike the old dash, the view selector is made public to
indicate that extensions may add additional views or search providers.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
7811632e6f workspaces: Rework workspace controls for the view selector
As workspaces will appear as a particular view in the view selector,
merge WorkspacesControls and WorkspacesManager to control workspaces
and related controls, so that a single actor can be added to the
selector instead of positioning the elements from the overview.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
6c5c3bedbe workspaces-view: Swap workspace ordering for RTL locales
Make the first workspace the right-most one in RTL locales, as one
would expect. Update all dragging/scrolling functions to behave
correctly.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
0942f50781 workspaces-view: Remove MosaicView
The new layout does no longer support view switching, so merge
GenericWorkspacesView and SingleView, and remove MosaicView.
Also rename or remove workspace properties and functions which
are now unused.
The grid will have a comeback with the new DND behavior.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
1eb6dfe1b8 app-display: Slight cleanup and style update
Being no longer an independent menu pane, both the toggle() and
close() functions are no longer needed, and the view's structure
can be simplified a bit.

Also update the style to fit into the view selector.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
1a77acfda6 Fake workspaces tab
https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
ffd7eaede5 view-selector: Add keyboard shortcut for view switching
As the view selector is a tabbed interface, use the default keyboard
shortcut of Ctrl-PageUp/PageDown of GtkNotebook for switching between
views.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
688a315cbf view-selector: Move search logic into SearchTab
The view selector should only deal with view switching, so move the
logic to deal with search (find-as-you-type, cancelling a search,
navigating/activating results) into the SearchTab.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
48fff0e96b Use the old dash code to implement the view selector
The view selector is a tabbed interface with a search entry. Starting
a search switches focus to the results' tab, ending a search moves the
focus back to the previously selected tab. Activating a normal tab
while a search is active cancels the search.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
e6bb06a7cc search-display: Move SearchResults to a separate file
With the new layout, search results will be displayed in an independent
view like window previews, applications and possible future additions;
it does not make much sense keeping it with the switching logic, so move
the code to its own file.

Also remove the dash-prefix from the relevant style classes.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
26225f0bfb dash: Move padding into the icon for Fittsability
With this change, the icons' reactive area extends to the screen
edge, making them good targets according to Fitts' law.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
3e4f744e56 dash: Reimplement the dash based on AppWell code
The new dash implementation is a single-column vertical sidebar,
whose items are scaled dynamically to fit the available height.
If the height is still exceeded after scaling down to a minimum
item size, excess items are cut off.
The now unused old dash implementation is renamed to OldDash, as
its code will be used as a base for the new view selector element.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:47 +01:00
2d2ac5b3f6 linear-view: Remove NewWorkspaceArea
As the button to add workspaces will move to the same position as
the new workspace drop area in drag mode, the latter is redundant
and can be removed.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 02:25:15 +01:00
e06b608b10 linear-view: Remove shadows when zoomed out
Overlaying inactive workspaces with a gradient to fade out the actors
does no longer work when re-using the normal desktop background. If
we keep the current DND behavior, we probably want to implement a real
fade effect - for now, just remove the visually disruptive shadows.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 02:25:15 +01:00
f24e567dc4 overview: Do not zoom the desktop background
While scaling the desktop background with the window previews represents
workspaces quite intuitively, the approach is not without problems.
As window previews in the overview behave quite differently to "real"
windows, the representation of workspaces as miniature versions of
"real" workspaces is flawed. The scaling also makes the transitions
to and from the overview much more visually expensive, without adding
much benefit.
Leaving the background in place provides more visual stability to the
transitions and emphasizes the distinctive behavior of elements in the
overview.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 02:25:15 +01:00
1ea488bb3d overview: Replace InfoBar with message tray notifications
The layout of recent mockups occupies the space previously reserved
for the info bar with the view selector. As the bar's purpose is
mainly to provide the user with feedback, it makes sense to use the
existing message tray facility instead of moving the bar elsewhere.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 02:25:15 +01:00
8d47a150df linear-view: Remove the scrollbar
The scrollbar is the main culprit for cluttered controls in the
linear view - all its functionality is already provided by the
workspace indicators, so it is save to remove the scrollbar in
order to clean up the interface.

https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 02:25:15 +01:00
dc24252e82 Updated Galician translations 2010-11-27 01:43:13 +01:00
2167be053d Added UG translation 2010-11-26 14:28:16 +01:00
926ddc2bdf Show timestamp in expanded chat
When the last message is older than SCROLLBACK_IMMEDIATE_TIME (1
minutes), show a timestamp in the middle, indicating the time it
was sent.
Use the same style for presence changes, but show them on the left.

https://bugzilla.gnome.org/show_bug.cgi?id=617228
2010-11-25 15:31:46 +01:00
4f7a28863c st-icon: Add support for -st-shadow property
Add a drop shadow to the icon texture if the -st-shadow property is
specified.

https://bugzilla.gnome.org/show_bug.cgi?id=635608
2010-11-25 05:38:20 +01:00
6e902f5fec Add development packages needed to build on Ubuntu 2010-11-25 01:18:06 +01:00
01e7d6f30e workspace: Simplify the close button's timeout handler
Clutter actor gained a :has_pointer property after the original
code was written, so use this instead of picking.
2010-11-24 19:04:15 +01:00
d6f1c10b1b messageTray: fix handling of markup vs non-markup notifications
NotificationDaemon-based notifications have markup in the banner/body,
but Telepathy-based notifications don't. (Eg, an XMPP message
containing "<b>foo</b>" should show up angle brackets and all, not as
bold.) Fix MessageTray.Notification to allow explicitly specifying
where there should and shouldn't be markup, and use that
appropriately.

https://bugzilla.gnome.org/show_bug.cgi?id=610219
2010-11-24 02:38:17 +03:00
65f0b483f8 messageTray: make links in message banners clickable
https://bugzilla.gnome.org/show_bug.cgi?id=610219
2010-11-24 02:38:08 +03:00
6a52deec7d Add function for finding urls in string
https://bugzilla.gnome.org/show_bug.cgi?id=610219
2010-11-24 02:24:43 +03:00
3d468c26b0 Updated Thai translation. 2010-11-23 10:26:22 +07:00
a5e61e27c7 [statusMenu] Fix ellipsis in menu entries
According to the HIG we should use ellipsis when:

"Label the menu item with a trailing ellipsis ("...") only if the command requires further
input from the user before it can be performed. Do not add an ellipsis to items that only
present a confirmation dialog (such as Delete), or that do not require further input
(such as Properties, Preferences or About)"

So adjust the use of ellipsis to match that.

Pointed out by Michael Monreal.
2010-11-22 21:19:37 +01:00
59ba112959 Complete porting to new gnome-power-manager API
We updated the normal devices part, but we forgot the part about
the primary device (possibly because it is not reported as such
in case it is fully charged). Update that as well, to avoid showing
weird GIcon serializations.

https://bugzilla.gnome.org/show_bug.cgi?id=635288
2010-11-22 18:05:11 +01:00
4800f63c3a Correct and simplify setting the GJS module path
We were going to great effort to include the normal directories in the
GJS search path and the code to to do this broke recently when
jsdir and jsnativedir were moved to gjs-internals-1.0.pc. However, it
was actually unnecessary since the standard directories are appended
to the default path.

(We continue to use a GNOME_SHELL_JS envvar separate from GJS_PATH
for the Shell to enable the somewhat unlikely case where someone wants
to invoke the shell specifying a GJS_PATH.)

https://bugzilla.gnome.org/show_bug.cgi?id=635367
2010-11-22 10:21:45 -05:00
1fce237538 StThemeNode: suppress compiler warnings and fix minor bugs
Aggressive compiler flags can cause the compiler to be smart enough
to inline functions and detect variables not being set on certain
code paths but not smart enough to understand the overall logic;
add some extra initializations to suppress the warnings.

Fix several minor bugs in the logic found when double checking the
logic before adding the initializations.

Based on a patch by Marc-Antoine Perennou <Marc-Antoine@Perennou.com>.

https://bugzilla.gnome.org/show_bug.cgi?id=634225
2010-11-20 14:14:57 -05:00
71685a3b48 Fix this up 2010-11-20 14:40:40 +01:00
c0b9ce16a7 Updated Norwegian bokmål translation 2010-11-20 14:40:33 +01:00
d1407d0026 Added UG translation 2010-11-20 11:47:22 +01:00
d5bfc503fe Sound Menu: only show the slider
Reimplement UI without any indication of percentage or mutedness,
and whitout switches. The only interaction point is slider, but
it still supports mute changing for applications that track it,
and will react appropriately to external changes.

https://bugzilla.gnome.org/show_bug.cgi?id=634329
2010-11-19 23:13:32 +01:00
de50cf80a8 PowerStatus: Update for gnome-power-manager API changes
g-p-m no longer exports a summary, and instead exports a GIcon to
show. Update for that.

https://bugzilla.gnome.org/show_bug.cgi?id=635288
2010-11-19 22:31:37 +01:00
5086bfedac Fix dependencies for gnome-power-manager
Merging the g-p-m branch with the one adding gnome-settings-daemon
for A11y, a lot of modules were duplicated. Also, gnome-keyring is
not needed, the distro provided one is enough.

https://bugzilla.gnome.org/show_bug.cgi?id=635199
2010-11-19 22:27:44 +01:00
f67ad23033 statusMenu: Fix launching gnome-control-center with an option
This isn't how you launch an app with an option...
2010-11-19 20:34:32 +00:00
b7c1400eb3 dnd: fix a case where ungrabEvents wasn't being called
If the drag actor is destroyed as part of a drag target accepting it,
we were not calling ungrabEvents, meaning the mouse/keyboard remained
grabbed until you clicked somewhere to cancel it.

This fixes that without trying to improve the extremely confusing
control flow...

https://bugzilla.gnome.org/show_bug.cgi?id=635278
2010-11-19 15:09:57 -05:00
b956c6f093 dnd: when snapping back, deal with moved/rescaled parents
Previously, when snapping back a drag actor, we moved it back to its
original stage-relative position and scale. This worked fine if its
parent was still in the same place it was when the drag started, but
failed in cases like the linear workspace layout window drag-and-drop,
where dragging a window would "zoom out" its parent workspace, causing
the snapback to send it to the wrong place.

Fix this by instead snapping the actor back to "where the actor would
have been right now if it were still at its original scale and
position within its original parent actor" rather than "where it was
before the drag started"

https://bugzilla.gnome.org/show_bug.cgi?id=635272
2010-11-19 15:09:57 -05:00
bfc850a94d statusMenu: Make "My Account" menu item work again
For GNOME 3.x. gnome-about-me is dead, so we should be using the
user-accounts panel of gnome-control-center instead.

https://bugzilla.gnome.org/show_bug.cgi?id=635264
2010-11-19 13:39:25 +00:00
85 changed files with 7634 additions and 3283 deletions

1
.gitignore vendored
View File

@ -25,6 +25,7 @@ data/org.gnome.shell.gschema.xml
data/org.gnome.shell.gschema.valid
data/org.gnome.accessibility.magnifier.gschema.xml
data/org.gnome.accessibility.magnifier.gschema.valid
js/misc/config.js
intltool-extract.in
intltool-merge.in
intltool-update.in

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[2.91.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[2.91.4],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
@ -57,11 +57,11 @@ fi
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.3.14
CLUTTER_MIN_VERSION=1.5.8
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
GJS_MIN_VERSION=0.7
MUTTER_MIN_VERSION=2.91.0
GTK_MIN_VERSION=2.91.0
MUTTER_MIN_VERSION=2.91.4
GTK_MIN_VERSION=2.91.7
GIO_MIN_VERSION=2.25.9
# Collect more than 20 libraries for a prize!
@ -92,9 +92,21 @@ PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 gnome-desktop-3.0 >= 2.9
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(JS_TEST, clutter-x11-1.0 gjs-1.0 gobject-introspection-1.0 gtk+-3.0)
AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 2.90.0],
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=libdir gnome-bluetooth-1.0`/gnome-bluetooth
BLUETOOTH_LIBS="-L'$BLUETOOTH_DIR' -lgnome-bluetooth-applet"
AC_SUBST([BLUETOOTH_LIBS],["$BLUETOOTH_LIBS"])
AC_DEFINE_UNQUOTED([BLUETOOTH_DIR],["$BLUETOOTH_DIR"],[Path to installed GnomeBluetooth typelib and library])
AC_DEFINE([HAVE_BLUETOOTH],[1],[Define if you have libgnome-bluetooth-applet])
AC_SUBST([HAVE_BLUETOOTH],[1])
AC_MSG_RESULT([yes])],
[AC_DEFINE([HAVE_BLUETOOTH],[0])
AC_SUBST([HAVE_BLUETOOTH],[0])
AC_MSG_RESULT([no])])
MUTTER_BIN_DIR=`$PKG_CONFIG --variable=exec_prefix mutter-plugins`/bin
# FIXME: metacity-plugins.pc should point directly to its .gir file
MUTTER_LIB_DIR=`$PKG_CONFIG --variable=libdir mutter-plugins`
@ -103,11 +115,7 @@ AC_SUBST(MUTTER_BIN_DIR)
AC_SUBST(MUTTER_LIB_DIR)
AC_SUBST(MUTTER_PLUGIN_DIR)
GJS_JS_DIR=`$PKG_CONFIG --variable=jsdir gjs-1.0`
GJS_JS_NATIVE_DIR=`$PKG_CONFIG --variable=jsnativedir gjs-1.0`
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
AC_SUBST(GJS_JS_DIR)
AC_SUBST(GJS_JS_NATIVE_DIR)
AC_SUBST(GJS_CONSOLE)
AC_CHECK_FUNCS(fdwalk)
@ -157,18 +165,11 @@ changequote([,])dnl
AC_PATH_PROG(mutter, [mutter])
AC_SUBST(mutter)
AC_MSG_CHECKING([if mutter was compiled with GTK+-3.0])
if $PKG_CONFIG --libs libmutter-private | grep gtk-x11-3 >/dev/null; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
AC_MSG_ERROR([GNOME Shell requires Mutter to be compiled against GTK+-3.0])
fi
AC_CONFIG_FILES([
Makefile
data/Makefile
js/Makefile
js/misc/config.js
src/Makefile
tests/Makefile
po/Makefile.in

View File

@ -27,6 +27,7 @@ dist_theme_DATA = \
theme/corner-ripple.png \
theme/dash-placeholder.svg \
theme/dialog-error.svg \
theme/filter-selected.svg \
theme/gnome-shell.css \
theme/mosaic-view-active.svg \
theme/mosaic-view.svg \

View File

@ -44,19 +44,20 @@
</schema>
<schema>
<key>/schemas/desktop/gnome/shell/windows/side_by_side_tiling</key>
<applyto>/desktop/gnome/shell/windows/side_by_side_tiling</applyto>
<key>/schemas/desktop/gnome/shell/windows/edge_tiling</key>
<applyto>/desktop/gnome/shell/windows/edge_tiling</applyto>
<owner>gnome-shell</owner>
<type>bool</type>
<default>true</default>
<locale name="C">
<short>enable side-by-side tiling when dropping windows on screen edges</short>
<short>enable edge tiling when dropping windows on screen edges</short>
<long>
If enabled, dropping windows on screen edges maximizes them
If enabled, dropping windows on vertical screen edges maximizes them
vertically and resizes them horizontally to cover half of the
available area.
available area. Dropping windows on the top screen edge maximizes them
completely.
This key overrides /apps/metacity/general/side_by_side_tiling when
This key overrides /apps/metacity/general/edge_tiling when
running GNOME Shell.
</long>
</locale>

View File

@ -1,12 +1,30 @@
<Menu>
<DefaultLayout>
<Menuname>Apps</Menuname>
<Menuname>Games</Menuname>
<Menuname>Tools</Menuname>
</DefaultLayout>
<DefaultLayout>
<Menuname>Accessories</Menuname>
<Menuname>Games</Menuname>
<Menuname>Graphics</Menuname>
<Menuname>Internet</Menuname>
<Menuname>Multimedia</Menuname>
<Menuname>Office</Menuname>
<Menuname>Other</Menuname>
</DefaultLayout>
<Name>Applications</Name>
<AppDir>/usr/local/share/applications</AppDir>
<DefaultAppDirs/>
<Menu>
<Name>Accessories</Name>
<Include>
<And>
<Category>Utility</Category>
<Not>
<Category>System</Category>
</Not>
</And>
</Include>
</Menu>
<Menu>
<Name>Games</Name>
<Include>
@ -15,21 +33,47 @@
</And>
</Include>
</Menu>
<Menu>
<Name>Tools</Name>
<Name>Graphics</Name>
<Include>
<Category>Development</Category>
<And>
<Category>System</Category>
<Not>
<Category>Settings</Category>
</Not>
<Category>Graphics</Category>
</And>
<Category>Utility</Category>
</Include>
</Menu>
<Menu>
<Name>Apps</Name>
<Name>Internet</Name>
<Include>
<And>
<Category>Network</Category>
<Not><Category>Settings</Category></Not>
</And>
</Include>
</Menu>
<Menu>
<Name>Multimedia</Name>
<Include>
<And>
<Category>AudioVideo</Category>
<Not><Category>Settings</Category></Not>
</And>
</Include>
</Menu>
<Menu>
<Name>Office</Name>
<Include>
<And>
<Category>Office</Category>
</And>
</Include>
</Menu>
<Menu>
<Name>Other</Name>
<OnlyUnallocated/>
<Include>
<And>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="10"
height="20"
id="svg10003"
version="1.1"
inkscape:version="0.47 r22583"
sodipodi:docname="filter-selected.svg">
<defs
id="defs10005">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective10011" />
<inkscape:perspective
id="perspective9998"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="5.5"
inkscape:cx="32"
inkscape:cy="10.181818"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1680"
inkscape:window-height="994"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata10008">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-44)">
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/app-picker.png"
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect34320"
d="m -0.18726572,54.181804 10.55634072,10.55636 10e-6,-21.11269 z"
style="opacity:0.21000001;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -48,21 +48,6 @@ StScrollView StScrollBar
min-height: 16px;
}
StScrollView > .top-shadow
{
background-gradient-direction: vertical;
background-gradient-start: #111111;
background-gradient-end: rgba(17, 17, 17, 0);
height: 30px;
}
StScrollView > .bottom-shadow
{
background-gradient-direction: vertical;
background-gradient-start: rgba(17, 17, 17, 0);
background-gradient-end: #111111;
height: 30px;
}
StScrollBar StBin#trough {
background-color: #080808;
@ -120,6 +105,10 @@ StTooltip StLabel {
min-width: 200px;
}
.popup-sub-menu {
background-color: #606060;
}
/* The remaining popup-menu sizing is all done in ems, so that if you
* override .popup-menu.font-size, everything else will scale with it.
*/
@ -149,6 +138,7 @@ StTooltip StLabel {
.popup-slider-menu-item {
height: 1em;
min-width: 15em;
-slider-height: 0.3em;
-slider-background-color: #333333;
-slider-border-color: #5f5f5f;
@ -224,7 +214,7 @@ StTooltip StLabel {
transition-duration: 100;
}
.panel-button:active, .panel-button:checked, .panel-button:pressed {
.panel-button:active, .panel-button:checked, .panel-button:pressed, .panel-button:focus {
background-gradient-direction: vertical;
background-gradient-start: #3c3c3c;
background-gradient-end: #131313;
@ -262,54 +252,11 @@ StTooltip StLabel {
background-color: rgba(0,0,0,0.6);
}
.new-workspace-area {
border: 2px solid rgba(255, 255, 255, 0.8);
border-radius: 10px;
background-color: #111;
}
.new-workspace-area-internal {
background-gradient-direction: horizontal;
background-gradient-start: rgba(16, 16, 16, 0);
background-gradient-end: rgba(16, 16, 16, 1.0);
background-image: url("move-window-on-new.svg");
}
.new-workspace-area:hover {
border: 2px solid rgba(255, 255, 255, 1.0);
background-gradient-direction: horizontal;
background-gradient-start: rgba(130, 130, 130, 0.9);
background-gradient-end: rgba(16, 16, 16, 0.9);
}
.left-workspaces-shadow {
background-gradient-direction: horizontal;
background-gradient-start: rgba(16, 16, 16, 1.0);
background-gradient-end: rgba(16, 16, 16, 0.0);
}
.right-workspaces-shadow {
background-gradient-direction: horizontal;
background-gradient-end: rgba(16, 16, 16, 1.0);
background-gradient-start: rgba(16, 16, 16, 0);
}
.workspaces {
.workspaces-view {
color: white;
}
.workspaces.single {
spacing: 25px;
}
.workspaces.mosaic {
spacing: 15px;
}
.workspaces-bar {
spacing: 5px;
}
.workspace-indicator-panel {
spacing: 8px;
}
@ -324,27 +271,6 @@ StTooltip StLabel {
background: rgba(255,255,255,0.8);
}
.window-caption {
background: rgba(0,0,0,0.8);
border: 1px solid rgba(128,128,128,0.40);
border-radius: 10px;
font-size: 12px;
padding: 2px 8px;
-shell-caption-spacing: 4px;
}
.window-close {
background-image: url("close-window.svg");
height: 24px;
width: 24px;
-st-shadow: -2px 2px 6px rgba(0,0,0,0.5);
-shell-close-overlap: 16px;
}
.single-view-controls {
padding: 8px 0px;
}
.workspace-controls {
width: 48px;
font-size: 32px;
@ -371,6 +297,23 @@ StTooltip StLabel {
background-color: rgba(128, 128, 128, 0.2);
}
.window-caption {
background: rgba(0,0,0,0.8);
border: 1px solid rgba(128,128,128,0.40);
border-radius: 10px;
font-size: 12px;
padding: 2px 8px;
-shell-caption-spacing: 4px;
}
.window-close {
background-image: url("close-window.svg");
height: 24px;
width: 24px;
-st-shadow: -2px 2px 6px rgba(0,0,0,0.5);
-shell-close-overlap: 16px;
}
/* Dash */
#dash {
@ -383,6 +326,11 @@ StTooltip StLabel {
border-radius: 0px 9px 9px 0px;
}
#dash:empty {
height: 100px;
width: 60px;
}
.dash-placeholder {
background-image: url("dash-placeholder.svg");
height: 27px;
@ -392,8 +340,12 @@ StTooltip StLabel {
spacing: 16px;
}
#viewSelectorTabBar {
padding: 16px;
}
#searchArea {
padding: 0px 12px;
padding: 0px 24px;
}
#searchEntry {
@ -522,27 +474,28 @@ StTooltip StLabel {
/* Apps */
.overview-pane {
width: 440px;
}
.icon-grid {
spacing: 6px;
spacing: 36px;
-shell-grid-item-size: 70px;
}
.all-app {
padding: 10px;
padding: 16px 25px 16px 16px;
spacing: 20px;
}
.app-section-divider-container {
padding-top: 10px;
padding-bottom: 10px;
.app-filter {
font-size: 14px;
font-weight: bold;
height: 40px;
color: #aaa;
width: 200px;
}
.app-section-divider {
height: 2px;
background-image: url("separator-white.png");
.app-filter:selected {
color: #ffffff;
background-image: url("filter-selected.svg");
background-position: 190px 10px;
}
#dash > .app-well-app {
@ -555,6 +508,7 @@ StTooltip StLabel {
.remove-favorite-icon:hover {
color: white;
-st-shadow: black 0px 2px 2px;
}
.app-well-app > .overview-icon,
@ -814,6 +768,10 @@ StTooltip StLabel {
color: #cccccc;
}
.url-highlighter {
link-color: #ccccff;
}
/* Message Tray */
#message-tray {
background-gradient-direction: vertical;
@ -860,6 +818,10 @@ StTooltip StLabel {
height: 1em;
}
#notification-scrollview > StScrollBar {
padding-left: 6px;
}
#notification-body {
spacing: 5px;
}
@ -920,7 +882,14 @@ StTooltip StLabel {
border-radius: 4px;
}
.chat-response {
.chat-meta-message {
padding-left: 4px;
border-radius: 4px;
font-size: 14px;
color: #bbbbbb;
}
#notification StEntry {
padding: 4px;
border-radius: 4px;
border: 1px solid #565656;
@ -928,10 +897,9 @@ StTooltip StLabel {
background-color: #404040;
caret-color: #ffffff;
caret-size: 1px;
height: 18px;
}
.chat-response:focus {
#notification StEntry:focus {
border: 1px solid #3a3a3a;
color: #545454;
background-color: #e8e8e8;
@ -958,6 +926,7 @@ StTooltip StLabel {
}
.summary-source {
color: white;
}
.summary-source-button {
@ -972,7 +941,6 @@ StTooltip StLabel {
.source-title {
font: 12px sans-serif;
font-weight: bold;
color: white;
padding-left: 4px;
}

View File

@ -2,12 +2,14 @@
jsdir = $(pkgdatadir)/js
nobase_dist_js_DATA = \
misc/config.js \
misc/docInfo.js \
misc/fileUtils.js \
misc/format.js \
misc/gnomeSession.js \
misc/params.js \
misc/telepathy.js \
misc/utils.js \
perf/core.js \
prefs/clockPreferences.js \
ui/altTab.js \
@ -16,6 +18,7 @@ nobase_dist_js_DATA = \
ui/boxpointer.js \
ui/calendar.js \
ui/chrome.js \
ui/ctrlAltTab.js \
ui/dash.js \
ui/dnd.js \
ui/docDisplay.js \
@ -46,6 +49,7 @@ nobase_dist_js_DATA = \
ui/status/accessibility.js \
ui/status/power.js \
ui/status/volume.js \
ui/status/bluetooth.js \
ui/telepathyClient.js \
ui/tweener.js \
ui/viewSelector.js \

3
js/misc/config.js.in Normal file
View File

@ -0,0 +1,3 @@
/* mode: js2; indent-tabs-mode: nil; tab-size: 4 */
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;

19
js/misc/utils.js Normal file
View File

@ -0,0 +1,19 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
/* http://daringfireball.net/2010/07/improved_regex_for_matching_urls */
const _urlRegexp = /\b(([a-z][\w-]+:(\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)([^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/gi;
// findUrls:
// @str: string to find URLs in
//
// Searches @str for URLs and returns an array of objects with %url
// properties showing the matched URL string, and %pos properties indicating
// the position within @str where the URL was found.
//
// Return value: the list of match objects, as described above
function findUrls(str) {
let res = [], match;
while ((match = _urlRegexp.exec(str)))
res.push({ url: match[0], pos: match.index });
return res;
}

View File

@ -126,8 +126,8 @@ AltTabPopup.prototype = {
return false;
this._haveModal = true;
this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this._keyReleaseEventId = global.stage.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
@ -383,11 +383,6 @@ AltTabPopup.prototype = {
if (this._thumbnails)
this._destroyThumbnails();
if (this._keyPressEventId)
global.stage.disconnect(this._keyPressEventId);
if (this._keyReleaseEventId)
global.stage.disconnect(this._keyReleaseEventId);
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
if (this._thumbnailTimeoutId != 0)

View File

@ -29,10 +29,20 @@ function AlphabeticalView() {
AlphabeticalView.prototype = {
_init: function() {
this.actor = new St.BoxLayout({ vertical: true });
this._grid = new IconGrid.IconGrid();
this._grid = new IconGrid.IconGrid({ xAlign: St.Align.START });
this._appSystem = Shell.AppSystem.get_default();
this.actor.add(this._grid.actor, { y_align: St.Align.START, expand: true });
this._filterApp = null;
let box = new St.BoxLayout({ vertical: true });
box.add(this._grid.actor, { y_align: St.Align.START, expand: true });
this.actor = new St.ScrollView({ x_fill: true,
y_fill: false,
y_align: St.Align.START,
vshadows: true });
this.actor.add_actor(box);
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
},
_removeAll: function() {
@ -40,20 +50,24 @@ AlphabeticalView.prototype = {
this._apps = [];
},
_addApp: function(app) {
let appIcon = new AppWellIcon(this._appSystem.get_app(app.get_id()));
appIcon.connect('launching', Lang.bind(this, function() {
this.emit('launching');
}));
appIcon._draggable.connect('drag-begin', Lang.bind(this, function() {
this.emit('drag-begin');
}));
_addApp: function(appInfo) {
let appIcon = new AppWellIcon(this._appSystem.get_app(appInfo.get_id()));
this._grid.addItem(appIcon.actor);
appIcon._appInfo = appInfo;
if (this._filterApp && !this._filterApp(appInfo))
appIcon.actor.hide();
this._apps.push(appIcon);
},
setFilter: function(filter) {
this._filterApp = filter;
for (let i = 0; i < this._apps.length; i++)
this._apps[i].actor.visible = filter(this._apps[i]._appInfo);
},
refresh: function(apps) {
let ids = [];
for (let i in apps)
@ -70,8 +84,6 @@ AlphabeticalView.prototype = {
}
};
Signals.addSignalMethods(AlphabeticalView.prototype);
function ViewByCategories() {
this._init();
}
@ -79,59 +91,79 @@ function ViewByCategories() {
ViewByCategories.prototype = {
_init: function() {
this._appSystem = Shell.AppSystem.get_default();
this.actor = new St.BoxLayout({ vertical: true });
this.actor = new St.BoxLayout({ style_class: 'all-app' });
this.actor._delegate = this;
this._view = new AlphabeticalView();
this._filters = new St.BoxLayout({ vertical: true });
this.actor.add(this._view.actor, { expand: true, x_fill: true, y_fill: true });
this.actor.add(this._filters, { expand: false, y_fill: false, y_align: St.Align.START });
this._sections = [];
},
_updateSections: function(apps) {
this._removeAll();
_selectCategory: function(num) {
if (num != -1)
this._allFilter.remove_style_pseudo_class('selected');
else
this._allFilter.add_style_pseudo_class('selected');
let sections = this._appSystem.get_sections();
if (!sections)
return;
for (let i = 0; i < sections.length; i++) {
if (i) {
let actor = new St.Bin({ style_class: 'app-section-divider' });
let divider = new St.Bin({ style_class: 'app-section-divider-container',
child: actor,
x_fill: true });
this._view.setFilter(Lang.bind(this, function(app) {
if (num == -1)
return true;
return this._sections[num].name == app.get_section();
}));
this.actor.add(divider, { y_fill: false, expand: true });
}
let _apps = apps.filter(function(app) {
return app.get_section() == sections[i];
});
this._sections[i] = { view: new AlphabeticalView(),
apps: _apps,
name: sections[i] };
this._sections[i].view.connect('launching', Lang.bind(this, function() {
this.emit('launching');
}));
this._sections[i].view.connect('drag-begin', Lang.bind(this, function() {
this.emit('drag-begin');
}));
this.actor.add(this._sections[i].view.actor, { y_align: St.Align.START, expand: true });
for (let i = 0; i < this._sections.length; i++) {
if (i == num)
this._sections[i].filterActor.add_style_pseudo_class('selected');
else
this._sections[i].filterActor.remove_style_pseudo_class('selected');
}
},
_addFilter: function(name, num) {
let button = new St.Button({ label: name,
style_class: 'app-filter',
x_align: St.Align.START });
this._filters.add(button, { expand: true, x_fill: true, y_fill: false });
button.connect('clicked', Lang.bind(this, function() {
this._selectCategory(num);
}));
if (num != -1)
this._sections[num] = { filterActor: button,
name: name };
else
this._allFilter = button;
},
_removeAll: function() {
this.actor.destroy_children();
this._sections.forEach(function (section) { section.view.disconnectAll(); });
this._sections = [];
this._filters.destroy_children();
},
refresh: function(apps) {
this._updateSections(apps);
for (let i = 0; i < this._sections.length; i++) {
this._sections[i].view.refresh(this._sections[i].apps);
}
this._removeAll();
let sections = this._appSystem.get_sections();
this._apps = apps;
this._view.refresh(apps);
/* Translators: Filter to display all applications */
this._addFilter(_("All"), -1);
if (!sections)
return;
for (let i = 0; i < sections.length; i++)
this._addFilter(sections[i], i);
this._selectCategory(-1);
}
};
Signals.addSignalMethods(ViewByCategories.prototype);
/* This class represents a display containing a collection of application items.
* The applications are sorted based on their name.
*/
@ -146,17 +178,8 @@ AllAppDisplay.prototype = {
Main.queueDeferredWork(this._workId);
}));
this._scrollView = new St.ScrollView({ x_fill: true,
y_fill: false,
vshadows: true });
this.actor = new St.Bin({ style_class: 'all-app',
y_align: St.Align.START,
child: this._scrollView });
this._appView = new ViewByCategories();
this._scrollView.add_actor(this._appView.actor);
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this.actor = new St.Bin({ child: this._appView.actor, x_fill: true, y_fill: true });
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
},
@ -169,8 +192,6 @@ AllAppDisplay.prototype = {
this._appView.refresh(apps);
}
};
Signals.addSignalMethods(AllAppDisplay.prototype);
function BaseAppSearchProvider() {
this._init();
@ -491,7 +512,11 @@ AppIconMenu.prototype = {
__proto__: PopupMenu.PopupMenu.prototype,
_init: function(source) {
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.LEFT, 0);
let side = St.Side.LEFT;
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
side = St.Side.RIGHT;
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, side, 0);
this._source = source;

View File

@ -11,7 +11,7 @@ const POPUP_ANIMATION_TIME = 0.15;
/**
* BoxPointer:
* @side: A St.Side type; currently only St.Side.TOP is implemented
* @side: side to draw the arrow on
* @binProperties: Properties to set on contained bin
*
* An actor which displays a triangle "arrow" pointing to a given
@ -42,7 +42,7 @@ BoxPointer.prototype = {
this.bin.raise(this._border);
},
animateAppear: function(onComplete) {
show: function(animate, onComplete) {
let x = this.actor.x;
let y = this.actor.y;
let themeNode = this.actor.get_theme_node();
@ -51,19 +51,21 @@ BoxPointer.prototype = {
this.actor.opacity = 0;
this.actor.show();
switch (this._arrowSide) {
case St.Side.TOP:
this.actor.y -= rise;
break;
case St.Side.BOTTOM:
this.actor.y += rise;
break;
case St.Side.LEFT:
this.actor.x -= rise;
break;
case St.Side.RIGHT:
this.actor.x += rise;
break;
if (animate) {
switch (this._arrowSide) {
case St.Side.TOP:
this.actor.y -= rise;
break;
case St.Side.BOTTOM:
this.actor.y += rise;
break;
case St.Side.LEFT:
this.actor.x -= rise;
break;
case St.Side.RIGHT:
this.actor.x += rise;
break;
}
}
Tweener.addTween(this.actor, { opacity: 255,
@ -74,7 +76,7 @@ BoxPointer.prototype = {
time: POPUP_ANIMATION_TIME });
},
animateDisappear: function(onComplete) {
hide: function(animate, onComplete) {
let x = this.actor.x;
let y = this.actor.y;
let originalX = this.actor.x;
@ -82,19 +84,21 @@ BoxPointer.prototype = {
let themeNode = this.actor.get_theme_node();
let rise = themeNode.get_length('-arrow-rise');
switch (this._arrowSide) {
case St.Side.TOP:
y += rise;
break;
case St.Side.BOTTOM:
y -= rise;
break;
case St.Side.LEFT:
x += rise;
break;
case St.Side.RIGHT:
x -= rise;
break;
if (animate) {
switch (this._arrowSide) {
case St.Side.TOP:
y += rise;
break;
case St.Side.BOTTOM:
y -= rise;
break;
case St.Side.LEFT:
x += rise;
break;
case St.Side.RIGHT:
x -= rise;
break;
}
}
Tweener.addTween(this.actor, { opacity: 0,
@ -272,7 +276,9 @@ BoxPointer.prototype = {
// edge by the same distance as the main part of the box is
// separated from its sourceActor
let primary = global.get_primary_monitor();
let arrowRise = this.actor.get_theme_node().get_length('-arrow-rise');
let themeNode = this.actor.get_theme_node();
let arrowRise = themeNode.get_length('-arrow-rise');
let borderRadius = themeNode.get_length('-arrow-border-radius');
let resX, resY;
@ -298,13 +304,13 @@ BoxPointer.prototype = {
case St.Side.BOTTOM:
switch (alignment) {
case St.Align.START:
resX = sourceX;
resX = sourceX - 2 * borderRadius;
break;
case St.Align.MIDDLE:
resX = sourceX - Math.floor((natWidth - sourceWidth) / 2);
break;
case St.Align.END:
resX = sourceX - (natWidth - sourceWidth);
resX = sourceX - (natWidth - sourceWidth) + 2 * borderRadius;
break;
}
@ -318,13 +324,13 @@ BoxPointer.prototype = {
case St.Side.RIGHT:
switch (alignment) {
case St.Align.START:
resY = sourceY;
resY = sourceY - 2 * borderRadius;
break;
case St.Align.MIDDLE:
resY = sourceY - Math.floor((natHeight - sourceHeight) / 2);
break;
case St.Align.END:
resY = sourceY - (natHeight - sourceHeight);
resY = sourceY - (natHeight - sourceHeight) + 2 * borderRadius;
break;
}

View File

@ -5,7 +5,7 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang;
const St = imports.gi.St;
const Pango = imports.gi.Pango;
const Gettext_gtk20 = imports.gettext.domain('gtk20');
const Gettext_gtk30 = imports.gettext.domain('gtk30');
const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
const WEEKDATE_HEADER_WIDTH_DIGITS = 3;
@ -60,7 +60,7 @@ Calendar.prototype = {
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
let weekStartString = Gettext_gtk20.gettext('calendar:week_start:0');
let weekStartString = Gettext_gtk30.gettext('calendar:week_start:0');
if (weekStartString.indexOf('calendar:week_start:') == 0) {
this._weekStart = parseInt(weekStartString.substring(20));
}
@ -71,7 +71,7 @@ Calendar.prototype = {
}
// Find the ordering for month/year in the calendar heading
switch (Gettext_gtk20.gettext('calendar:MY')) {
switch (Gettext_gtk30.gettext('calendar:MY')) {
case 'calendar:MY':
this._headerFormat = '%B %Y';
break;

254
js/ui/ctrlAltTab.js Normal file
View File

@ -0,0 +1,254 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const AltTab = imports.ui.altTab;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const POPUP_APPICON_SIZE = 96;
const POPUP_FADE_TIME = 0.1; // seconds
function CtrlAltTabManager() {
this._init();
}
CtrlAltTabManager.prototype = {
_init: function() {
this._items = [];
this._focusManager = St.FocusManager.get_for_stage(global.stage);
Main.wm.setKeybindingHandler('switch_panels', Lang.bind(this,
function (shellwm, binding, window, backwards) {
this.popup(backwards);
}));
},
addGroup: function(root, name, icon) {
this._items.push({ root: root, name: name, iconName: icon });
root.connect('destroy', Lang.bind(this, function() { this.removeGroup(root); }));
this._focusManager.add_group(root);
},
removeGroup: function(root) {
this._focusManager.remove_group(root);
for (let i = 0; i < this._items.length; i++) {
if (this._items[i].root == root) {
this._items.splice(i, 1);
return;
}
}
},
focusGroup: function(root) {
if (global.stage_input_mode == Shell.StageInputMode.NONREACTIVE ||
global.stage_input_mode == Shell.StageInputMode.NORMAL)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
popup: function(backwards) {
// Start with the set of focus groups that are currently mapped
let items = this._items.filter(function (item) { return item.root.mapped; });
// And add the windows metacity would show in its Ctrl-Alt-Tab list
let screen = global.screen;
let display = screen.get_display();
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) {
let icon;
let app = windowTracker.get_window_app(windows[i]);
if (app)
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
else
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
items.push({ window: windows[i],
name: windows[i].title,
iconActor: icon });
}
if (!items.length)
return;
new CtrlAltTabPopup().show(items, backwards);
}
};
function mod(a, b) {
return (a + b) % b;
}
function CtrlAltTabPopup() {
this._init();
}
CtrlAltTabPopup.prototype = {
_init : function() {
let primary = global.get_primary_monitor();
this.actor = new St.BoxLayout({ name: 'ctrlAltTabPopup',
reactive: true,
x: primary.x + primary.width / 2,
y: primary.y + primary.height / 2,
anchor_gravity: Clutter.Gravity.CENTER });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._haveModal = false;
this._selection = 0;
Main.uiGroup.add_actor(this.actor);
},
show : function(items, startBackwards) {
if (!Main.pushModal(this.actor))
return false;
this._haveModal = true;
this._keyPressEventId = this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this._keyReleaseEventId = this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this._items = items;
this._switcher = new CtrlAltTabSwitcher(items);
this.actor.add_actor(this._switcher.actor);
if (startBackwards)
this._selection = this._items.length - 1;
this._select(this._selection);
let [x, y, mods] = global.get_pointer();
if (!(mods & Gdk.ModifierType.MOD1_MASK)) {
this._finish();
return false;
}
this.actor.opacity = 0;
this.actor.show();
Tweener.addTween(this.actor,
{ opacity: 255,
time: POPUP_FADE_TIME,
transition: 'easeOutQuad'
});
return true;
},
_next : function() {
return mod(this._selection + 1, this._items.length);
},
_previous : function() {
return mod(this._selection - 1, this._items.length);
},
_keyPressEvent : function(actor, event) {
let keysym = event.get_key_symbol();
let shift = (Shell.get_event_state(event) & Clutter.ModifierType.SHIFT_MASK);
if (shift && keysym == Clutter.KEY_Tab)
keysym = Clutter.ISO_Left_Tab;
if (keysym == Clutter.KEY_Escape)
this.destroy();
else if (keysym == Clutter.KEY_Tab)
this._select(this._next());
else if (keysym == Clutter.KEY_ISO_Left_Tab)
this._select(this._previous());
else if (keysym == Clutter.KEY_Left)
this._select(this._previous());
else if (keysym == Clutter.KEY_Right)
this._select(this._next());
return true;
},
_keyReleaseEvent : function(actor, event) {
let [x, y, mods] = global.get_pointer();
let state = mods & Clutter.ModifierType.MOD1_MASK;
if (state == 0)
this._finish();
return true;
},
_finish : function() {
this.destroy();
let item = this._items[this._selection];
if (item.root)
Main.ctrlAltTabManager.focusGroup(item.root);
else
Main.activateWindow(item.window);
},
_popModal: function() {
if (this._haveModal) {
Main.popModal(this.actor);
this._haveModal = false;
}
},
destroy : function() {
this._popModal();
Tweener.addTween(this.actor,
{ opacity: 0,
time: POPUP_FADE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.actor.destroy();
})
});
},
_onDestroy : function() {
if (this._keyPressEventId)
this.actor.disconnect(this._keyPressEventId);
if (this._keyReleaseEventId)
this.actor.disconnect(this._keyReleaseEventId);
},
_select : function(num) {
this._selection = num;
this._switcher.highlight(num);
}
};
function CtrlAltTabSwitcher(items) {
this._init(items);
}
CtrlAltTabSwitcher.prototype = {
__proto__ : AltTab.SwitcherList.prototype,
_init : function(items) {
AltTab.SwitcherList.prototype._init.call(this, true);
for (let i = 0; i < items.length; i++)
this._addIcon(items[i]);
},
_addIcon : function(item) {
let box = new St.BoxLayout({ style_class: 'alt-tab-app',
vertical: true });
let icon = item.iconActor;
if (!icon) {
icon = new St.Icon({ icon_name: item.iconName,
icon_type: St.IconType.SYMBOLIC,
icon_size: POPUP_APPICON_SIZE });
}
box.add(icon, { x_fill: false, y_fill: false } );
let text = new St.Label({ text: item.name });
box.add(text, { x_fill: false });
this.addItem(box);
}
};

View File

@ -78,7 +78,6 @@ function Dash() {
Dash.prototype = {
_init : function() {
this._placeholderText = null;
this._menus = [];
this._menuDisplays = [];
this._maxHeight = -1;
@ -216,7 +215,6 @@ Dash.prototype = {
let contextId = '';
let running = this._tracker.get_running_apps(contextId);
let runningIds = this._appIdListToHash(running);
for (let id in favorites) {
let app = favorites[id];
@ -229,29 +227,28 @@ Dash.prototype = {
continue;
this._addApp(app);
}
if (this._placeholderText) {
this._placeholderText.destroy();
this._placeholderText = null;
}
let children = this._box.get_children();
if (children.length == 0) {
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
this._box.add_actor(this._placeholderText);
} else if (this._maxHeight > -1) {
let iconSizes = [ 48, 32, 24, 22, 16 ];
this._box.add_style_pseudo_class('empty');
} else {
this._box.remove_style_pseudo_class('empty');
for (let i = 0; i < iconSizes.length; i++) {
let minHeight, natHeight;
if (this._maxHeight > -1) {
let iconSizes = [ 48, 32, 24, 22, 16 ];
this._iconSize = iconSizes[i];
for (let j = 0; j < children.length; j++)
children[j]._delegate.icon.setIconSize(this._iconSize);
for (let i = 0; i < iconSizes.length; i++) {
let minHeight, natHeight;
[minHeight, natHeight] = this.actor.get_preferred_height(-1);
this._iconSize = iconSizes[i];
for (let j = 0; j < children.length; j++)
children[j]._delegate.icon.setIconSize(this._iconSize);
if (natHeight <= this._maxHeight)
break;
[minHeight, natHeight] = this.actor.get_preferred_height(-1);
if (natHeight <= this._maxHeight)
break;
}
}
}
this._box.show();

View File

@ -26,9 +26,9 @@ const DragMotionResult = {
};
const DRAG_CURSOR_MAP = {
0: Shell.Cursor.UNSUPPORTED_TARGET,
1: Shell.Cursor.COPY,
2: Shell.Cursor.MOVE
0: Shell.Cursor.DND_UNSUPPORTED_TARGET,
1: Shell.Cursor.DND_COPY,
2: Shell.Cursor.DND_MOVE
};
const DragDropResult = {
@ -100,6 +100,8 @@ _Draggable.prototype = {
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
this._eventsGrabbed = false;
},
_onButtonPress : function (actor, event) {
@ -147,13 +149,19 @@ _Draggable.prototype = {
},
_grabEvents: function() {
Clutter.grab_pointer(_getEventHandlerActor());
Clutter.grab_keyboard(_getEventHandlerActor());
if (!this._eventsGrabbed) {
Clutter.grab_pointer(_getEventHandlerActor());
Clutter.grab_keyboard(_getEventHandlerActor());
this._eventsGrabbed = true;
}
},
_ungrabEvents: function() {
Clutter.ungrab_pointer();
Clutter.ungrab_keyboard();
if (this._eventsGrabbed) {
Clutter.ungrab_pointer();
Clutter.ungrab_keyboard();
this._eventsGrabbed = false;
}
},
_onEvent: function(actor, event) {
@ -213,7 +221,7 @@ _Draggable.prototype = {
if (this._onEventId)
this._ungrabActor();
this._grabEvents();
global.set_cursor(Shell.Cursor.IN_DRAG);
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
this._dragX = this._dragStartX = stageX;
this._dragY = this._dragStartY = stageY;
@ -374,7 +382,7 @@ _Draggable.prototype = {
}
target = target.get_parent();
}
global.set_cursor(Shell.Cursor.IN_DRAG);
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
}
return true;
@ -440,24 +448,44 @@ _Draggable.prototype = {
return true;
},
// Get position of the drag actor's source if the source is still around,
// or return the original location if the actor itself was being dragged
// or the source is no longer around.
_getRestoreLocation: function() {
let locX = this._snapBackX;
let locY = this._snapBackY;
let x, y, scale;
if (this._dragActorSource && this._dragActorSource.visible)
[locX, locY] = this._dragActorSource.get_transformed_position();
return [locX, locY];
if (this._dragActorSource && this._dragActorSource.visible) {
// Snap the clone back to its source
[x, y] = this._dragActorSource.get_transformed_position();
let [sourceScaledWidth, sourceScaledHeight] = this._dragActorSource.get_transformed_size();
scale = this._dragActor.width / sourceScaledWidth;
} else if (this._dragOrigParent) {
// Snap the actor back to its original position within
// its parent, adjusting for the fact that the parent
// may have been moved or scaled
let [parentX, parentY] = this._dragOrigParent.get_transformed_position();
x = parentX + this._dragOrigParent.scale_x * this._dragOrigX;
y = parentY + this._dragOrigParent.scale_y * this._dragOrigY;
let [parentWidth, parentHeight] = this._dragOrigParent.get_size();
let [parentScaledWidth, parentScaledHeight] = this._dragOrigParent.get_transformed_size();
let parentScale = parentScaledWidth / parentWidth;
scale = this._dragOrigScale * parentScale;
} else {
// Snap back actor to its original stage position
x = this._snapBackX;
y = this._snapBackY;
scale = this._snapBackScale;
}
return [x, y, scale];
},
_cancelDrag: function(eventTime) {
this._dragInProgress = false;
let [snapBackX, snapBackY] = this._getRestoreLocation();
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
if (this._actorDestroyed) {
global.unset_cursor();
if (!this._buttonDown)
this._ungrabEvents();
this.emit('drag-end', eventTime, false);
return;
}
@ -467,8 +495,8 @@ _Draggable.prototype = {
Tweener.addTween(this._dragActor,
{ x: snapBackX,
y: snapBackY,
scale_x: this._snapBackScale,
scale_y: this._snapBackScale,
scale_x: snapBackScale,
scale_y: snapBackScale,
opacity: this._dragOrigOpacity,
time: SNAP_BACK_ANIMATION_TIME,
transition: 'easeOutQuad',
@ -480,11 +508,11 @@ _Draggable.prototype = {
_restoreDragActor: function(eventTime) {
this._dragInProgress = false;
[restoreX, restoreY] = this._getRestoreLocation();
[restoreX, restoreY, restoreScale] = this._getRestoreLocation();
// fade the actor back in at its original location
this._dragActor.set_position(restoreX, restoreY);
this._dragActor.set_scale(this._snapBackScale, this._snapBackScale);
this._dragActor.set_scale(restoreScale, restoreScale);
this._dragActor.opacity = 0;
this._animationInProgress = true;

View File

@ -4,7 +4,7 @@ const Clutter = imports.gi.Clutter;;
const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Gettext_gtk20 = imports.gettext.domain('gtk20');
const Gettext_gtk30 = imports.gettext.domain('gtk30');
const Tweener = imports.ui.tweener;
@ -65,7 +65,7 @@ function init() {
String.prototype.format = Format.format;
// Set the default direction for St widgets (this needs to be done before any use of St)
if (Gettext_gtk20.gettext('default:LTR') == 'default:RTL') {
if (Gettext_gtk30.gettext('default:LTR') == 'default:RTL') {
St.Widget.set_default_direction(St.TextDirection.RTL);
}

View File

@ -165,8 +165,16 @@ IconGrid.prototype = {
alloc.natural_size = nColumns * this._item_size + totalSpacing;
},
_getPreferredHeight: function (grid, forWidth, alloc) {
_getVisibleChildren: function() {
let children = this._grid.get_children();
children = children.filter(function(actor) {
return actor.visible;
});
return children;
},
_getPreferredHeight: function (grid, forWidth, alloc) {
let children = this._getVisibleChildren();
let [nColumns, usedWidth] = this._computeLayout(forWidth);
let nRows;
if (nColumns > 0)
@ -182,7 +190,7 @@ IconGrid.prototype = {
},
_allocate: function (grid, box, flags) {
let children = this._grid.get_children();
let children = this._getVisibleChildren();
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;

View File

@ -663,11 +663,11 @@ LookingGlass.prototype = {
style_class: 'lg-dialog',
vertical: true,
visible: false });
this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent));
let gconf = GConf.Client.get_default();
gconf.add_dir('/desktop/gnome/interface', GConf.ClientPreloadType.PRELOAD_NONE);
gconf.notify_add('/desktop/gnome/interface/monospace_font_name',
Lang.bind(this, this._updateFont));
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._interfaceSettings.connect('changed::monospace-font-name',
Lang.bind(this, this._updateFont));
this._updateFont();
Main.uiGroup.add_actor(this.actor);
@ -778,8 +778,7 @@ LookingGlass.prototype = {
},
_updateFont: function() {
let gconf = GConf.Client.get_default();
let fontName = gconf.get_string('/desktop/gnome/interface/monospace_font_name');
let fontName = this._interfaceSettings.get_string('monospace-font-name');
// This is mishandled by the scanner - should by Pango.FontDescription_from_string(fontName);
// https://bugzilla.gnome.org/show_bug.cgi?id=595889
let fontDesc = Pango.font_description_from_string(fontName);
@ -925,20 +924,15 @@ LookingGlass.prototype = {
if (this._open)
return;
if (!Main.pushModal(this.actor))
if (!Main.pushModal(this._entry))
return;
this._keyPressEventId = global.stage.connect('key-press-event',
Lang.bind(this, this._globalKeyPressEvent));
this.actor.show();
this.actor.lower(Main.chrome.actor);
this._open = true;
Tweener.removeTweens(this.actor);
global.stage.set_key_focus(this._entry);
// We inverse compensate for the slow-down so you can change the factor
// through LookingGlass without long waits.
Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
@ -951,9 +945,6 @@ LookingGlass.prototype = {
if (!this._open)
return;
if (this._keyPressEventId)
global.stage.disconnect(this._keyPressEventId);
this._objInspector.actor.hide();
this._historyNavIndex = -1;
@ -966,7 +957,7 @@ LookingGlass.prototype = {
this._borderPaintTarget = null;
}
Main.popModal(this.actor);
Main.popModal(this._entry);
Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
transition: 'easeOutQuad',

View File

@ -10,6 +10,7 @@ const Signals = imports.signals;
const Main = imports.ui.main;
const MagnifierDBus = imports.ui.magnifierDBus;
const Params = imports.misc.params;
// Keep enums in sync with GSettings schemas
const MouseTrackingMode = {
@ -65,11 +66,14 @@ Magnifier.prototype = {
// Create the first ZoomRegion and initialize it according to the
// magnification settings.
let [xMouse, yMouse, mask] = global.get_pointer();
let mask;
[this.xMouse, this.yMouse, mask] = global.get_pointer();
let aZoomRegion = new ZoomRegion(this, this._cursorRoot);
this._zoomRegions.push(aZoomRegion);
let showAtLaunch = this._settingsInit(aZoomRegion);
aZoomRegion.scrollContentsTo(xMouse, yMouse);
aZoomRegion.scrollContentsTo(this.xMouse, this.yMouse);
xfixesCursor.connect('cursor-change', Lang.bind(this, this._updateMouseSprite));
this._xfixesCursor = xfixesCursor;
@ -137,12 +141,10 @@ Magnifier.prototype = {
* Turn on mouse tracking, if not already doing so.
*/
startTrackingMouse: function() {
// initialize previous mouse coord to undefined.
let prevCoord = { x: NaN, y: NaN };
if (!this._mouseTrackingId)
this._mouseTrackingId = Mainloop.timeout_add(
MOUSE_POLL_FREQUENCY,
Lang.bind(this, this.scrollToMousePos, prevCoord)
Lang.bind(this, this.scrollToMousePos)
);
},
@ -169,14 +171,15 @@ Magnifier.prototype = {
* scrollToMousePos:
* Position all zoom regions' ROI relative to the current location of the
* system pointer.
* @prevCoord: The previous mouse coordinates. Used to stop scrolling if
* the new position is the same as the last one (optional).
* @return true.
*/
scrollToMousePos: function(prevCoord) {
scrollToMousePos: function() {
let [xMouse, yMouse, mask] = global.get_pointer();
if (!prevCoord || prevCoord.x != xMouse || prevCoord.y != yMouse) {
if (xMouse != this.xMouse || yMouse != this.yMouse) {
this.xMouse = xMouse;
this.yMouse = yMouse;
let sysMouseOverAny = false;
this._zoomRegions.forEach(function(zoomRegion, index, array) {
if (zoomRegion.scrollToMousePos())
@ -186,11 +189,6 @@ Magnifier.prototype = {
this.hideSystemCursor();
else
this.showSystemCursor();
if (prevCoord) {
prevCoord.x = xMouse;
prevCoord.y = yMouse;
}
}
return true;
},
@ -212,9 +210,14 @@ Magnifier.prototype = {
*/
createZoomRegion: function(xMagFactor, yMagFactor, roi, viewPort) {
let zoomRegion = new ZoomRegion(this, this._cursorRoot);
zoomRegion.setMagFactor(xMagFactor, yMagFactor);
zoomRegion.setViewPort(viewPort);
zoomRegion.setROI(roi);
// We ignore the redundant width/height on the ROI
let fixedROI = new Object(roi);
fixedROI.width = viewPort.width / xMagFactor;
fixedROI.height = viewPort.height / yMagFactor;
zoomRegion.setROI(fixedROI);
zoomRegion.addCrosshairs(this._crossHairs);
return zoomRegion;
},
@ -247,22 +250,9 @@ Magnifier.prototype = {
* Remove all the zoom regions from this Magnfier's ZoomRegion list.
*/
clearAllZoomRegions: function() {
// First ZoomRegion is special since its magnified mouse and crosshairs
// are the original -- all the others are Clutter.Clone's. Deal with
// all but first zoom region.
for (let i = 1; i < this._zoomRegions.length; i++) {
for (let i = 0; i < this._zoomRegions.length; i++)
this._zoomRegions[i].setActive(false);
this._zoomRegions[i].removeFromStage();
}
this._zoomRegions[0].setActive(false);
// Detach the (original) magnified mouse and cross hair for later reuse
// before removing ZoomRegion from the stage.
this._cursorRoot.get_parent().remove_actor(this._cursorRoot);
if (this._crossHairs)
this._crossHairs.removeFromParent();
this._zoomRegions[0].removeFromStage();
this._zoomRegions.length = 0;
this.stopTrackingMouse();
this.showSystemCursor();
@ -567,44 +557,35 @@ Magnifier.prototype = {
};
Signals.addSignalMethods(Magnifier.prototype);
function ZoomRegion(magnifier, mouseRoot) {
this._init(magnifier, mouseRoot);
function ZoomRegion(magnifier, mouseSourceActor) {
this._init(magnifier, mouseSourceActor);
}
ZoomRegion.prototype = {
_init: function(magnifier, mouseRoot) {
_init: function(magnifier, mouseSourceActor) {
this._magnifier = magnifier;
// The root actor for the zoom region
this._magView = new St.Bin({ style_class: 'magnifier-zoom-region', x_fill: true, y_fill: true });
global.stage.add_actor(this._magView);
this._magView.hide();
this._mouseTrackingMode = MouseTrackingMode.NONE;
this._clampScrollingAtEdges = false;
this._lensMode = false;
this._screenPosition = ScreenPosition.FULL_SCREEN;
// Append a Clutter.Group to clip the contents of the magnified view.
this._mainGroup = new Clutter.Group({ clip_to_allocation: true });
this._magView.set_child(this._mainGroup);
// Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through).
let background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
this._mainGroup.add_actor(background);
// Clone the group that contains all of UI on the screen. This is the
// chrome, the windows, etc.
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
this._mainGroup.add_actor(this._uiGroupClone);
Main.uiGroup.set_size(global.screen_width, global.screen_height);
background.set_size(global.screen_width, global.screen_height);
this._uiGroupClone.set_size(global.screen_width, global.screen_height);
// Add either the given mouseRoot to the ZoomRegion, or a clone of
// it.
if (mouseRoot.get_parent() != null)
this._mouseRoot = new Clutter.Clone({ source: mouseRoot });
else
this._mouseRoot = mouseRoot;
this._mainGroup.add_actor(this._mouseRoot);
this._magView = null;
this._uiGroupClone = null;
this._mouseSourceActor = mouseSourceActor;
this._mouseActor = null;
this._crossHairs = null;
this._crossHairsActor = null;
this._viewPortX = 0;
this._viewPortY = 0;
this._viewPortWidth = global.screen_width;
this._viewPortWidth = global.screen_height;
this._xCenter = this._viewPortWidth / 2;
this._yCenter = this._viewPortHeight / 2;
this._xMagFactor = 1;
this._yMagFactor = 1;
this._followingCursor = false;
},
/**
@ -612,14 +593,16 @@ ZoomRegion.prototype = {
* @activate: Boolean to show/hide the ZoomRegion.
*/
setActive: function(activate) {
if (activate) {
this._magView.show();
if (this.isMouseOverRegion())
if (activate && !this.isActive()) {
this._createActors();
if (this._isMouseOverRegion())
this._magnifier.hideSystemCursor();
this._updateMousePosition(false /* mouse didn't move */);
this._updateMagViewGeometry();
this._updateCloneGeometry();
this._updateMousePosition();
} else if (!activate && this.isActive()) {
this._destroyActors();
}
else
this._magView.hide();
},
/**
@ -627,18 +610,7 @@ ZoomRegion.prototype = {
* @return Whether this ZoomRegion is active (boolean).
*/
isActive: function() {
return this._magView.visible;
},
/**
* removeFromStage:
* Remove the magnified view from the stage.
*/
removeFromStage: function() {
global.stage.remove_actor(this._magView);
this._mouseRoot = null;
this._uiGroupClone = null;
this._magView = null;
return this._magView != null;
},
/**
@ -650,19 +622,9 @@ ZoomRegion.prototype = {
* of the magnified view.
*/
setMagFactor: function(xMagFactor, yMagFactor) {
if (xMagFactor > 0 && yMagFactor > 0) {
// Changing the mag factor moves the pixels along the axes of
// magnification. Set the view back to the point that was at the centre
// of the region of interest.
let [x, y, width, height] = this.getROI();
let xCentre = x + width / 2;
let yCentre = y + height / 2;
this._uiGroupClone.set_scale(xMagFactor, yMagFactor);
this._mouseRoot.set_scale(xMagFactor, yMagFactor);
this._calcRightBottomStops();
this._scrollToPosition(xCentre, yCentre);
this._updateMousePosition(false /* mouse didn't move */);
}
this._changeROI({ xMagFactor: xMagFactor,
yMagFactor: yMagFactor,
redoCursorTracking: this._followingCursor });
},
/**
@ -673,7 +635,7 @@ ZoomRegion.prototype = {
* in size, and so on.
*/
getMagFactor: function() {
return this._uiGroupClone.get_scale();
return [this._xMagFactor, this._yMagFactor];
},
/**
@ -696,29 +658,12 @@ ZoomRegion.prototype = {
/**
* setViewPort
* Sets the position and size of the ZoomRegion on screen.
* @viewPort: Object defining the position and size of the view port. It
* has the form { x, y, width, height }. The values are in
* @viewPort: Object defining the position and size of the view port.
* It has members x, y, width, height. The values are in
* stage coordinate space.
*/
setViewPort: function(viewPort) {
let [xRoi, yRoi, wRoi, hRoi] = this.getROI();
// Remove border if the view port is the entire screen. Otherwise,
// ensure that the border is there.
if (viewPort.x == 0 && viewPort.y == 0 && viewPort.width == global.screen_width && viewPort.height == global.screen_height)
this._magView.add_style_class_name('full-screen');
else
this._magView.remove_style_class_name('full-screen');
this.setSize(viewPort.width, viewPort.height);
this.setPosition(viewPort.x, viewPort.y);
if (this._crossHairs)
this._crossHairs.reCenter();
this.scrollContentsTo(xRoi + wRoi / 2, yRoi + hRoi / 2);
if (this.isMouseOverRegion())
this._magnifier.hideSystemCursor();
this._setViewPort(viewPort);
this._screenPosition = ScreenPosition.NONE;
},
@ -726,88 +671,18 @@ ZoomRegion.prototype = {
* setROI
* Sets the "region of interest" that the ZoomRegion is magnifying.
* @roi: Object that defines the region of the screen to magnify. It
* has the form { x, y, width, height }. The values are in
* has members x, y, width, height. The values are in
* screen (unmagnified) coordinate space.
*/
setROI: function(roi) {
let xRoiCenter = roi.x + roi.width / 2;
let yRoiCenter = roi.y + roi.height / 2;
this.scrollContentsTo(xRoiCenter, yRoiCenter);
},
if (roi.width <= 0 || roi.height <= 0)
return;
/**
* setSize:
* @width: The width to set the magnified view to.
* @height: The height to set the magnified view to.
*/
setSize: function(width, height) {
this._magView.set_size(width, height);
this._calcRightBottomStops();
},
/**
* getSize:
* @return an array, [width, height], that specifies the size of the
* magnified view.
*/
getSize: function() {
return this._magView.get_size();
},
/**
* setPosition:
* Position the magnified view at the given coordinates.
* @x: The x-coord of the new position.
* @y: The y-coord of the new position.
*/
setPosition: function(x, y) {
let [width, height] = this._magView.get_size();
if (this._clampScrollingAtEdges) {
// Restrict positioning so view doesn't go beyond any edge of the
// screen.
if (x < 0)
x = 0;
if (x + width > global.screen_width)
x = global.screen_width - width;
if (y < 0)
y = 0;
if (y + height > global.screen_height)
y = global.screen_height - height;
}
this._magView.set_position(x, y);
},
/**
* getPosition:
* @return an array, [x, y], that gives the position of the
* magnified view on screen.
*/
getPosition: function() {
return this._magView.get_position();
},
/**
* getCenter:
* @return an array, [x, y], that is half the width and height of the
* magnified view (the center of the magnified view).
*/
getCenter: function() {
let [width, height] = this._magView.get_size();
return [width / 2, height / 2];
},
/**
* isFullScreenMode:
* Does the magnified view occupy the whole screen?
*/
isFullScreenMode: function() {
let [x, y] = this._magView.get_position();
if (x != 0 || y != 0)
return false;
[width, height] = this._magView.get_size();
if (width != global.screen_width || height != global.screen_height)
return false;
return true;
this._followingCursor = false;
this._changeROI({ xMagFactor: this._viewPortWidth / roi.width,
yMagFactor: this._viewPortHeight / roi.height,
xCenter: roi.x + roi.width / 2,
yCenter: roi.y + roi.height / 2 });
},
/**
@ -819,24 +694,23 @@ ZoomRegion.prototype = {
* rectangle of what is shown in the magnified view.
*/
getROI: function() {
let [xMagnified, yMagnified] = this._uiGroupClone.get_position();
let [xMagFactor, yMagFactor] = this.getMagFactor();
let [width, height] = this.getSize();
let x = (0 - xMagnified) / xMagFactor;
let y = (0 - yMagnified) / yMagFactor;
return [x, y, width / xMagFactor, height / yMagFactor];
let roiWidth = this._viewPortWidth / this._xMagFactor;
let roiHeight = this._viewPortHeight / this._yMagFactor;
return [this._xCenter - roiWidth / 2,
this._yCenter - roiHeight / 2,
roiWidth, roiHeight];
},
/**
* setLensMode:
* Turn lens mode on/off. In full screen mode, lens mode is alway off since
* Turn lens mode on/off. In full screen mode, lens mode does nothing since
* a lens the size of the screen is pointless.
* @lensMode: A boolean to set the sense of lens mode.
*/
setLensMode: function(lensMode) {
let fullScreen = this.isFullScreenMode();
this._lensMode = (lensMode && !fullScreen);
if (!this._lensMode && !fullScreen)
this._lensMode = lensMode;
if (!this._lensMode)
this.setScreenPosition (this._screenPosition);
},
@ -857,6 +731,8 @@ ZoomRegion.prototype = {
*/
setClampScrollingAtEdges: function(clamp) {
this._clampScrollingAtEdges = clamp;
if (clamp)
this._changeROI();
},
/**
@ -869,7 +745,7 @@ ZoomRegion.prototype = {
viewPort.y = 0;
viewPort.width = global.screen_width;
viewPort.height = global.screen_height/2;
this.setViewPort(viewPort);
this._setViewPort(viewPort);
this._screenPosition = ScreenPosition.TOP_HALF;
},
@ -883,7 +759,7 @@ ZoomRegion.prototype = {
viewPort.y = global.screen_height/2;
viewPort.width = global.screen_width;
viewPort.height = global.screen_height/2;
this.setViewPort(viewPort);
this._setViewPort(viewPort);
this._screenPosition = ScreenPosition.BOTTOM_HALF;
},
@ -897,7 +773,7 @@ ZoomRegion.prototype = {
viewPort.y = 0;
viewPort.width = global.screen_width/2;
viewPort.height = global.screen_height;
this.setViewPort(viewPort);
this._setViewPort(viewPort);
this._screenPosition = ScreenPosition.LEFT_HALF;
},
@ -911,62 +787,24 @@ ZoomRegion.prototype = {
viewPort.y = 0;
viewPort.width = global.screen_width/2;
viewPort.height = global.screen_height;
this.setViewPort(viewPort);
this._setViewPort(viewPort);
this._screenPosition = ScreenPosition.RIGHT_HALF;
},
/**
* getScreenPosition:
* Tell the outside world what the current mode is -- magnifiying the
* top half, bottom half, etc.
* @return: the current mode.
*/
getScreenPosition: function() {
return this._screenPosition;
},
/**
* scrollToMousePos:
* Set the region of interest based on the position of the system pointer.
* @return: Whether the system mouse pointer is over the magnified view.
*/
scrollToMousePos: function() {
let [xMouse, yMouse, mask] = global.get_pointer();
if (this._mouseTrackingMode == MouseTrackingMode.PROPORTIONAL) {
this._setROIProportional(xMouse, yMouse);
}
else if (this._mouseTrackingMode == MouseTrackingMode.PUSH) {
this._setROIPush(xMouse, yMouse);
}
else if (this._mouseTrackingMode == MouseTrackingMode.CENTERED) {
this._setROICentered(xMouse, yMouse);
}
this._updateMousePosition(true);
// Determine whether the system mouse pointer is over this zoom region.
return this.isMouseOverRegion(xMouse, yMouse);
},
/**
* setFullScreenMode:
* Set the ZoomRegion to full-screen mode.
* Note: disallows lens mode.
*/
setFullScreenMode: function() {
if (!this.isFullScreenMode()) {
let viewPort = {};
viewPort.x = 0;
viewPort.y = 0;
viewPort.width = global.screen_width;
viewPort.height = global.screen_height;
this.setViewPort(viewPort);
this.setLensMode(false);
if (this.isActive())
this._magnifier.hideSystemCursor();
let viewPort = {};
viewPort.x = 0;
viewPort.y = 0;
viewPort.width = global.screen_width;
viewPort.height = global.screen_height;
this.setViewPort(viewPort);
this._screenPosition = ScreenPosition.FULL_SCREEN;
}
this._screenPosition = ScreenPosition.FULL_SCREEN;
},
/**
@ -997,111 +835,241 @@ ZoomRegion.prototype = {
}
},
/**
* getScreenPosition:
* Tell the outside world what the current mode is -- magnifiying the
* top half, bottom half, etc.
* @return: the current mode.
*/
getScreenPosition: function() {
return this._screenPosition;
},
/**
* scrollToMousePos:
* Set the region of interest based on the position of the system pointer.
* @return: Whether the system mouse pointer is over the magnified view.
*/
scrollToMousePos: function() {
this._followingCursor = true;
if (this._mouseTrackingMode != MouseTrackingMode.NONE)
this._changeROI({ redoCursorTracking: true });
else
this._updateMousePosition();
// Determine whether the system mouse pointer is over this zoom region.
return this._isMouseOverRegion();
},
/**
* scrollContentsTo:
* Shift the contents of the magnified view such it is centered on the given
* coordinate. Also, update the position of the magnified mouse image after
* the shift.
* coordinate.
* @x: The x-coord of the point to center on.
* @y: The y-coord of the point to center on.
*/
scrollContentsTo: function(x, y) {
this._scrollToPosition(x, y);
this._updateMousePosition(false /* mouse didn't move */);
},
/**
* isMouseOverRegion:
* Return whether the system mouse sprite is over this ZoomRegion. If the
* mouse's position is not given, then it is fetched.
* @xMouse: The system mouse's x-coord. Optional.
* @yMouse: The system mouse's y-coord. Optional.
* @return: Boolean: true if the mouse is over the zoom region; false
* otherwise.
*/
isMouseOverRegion: function(xMouse, yMouse) {
let mouseIsOver = false;
if (this.isActive()) {
if (!xMouse || !yMouse) {
let [x, y, mask] = global.get_pointer();
xMouse = x;
yMouse = y;
}
let [x, y] = this.getPosition();
let [width, height] = this.getSize();
mouseIsOver = (
xMouse >= x && xMouse < (x + width) &&
yMouse >= y && yMouse < (y + height)
);
}
return mouseIsOver;
this._followingCursor = false;
this._changeROI({ xCenter: x,
yCenter: y });
},
/**
* addCrosshairs:
* Add crosshairs centered on the magnified mouse.
* @crossHairs Clutter.Group that contains the actors for the crosshairs.
* @crossHairs: Crosshairs instance
*/
addCrosshairs: function(crossHairs) {
this._crossHairs = crossHairs;
// If the crossHairs is not already within a larger container, add it
// to this zoom region. Otherwise, add a clone.
if (crossHairs) {
this._crosshairsActor = crossHairs.addToZoomRegion(this, this._mouseRoot);
this._crossHairs = crossHairs;
if (crossHairs && this.isActive()) {
this._crossHairsActor = crossHairs.addToZoomRegion(this, this._mouseActor);
}
},
//// Private methods ////
_scrollToPosition: function(x, y) {
// Given the point (x, y) in non-magnified coordinates, scroll the
// magnified contenst such that the point is at the centre of the
// magnified view.
let [xMagFactor, yMagFactor] = this.getMagFactor();
let xMagnified = x * xMagFactor;
let yMagnified = y * yMagFactor;
_createActors: function() {
// The root actor for the zoom region
this._magView = new St.Bin({ style_class: 'magnifier-zoom-region', x_fill: true, y_fill: true });
global.stage.add_actor(this._magView);
let [xCenterMagView, yCenterMagView] = this.getCenter();
let newX = xCenterMagView - xMagnified;
let newY = yCenterMagView - yMagnified;
// hide the magnified region from CLUTTER_PICK_ALL
Shell.util_set_hidden_from_pick (this._magView, true);
// Append a Clutter.Group to clip the contents of the magnified view.
let mainGroup = new Clutter.Group({ clip_to_allocation: true });
this._magView.set_child(mainGroup);
// Add a background for when the magnified uiGroup is scrolled
// out of view (don't want to see desktop showing through).
let background = new Clutter.Rectangle({ color: Main.DEFAULT_BACKGROUND_COLOR });
mainGroup.add_actor(background);
// Clone the group that contains all of UI on the screen. This is the
// chrome, the windows, etc.
this._uiGroupClone = new Clutter.Clone({ source: Main.uiGroup });
mainGroup.add_actor(this._uiGroupClone);
Main.uiGroup.set_size(global.screen_width, global.screen_height);
background.set_size(global.screen_width, global.screen_height);
// Add either the given mouseSourceActor to the ZoomRegion, or a clone of
// it.
if (this._mouseSourceActor.get_parent() != null)
this._mouseActor = new Clutter.Clone({ source: this._mouseSourceActor });
else
this._mouseActor = this._mouseSourceActor;
mainGroup.add_actor(this._mouseActor);
if (this._crossHairs)
this._crossHairsActor = this._crossHairs.addToZoomRegion(this, this._mouseActor);
else
this._crossHairsActor = null;
},
_destroyActors: function() {
if (this._mouseActor == this._mouseSourceActor)
this._mouseActor.get_parent().remove_actor (this._mouseActor);
if (this._crossHairs)
this._crossHairs.removeFromParent(this._crossHairsActor);
this._magView.destroy();
this._magView = null;
this._uiGroupClone = null;
this._mouseActor = null;
this._crossHairsActor = null;
},
_setViewPort: function(viewPort, fromROIUpdate) {
// Sets the position of the zoom region on the screen
let width = Math.round(Math.min(viewPort.width, global.screen_width));
let height = Math.round(Math.min(viewPort.height, global.screen_height));
let x = Math.max(viewPort.x, 0);
let y = Math.max(viewPort.y, 0);
x = Math.round(Math.min(x, global.screen_width - width));
y = Math.round(Math.min(y, global.screen_height - height));
this._viewPortX = x;
this._viewPortY = y;
this._viewPortWidth = width;
this._viewPortHeight = height;
this._updateMagViewGeometry();
if (!fromROIUpdate)
this._changeROI({ redoCursorTracking: this._followingCursor }); // will update mouse
if (this.isActive() && this._isMouseOverRegion())
this._magnifier.hideSystemCursor();
},
_changeROI: function(params) {
// Updates the area we are viewing; the magnification factors
// and center can be set explicitly, or we can recompute
// the position based on the mouse cursor position
params = Params.parse(params, { xMagFactor: this._xMagFactor,
yMagFactor: this._yMagFactor,
xCenter: this._xCenter,
yCenter: this._yCenter,
redoCursorTracking: false });
if (params.xMagFactor <= 0)
params.xMagFactor = this._xMagFactor;
if (params.yMagFactor <= 0)
params.yMagFactor = this._yMagFactor;
this._xMagFactor = params.xMagFactor;
this._yMagFactor = params.yMagFactor;
if (params.redoCursorTracking &&
this._mouseTrackingMode != MouseTrackingMode.NONE) {
// This depends on this.xMagFactor/yMagFactor already being updated
[params.xCenter, params.yCenter] = this._centerFromMousePosition();
}
if (this._clampScrollingAtEdges) {
if (newX > 0)
newX = 0;
else if (newX < this._rightStop)
newX = this._rightStop;
if (newY > 0)
newY = 0;
else if (newY < this._bottomStop)
newY = this._bottomStop;
this._uiGroupClone.set_position(newX, newY);
let roiWidth = this._viewPortWidth / this._xMagFactor;
let roiHeight = this._viewPortHeight / this._yMagFactor;
params.xCenter = Math.min(params.xCenter, global.screen_width - roiWidth / 2);
params.xCenter = Math.max(params.xCenter, roiWidth / 2);
params.yCenter = Math.min(params.yCenter, global.screen_height - roiHeight / 2);
params.yCenter = Math.max(params.yCenter, roiHeight / 2);
}
else
this._uiGroupClone.set_position(newX, newY);
this._xCenter = params.xCenter;
this._yCenter = params.yCenter;
// If in lens mode, move the magnified view such that it is centered
// over the actual mouse. However, in full screen mode, the "lens" is
// the size of the screen -- pointless to move such a large lens around.
if (this._lensMode && !this.isFullScreenMode())
this.setPosition(x - xCenterMagView, y - yCenterMagView);
if (this._lensMode && !this._isFullScreen())
this._setViewPort({ x: this._xCenter - this._viewPortWidth / 2,
y: this._yCenter - this._viewPortHeight / 2,
width: this._viewPortWidth,
height: this._viewPortHeight }, true);
this._updateCloneGeometry();
this._updateMousePosition();
},
_calcRightBottomStops: function() {
// Calculate the location of the top-left corner of _uiGroupClone
// when its right and bottom edges are coincident with the right and
// bottom edges of the _magView.
let [contentWidth, contentHeight] = this._uiGroupClone.get_size();
let [viewWidth, viewHeight] = this.getSize();
let [xMagFactor, yMagFactor] = this.getMagFactor();
let rightStop = viewWidth - (contentWidth * xMagFactor);
let bottomStop = viewHeight - (contentHeight * yMagFactor);
this._rightStop = parseInt(rightStop.toFixed(1));
this._bottomStop = parseInt(bottomStop.toFixed(1));
_isMouseOverRegion: function() {
// Return whether the system mouse sprite is over this ZoomRegion. If the
// mouse's position is not given, then it is fetched.
let mouseIsOver = false;
if (this.isActive()) {
let xMouse = this._magnifier.xMouse;
let yMouse = this._magnifier.yMouse;
mouseIsOver = (
xMouse >= this._viewPortX && xMouse < (this._viewPortX + this._viewPortWidth) &&
yMouse >= this._viewPortY && yMouse < (this._viewPortY + this._viewPortHeight)
);
}
return mouseIsOver;
},
_setROIPush: function(xMouse, yMouse) {
_isFullScreen: function() {
// Does the magnified view occupy the whole screen? Note that this
// doesn't necessarily imply
// this._screenPosition = ScreenPosition.FULL_SCREEN;
if (this._viewPortX != 0 || this._viewPortY != 0)
return false;
if (this._viewPortWidth != global.screen_width ||
this._viewPortHeight != global.screen_height)
return false;
return true;
},
_centerFromMousePosition: function() {
// Determines where the center should be given the current cursor
// position and mouse tracking mode
let xMouse = this._magnifier.xMouse;
let yMouse = this._magnifier.yMouse;
if (this._mouseTrackingMode == MouseTrackingMode.PROPORTIONAL) {
return this._centerFromMouseProportional(xMouse, yMouse);
}
else if (this._mouseTrackingMode == MouseTrackingMode.PUSH) {
return this._centerFromMousePush(xMouse, yMouse);
}
else if (this._mouseTrackingMode == MouseTrackingMode.CENTERED) {
return this._centerFromMouseCentered(xMouse, yMouse);
}
return null; // Should never be hit
},
_centerFromMousePush: function(xMouse, yMouse) {
let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
let [cursorWidth, cursorHeight] = this._mouseRoot.get_size();
let [cursorWidth, cursorHeight] = this._mouseSourceActor.get_size();
let xPos = xRoi + widthRoi / 2;
let yPos = yRoi + heightRoi / 2;
let xRoiRight = xRoi + widthRoi - cursorWidth;
@ -1117,58 +1085,79 @@ ZoomRegion.prototype = {
else if (yMouse > yRoiBottom)
yPos += (yMouse - yRoiBottom);
this._scrollToPosition(xPos, yPos);
return [xPos, yPos];
},
_setROIProportional: function(xMouse, yMouse) {
_centerFromMouseProportional: function(xMouse, yMouse) {
let [xRoi, yRoi, widthRoi, heightRoi] = this.getROI();
let halfScreenWidth = global.screen_width / 2;
let halfScreenHeight = global.screen_height / 2;
let xProportion = (halfScreenWidth - xMouse) / halfScreenWidth;
let yProportion = (halfScreenHeight - yMouse) / halfScreenHeight;
let xPos = xMouse + xProportion * widthRoi / 2;
let yPos = yMouse + yProportion * heightRoi / 2;
// We want to pad with a constant distance after zooming, so divide
// by the magnification factor.
let unscaledPadding = Math.min(this._viewPortWidth, this._viewPortHeight) / 5;
let xPadding = unscaledPadding / this._xMagFactor;
let yPadding = unscaledPadding / this._yMagFactor;
let xProportion = (xMouse - halfScreenWidth) / halfScreenWidth; // -1 ... 1
let yProportion = (yMouse - halfScreenHeight) / halfScreenHeight; // -1 ... 1
let xPos = xMouse - xProportion * (widthRoi / 2 - xPadding);
let yPos = yMouse - yProportion * (heightRoi /2 - yPadding);
this._scrollToPosition(xPos, yPos);
return [xPos, yPos];
},
_setROICentered: function(xMouse, yMouse) {
this._scrollToPosition(xMouse, yMouse);
_centerFromMouseCentered: function(xMouse, yMouse) {
return [xMouse, yMouse];
},
_updateMousePosition: function(mouseMoved) {
let [x, y] = this._uiGroupClone.get_position();
x = parseInt(x.toFixed(1));
y = parseInt(y.toFixed(1));
let [xCenterMagView, yCenterMagView] = this.getCenter();
let [xMouse, yMouse, mask] = global.get_pointer();
let [xMagFactor, yMagFactor] = this.getMagFactor();
let xMagMouse = xMouse * xMagFactor + x;
let yMagMouse = yMouse * yMagFactor + y;
if (mouseMoved) {
if (x == 0)
xMagMouse = xMouse * xMagFactor;
else if (x == this._rightStop)
xMagMouse = (xMouse * xMagFactor) + this._rightStop;
else if (this._mouseTrackingMode == MouseTrackingMode.CENTERED)
xMagMouse = xCenterMagView;
if (y == 0)
yMagMouse = yMouse * yMagFactor;
else if (y == this._bottomStop)
yMagMouse = (yMouse * yMagFactor) + this._bottomStop;
else if (this._mouseTrackingMode == MouseTrackingMode.CENTERED)
yMagMouse = yCenterMagView;
}
this._mouseRoot.set_position(xMagMouse, yMagMouse);
this._updateCrosshairsPosition(xMagMouse, yMagMouse);
_screenToViewPort: function(screenX, screenY) {
// Converts coordinates relative to the (unmagnified) screen to coordinates
// relative to the origin of this._magView
return [this._viewPortWidth / 2 + (screenX - this._xCenter) * this._xMagFactor,
this._viewPortHeight / 2 + (screenY - this._yCenter) * this._yMagFactor];
},
_updateCrosshairsPosition: function(x, y) {
if (this._crosshairsActor) {
let [groupWidth, groupHeight] = this._crosshairsActor.get_size();
this._crosshairsActor.set_position(x - groupWidth / 2, y - groupHeight / 2);
_updateMagViewGeometry: function() {
if (!this.isActive())
return;
if (this._isFullScreen())
this._magView.add_style_class_name('full-screen');
else
this._magView.remove_style_class_name('full-screen');
this._magView.set_size(this._viewPortWidth, this._viewPortHeight);
this._magView.set_position(this._viewPortX, this._viewPortY);
},
_updateCloneGeometry: function() {
if (!this.isActive())
return;
this._uiGroupClone.set_scale(this._xMagFactor, this._yMagFactor);
this._mouseActor.set_scale(this._xMagFactor, this._yMagFactor);
let [x, y] = this._screenToViewPort(0, 0);
this._uiGroupClone.set_position(x, y);
this._updateMousePosition();
},
_updateMousePosition: function() {
if (!this.isActive())
return;
let [xMagMouse, yMagMouse] = this._screenToViewPort(this._magnifier.xMouse,
this._magnifier.yMouse);
xMagMouse = Math.round(xMagMouse);
yMagMouse = Math.round(yMagMouse);
this._mouseActor.set_position(xMagMouse, yMagMouse);
if (this._crossHairsActor) {
let [groupWidth, groupHeight] = this._crossHairsActor.get_size();
this._crossHairsActor.set_position(xMagMouse - groupWidth / 2,
yMagMouse - groupHeight / 2);
}
}
};
@ -1243,10 +1232,15 @@ Crosshairs.prototype = {
/**
* removeFromParent:
* Remove the crosshairs actor from its parent container.
* @childActor: the actor returned from addToZoomRegion
* Remove the crosshairs actor from its parent container, or destroy the
* child actor if it was just a clone of the crosshairs actor.
*/
removeFromParent: function() {
this._actor.get_parent().remove_actor(this._actor);
removeFromParent: function(childActor) {
if (childActor == this._actor)
childActor.get_parent().remove_actor(childActor);
else
childActor.destroy();
},
/**

View File

@ -112,6 +112,11 @@ ShellMagnifier.prototype = {
* [left, top, right, bottom].
* @viewPort Array of integers, [left, top, right, bottom] that defines
* the position of the ZoomRegion on screen.
*
* FIXME: The arguments here are redundant, since the width and height of
* the ROI are determined by the viewport and magnification factors.
* We ignore the passed in width and height.
*
* @return The newly created ZoomRegion.
*/
createZoomRegion: function(xMagFactor, yMagFactor, roi, viewPort) {

View File

@ -17,8 +17,11 @@ const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Chrome = imports.ui.chrome;
const CtrlAltTab = imports.ui.ctrlAltTab;
const Environment = imports.ui.environment;
const ExtensionSystem = imports.ui.extensionSystem;
const MessageTray = imports.ui.messageTray;
@ -50,6 +53,7 @@ let messageTray = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let telepathyClient = null;
let ctrlAltTabManager = null;
let recorder = null;
let shellDBusService = null;
let modalCount = 0;
@ -135,6 +139,10 @@ function start() {
notificationDaemon = new NotificationDaemon.NotificationDaemon();
windowAttentionHandler = new WindowAttentionHandler.WindowAttentionHandler();
telepathyClient = new TelepathyClient.Client();
panel.startStatusArea();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
ctrlAltTabManager.addGroup(panel.actor, _("Panel"), 'gnome-panel');
_startDate = new Date();
@ -329,6 +337,14 @@ function _globalKeyPressHandler(actor, event) {
case Meta.KeyBindingAction.COMMAND_2:
getRunDialog().open();
return true;
case Meta.KeyBindingAction.SWITCH_PANELS:
// Only intercept this when we're in the overview, and don't
// intercept it if something beyond that (like, say, the
// ctrl-alt-tab popup!) is visible
if (overview.visible && modalCount == 1) {
ctrlAltTabManager.popup(modifierState & Clutter.ModifierType.SHIFT_MASK);
return true;
}
}
return false;
@ -349,13 +365,13 @@ function _findModal(actor) {
* @actor: #ClutterActor which will be given keyboard focus
*
* Ensure we are in a mode where all keyboard and mouse input goes to
* the stage. Multiple calls to this function act in a stacking fashion;
* the effect will be undone when an equal number of popModal() invocations
* have been made.
* the stage, and focus @actor. Multiple calls to this function act in
* a stacking fashion; the effect will be undone when an equal number
* of popModal() invocations have been made.
*
* Next, record the current Clutter keyboard focus on a stack. If the modal stack
* returns to this actor, reset the focus to the actor which was focused
* at the time pushModal() was invoked.
* Next, record the current Clutter keyboard focus on a stack. If the
* modal stack returns to this actor, reset the focus to the actor
* which was focused at the time pushModal() was invoked.
*
* Returns: true iff we successfully acquired a grab or already had one
*/
@ -385,7 +401,7 @@ function pushModal(actor) {
}
modalActorFocusStack.push([actor, curFocus]);
global.stage.set_key_focus(null);
global.stage.set_key_focus(actor);
return true;
}
@ -415,6 +431,7 @@ function popModal(actor) {
if (modalCount > 0)
return;
global.stage.set_key_focus(null);
global.end_modal(global.get_current_time());
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
}

View File

@ -1,6 +1,8 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
@ -14,6 +16,7 @@ const Tweener = imports.ui.tweener;
const Main = imports.ui.main;
const BoxPointer = imports.ui.boxpointer;
const Params = imports.misc.params;
const Utils = imports.misc.utils;
const ANIMATION_TIME = 0.2;
const NOTIFICATION_TIMEOUT = 4;
@ -35,15 +38,132 @@ const State = {
HIDING: 3
};
function _cleanMarkup(text) {
// Support &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
// occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&amp;');
// Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup.
return _text.replace(/<(\/?[^biu]>|[^>\/][^>])/g, '&lt;$1');
function _fixMarkup(text, allowMarkup) {
if (allowMarkup) {
// Support &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
// occurrences of '&'.
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&amp;');
// Support <b>, <i>, and <u>, escape anything else
// so it displays as raw markup.
return _text.replace(/<(\/?[^biu]>|[^>\/][^>])/g, '&lt;$1');
} else {
// Escape everything
let _text = text.replace(/&/g, '&amp;');
return _text.replace(/</g, '&lt;');
}
}
function URLHighlighter(text, lineWrap, allowMarkup) {
this._init(text, lineWrap, allowMarkup);
}
URLHighlighter.prototype = {
_init: function(text, lineWrap, allowMarkup) {
if (!text)
text = '';
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter' });
this._linkColor = '#ccccff';
this.actor.connect('style-changed', Lang.bind(this, function() {
let color = new Clutter.Color();
let hasColor = this.actor.get_theme_node().get_color('link-color', color);
if (hasColor) {
let linkColor = color.to_string().substr(0, 7);
if (linkColor != this._linkColor) {
this._linkColor = linkColor;
this._highlightUrls();
}
}
}));
if (lineWrap) {
this.actor.clutter_text.line_wrap = true;
this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
this.actor.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
}
this.setMarkup(text, allowMarkup);
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
let urlId = this._findUrlAtPos(event);
if (urlId != -1) {
let url = this._urls[urlId].url;
if (url.indexOf(':') == -1)
url = 'http://' + url;
try {
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context());
return true;
} catch (e) {
// TODO: remove this after gnome 3 release
let p = new Shell.Process({ 'args' : ['gvfs-open', url] });
p.run();
return true;
}
}
return false;
}));
this.actor.connect('motion-event', Lang.bind(this, function(actor, event) {
let urlId = this._findUrlAtPos(event);
if (urlId != -1 && !this._cursorChanged) {
global.set_cursor(Shell.Cursor.POINTING_HAND);
this._cursorChanged = true;
} else if (urlId == -1) {
global.unset_cursor();
this._cursorChanged = false;
}
return false;
}));
this.actor.connect('leave-event', Lang.bind(this, function() {
if (this._cursorChanged) {
this._cursorChanged = false;
global.unset_cursor();
}
}));
},
setMarkup: function(text, allowMarkup) {
text = text ? _fixMarkup(text, allowMarkup) : '';
this._text = text;
this.actor.clutter_text.set_markup(text);
/* clutter_text.text contain text without markup */
this._urls = Utils.findUrls(this.actor.clutter_text.text);
this._highlightUrls();
},
_highlightUrls: function() {
// text here contain markup
let urls = Utils.findUrls(this._text);
let markup = '';
let pos = 0;
for (let i = 0; i < urls.length; i++) {
let url = urls[i];
let str = this._text.substr(pos, url.pos - pos);
markup += str + '<span foreground="' + this._linkColor + '"><u>' + url.url + '</u></span>';
pos = url.pos + url.url.length;
}
markup += this._text.substr(pos);
this.actor.clutter_text.set_markup(markup);
},
_findUrlAtPos: function(event) {
let success;
let [x, y] = event.get_coords();
[success, x, y] = this.actor.transform_stage_point(x, y);
let find_pos = -1;
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
if (py > y || py + line_height < y || x < px)
continue;
find_pos = i;
}
if (find_pos != -1) {
for (let i = 0; i < this._urls.length; i++)
if (find_pos >= this._urls[i].pos &&
this._urls[i].pos + this._urls[i].url.length > find_pos)
return i;
}
return -1;
}
};
// Notification:
// @source: the notification's Source
// @title: the title
@ -73,7 +193,8 @@ function _cleanMarkup(text) {
// area.
//
// @params can contain values for 'customContent', 'body', 'icon',
// and 'clear' parameters.
// 'titleMarkup', 'bannerMarkup', 'bodyMarkup', and 'clear'
// parameters.
//
// If @params contains a 'customContent' parameter with the value %true,
// then @banner will not be shown in the body of the notification when the
@ -87,6 +208,12 @@ function _cleanMarkup(text) {
// source.createNotificationIcon(). However, if @params contains an 'icon'
// parameter, the passed in icon will be used.
//
// If @params contains a 'titleMarkup', 'bannerMarkup', or
// 'bodyMarkup' parameter with the value %true, then the corresponding
// element is assumed to use pango markup. If the parameter is not
// present for an element, then anything that looks like markup in
// that element will appear literally in the output.
//
// If @params contains a 'clear' parameter with the value %true, then
// the content and the action area of the notification will be cleared.
// The content area is also always cleared if 'customContent' is false
@ -99,10 +226,14 @@ Notification.prototype = {
_init: function(source, title, banner, params) {
this.source = source;
this.urgent = false;
this.resident = false;
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
this.isTransient = false;
this.expanded = false;
this._useActionIcons = false;
this._customContent = false;
this._bannerBodyText = null;
this._bannerBodyMarkup = false;
this._titleFitsInBannerMode = true;
this._spacing = 0;
@ -114,7 +245,6 @@ Notification.prototype = {
this._prevFocusedWindow = null;
this._prevKeyFocusActor = null;
this._focusWindowChangedId = 0;
this._focusActorChangedId = 0;
this._stageInputModeChangedId = 0;
this._capturedEventId = 0;
@ -129,7 +259,7 @@ Notification.prototype = {
function (actor, event) {
if (!this._actionArea ||
!this._actionArea.contains(event.get_source()))
this.emit('clicked');
this._onClicked();
}));
// The first line should have the title, followed by the
@ -148,7 +278,8 @@ Notification.prototype = {
this._titleLabel = new St.Label();
this._bannerBox.add_actor(this._titleLabel);
this._bannerLabel = new St.Label();
this._bannerUrlHighlighter = new URLHighlighter();
this._bannerLabel = this._bannerUrlHighlighter.actor;
this._bannerBox.add_actor(this._bannerLabel);
this.update(title, banner, params);
@ -175,6 +306,9 @@ Notification.prototype = {
params = Params.parse(params, { customContent: false,
body: null,
icon: null,
titleMarkup: false,
bannerMarkup: false,
bodyMarkup: false,
clear: false });
this._customContent = params.customContent;
@ -205,7 +339,7 @@ Notification.prototype = {
y_fill: false,
y_align: St.Align.START });
title = title ? _cleanMarkup(title.replace(/\n/g, ' ')) : '';
title = title ? _fixMarkup(title.replace(/\n/g, ' '), params.titleMarkup) : '';
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
// Unless the notification has custom content, we save this._bannerBodyText
@ -213,9 +347,11 @@ Notification.prototype = {
// expandable due to other elements in its content area or due to the banner
// not fitting fully in the single-line mode.
this._bannerBodyText = this._customContent ? null : banner;
this._bannerBodyMarkup = params.bannerMarkup;
banner = banner ? _cleanMarkup(banner.replace(/\n/g, ' ')) : '';
this._bannerLabel.clutter_text.set_markup(banner);
banner = banner ? banner.replace(/\n/g, ' ') : '';
this._bannerUrlHighlighter.setMarkup(banner, params.bannerMarkup);
this._bannerLabel.queue_relayout();
// Add the bannerBody now if we know for sure we'll need it
@ -223,7 +359,7 @@ Notification.prototype = {
this._addBannerBody();
if (params.body)
this.addBody(params.body);
this.addBody(params.body, params.bodyMarkup);
this._updated();
},
@ -231,7 +367,7 @@ Notification.prototype = {
// @actor: actor to add to the body of the notification
//
// Appends @actor to the notification's body
addActor: function(actor) {
addActor: function(actor, style) {
if (!this._scrollArea) {
this.actor.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
@ -248,34 +384,30 @@ Notification.prototype = {
this._addBannerBody();
}
this._contentArea.add(actor);
this._contentArea.add(actor, style ? style : {});
this._updated();
},
// addBody:
// @text: the text
// @markup: %true if @text contains pango markup
// @style: style to use when adding the actor containing the text
//
// Adds a multi-line label containing @text to the notification.
//
// Return value: the newly-added label
addBody: function(text) {
let body = new St.Label();
body.clutter_text.line_wrap = true;
body.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
addBody: function(text, markup, style) {
let label = new URLHighlighter(text, true, markup);
text = text ? _cleanMarkup(text) : '';
body.clutter_text.set_markup(text);
this.addActor(body);
return body;
this.addActor(label.actor, style);
return label.actor;
},
_addBannerBody: function() {
if (this._bannerBodyText) {
let text = this._bannerBodyText;
this._bannerBodyText = null;
this.addBody(text);
this.addBody(text, this._bannerBodyMarkup);
}
},
@ -354,7 +486,7 @@ Notification.prototype = {
}
this._buttonBox.add(button);
button.connect('clicked', Lang.bind(this, function() { this.emit('action-invoked', id); }));
button.connect('clicked', Lang.bind(this, this._onActionInvoked, id));
this._updated();
},
@ -362,6 +494,14 @@ Notification.prototype = {
this.urgent = urgent;
},
setResident: function(resident) {
this.resident = resident;
},
setTransient: function(isTransient) {
this.isTransient = isTransient;
},
setUseActionIcons: function(useIcons) {
this._useActionIcons = useIcons;
},
@ -483,29 +623,16 @@ Notification.prototype = {
let metaDisplay = global.screen.get_display();
this._prevFocusedWindow = metaDisplay.focus_window;
this._prevKeyFocus = global.stage.get_key_focus();
this._prevKeyFocusActor = global.stage.get_key_focus();
// We need to use the captured event in the overview, because we don't want to change the stage input mode to
// FOCUSED there. On the other hand, using the captured event doesn't work correctly in the main view because
// it doesn't allow focusing the windows again correctly. So we are using the FOCUSED stage input mode in the
// main view.
if (Main.overview.visible) {
if (!Main.pushModal(this.actor))
return;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
} else {
if (!Main.overview.visible)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
this._stageInputModeChangedId = global.connect('notify::stage-input-mode', Lang.bind(this, this._stageInputModeChanged));
// Use captured-event to notice clicks outside the notification
// without consuming them.
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._keyPressId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPress));
}
// We need to listen to this signal in the overview, as well as in the main view, to make the key bindings such as
// Alt+F2 work. When a notification has key focus, which is the case with chat notifications, all captured KEY_PRESS
// events have the actor with the key focus as their source. This makes it impossible to distinguish between the chat
// window input and the key bindings based solely on the KEY_PRESS event.
this._stageInputModeChangedId = global.connect('notify::stage-input-mode', Lang.bind(this, this._stageInputModeChanged));
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
this._hasFocus = true;
@ -513,19 +640,6 @@ Notification.prototype = {
Main.messageTray.lock();
},
_focusWindowChanged: function() {
let metaDisplay = global.screen.get_display();
// this._focusWindowChanged() will be called when we call
// global.set_stage_input_mode(Shell.StageInputMode.FOCUSED) ,
// however metaDisplay.focus_window will be null in that case. We only
// want to ungrab focus if the focus has been moved to an application
// window.
if (metaDisplay.focus_window) {
this._prevFocusedWindow = null;
this.ungrabFocus();
}
},
_focusActorChanged: function() {
let focusedActor = global.stage.get_key_focus();
if (!focusedActor || !this.actor.contains(focusedActor)) {
@ -535,15 +649,6 @@ Notification.prototype = {
},
_stageInputModeChanged: function() {
let focusedActor = global.stage.get_key_focus();
// TODO: We need to set this._prevFocusedWindow to null in order to
// get the cursor in the run dialog. However, that also means it's
// set to null when the application menu is activated, which defeats
// the point of keeping the name of the previously focused application
// in the panel. It'd be good to be able to distinguish between these
// two cases.
this._prevFocusedWindow = null;
this._prevKeyFocusActor = null;
this.ungrabFocus();
},
@ -566,6 +671,28 @@ Notification.prototype = {
return false;
},
_onActionInvoked: function(actor, id) {
this.emit('action-invoked', id);
if (!this.resident) {
// We don't hide a resident notification when the user invokes one of its actions,
// because it is common for such notifications to update themselves with new
// information based on the action. We'd like to display the updated information
// in place, rather than pop-up a new notification.
this.emit('done-displaying');
this.destroy();
}
},
_onClicked: function() {
this.emit('clicked');
// We hide all types of notifications once the user clicks on them because the common
// outcome of clicking should be the relevant window being brought forward and the user's
// attention switching to the window.
this.emit('done-displaying');
if (!this.resident)
this.destroy();
},
_onKeyPress: function(actor, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.Escape) {
@ -580,10 +707,6 @@ Notification.prototype = {
return;
let metaDisplay = global.screen.get_display();
if (this._focusWindowChangedId > 0) {
metaDisplay.disconnect(this._focusWindowChangedId);
this._focusWindowChangedId = 0;
}
if (this._focusActorChangedId > 0) {
global.stage.disconnect(this._focusActorChangedId);
@ -596,20 +719,14 @@ Notification.prototype = {
}
if (this._capturedEventId > 0) {
Main.popModal(this.actor);
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
if (this._keyPressId > 0) {
global.stage.disconnect(this._keyPressId);
this._keyPressId = 0;
}
this._hasFocus = false;
Main.messageTray.unlock();
if (this._prevFocusedWindow) {
if (this._prevFocusedWindow && !metaDisplay.focus_window) {
metaDisplay.set_input_focus_window(this._prevFocusedWindow, false, global.get_current_time());
this._prevFocusedWindow = null;
}
@ -651,6 +768,11 @@ Source.prototype = {
this.title = title;
this._iconBin = new St.Bin({ width: this.ICON_SIZE,
height: this.ICON_SIZE });
this.isTransient = false;
},
setTransient: function(isTransient) {
this.isTransient = isTransient;
},
// Called to create a new icon actor (of size this.ICON_SIZE).
@ -681,6 +803,7 @@ Source.prototype = {
this.notification = null;
this._notificationDestroyedId = 0;
this._notificationClickedId = 0;
this._notificationRemoved();
}
}));
@ -700,8 +823,13 @@ Source.prototype = {
this._iconBin.child = icon;
},
// Default implementation is to do nothing, but subclass can override
// Default implementation is to do nothing, but subclasses can override
_notificationClicked: function(notification) {
},
// Default implementation is to destroy this source, but subclasses can override
_notificationRemoved: function() {
this.destroy();
}
};
Signals.addSignalMethods(Source.prototype);
@ -775,6 +903,7 @@ MessageTray.prototype = {
this._notificationBin.hide();
this._notificationQueue = [];
this._notification = null;
this._notificationClickedId = 0;
this._summaryBin = new St.Bin({ anchor_gravity: Clutter.Gravity.NORTH_EAST });
this.actor.add_actor(this._summaryBin);
@ -796,6 +925,7 @@ MessageTray.prototype = {
this._summaryNotificationBoxPointer.actor.hide();
this._summaryNotification = null;
this._summaryNotificationClickedId = 0;
this._clickedSummaryItem = null;
this._clickedSummaryItemAllocationChangedId = 0;
this._expandedSummaryItem = null;
@ -903,7 +1033,15 @@ MessageTray.prototype = {
}
this._summaryItems.push(summaryItem);
this._newSummaryItems.push(summaryItem);
// We keep this._newSummaryItems to track any new sources that were added to the
// summary and show the summary with them to the user for a short period of time
// after notifications are done showing. However, we don't want that to happen for
// transient sources, which are removed after the notification is shown, but are
// not removed fast enough because of the callbacks to avoid the summary popping up.
// So we just don't add transient sources to this._newSummaryItems .
if (!source.isTransient)
this._newSummaryItems.push(summaryItem);
source.connect('notify', Lang.bind(this, this._onNotify));
@ -1335,6 +1473,8 @@ MessageTray.prototype = {
_showNotification: function() {
this._notification = this._notificationQueue.shift();
this._notificationClickedId = this._notification.connect('done-displaying',
Lang.bind(this, this.escapeTray));
this._notificationBin.child = this._notification.actor;
this._notificationBin.opacity = 0;
@ -1432,7 +1572,12 @@ MessageTray.prototype = {
this._notificationBin.hide();
this._notificationBin.child = null;
this._notification.collapseCompleted();
this._notification.disconnect(this._notificationClickedId);
this._notificationClickedId = 0;
let notification = this._notification;
this._notification = null;
if (notification.isTransient)
notification.destroy();
},
_expandNotification: function(autoExpanding) {
@ -1506,7 +1651,8 @@ MessageTray.prototype = {
_showSummaryNotification: function() {
this._summaryNotification = this._clickedSummaryItem.source.notification;
this._summaryNotificationClickedId = this._summaryNotification.connect('done-displaying',
Lang.bind(this, this.escapeTray));
let index = this._notificationQueue.indexOf(this._summaryNotification);
if (index != -1)
this._notificationQueue.splice(index, 1);
@ -1529,8 +1675,8 @@ MessageTray.prototype = {
this._summaryNotificationBoxPointer.actor.show();
this._adjustNotificationBoxPointerPosition();
this._summaryNotificationState = State.SHOWNING;
this._summaryNotificationBoxPointer.animateAppear(Lang.bind(this, function() {
this._summaryNotificationState = State.SHOWING;
this._summaryNotificationBoxPointer.show(true, Lang.bind(this, function() {
this._summaryNotificationState = State.SHOWN;
}));
},
@ -1569,15 +1715,19 @@ MessageTray.prototype = {
this._summaryNotification.ungrabFocus();
this._summaryNotificationState = State.HIDING;
this._summaryNotificationBoxPointer.animateDisappear(Lang.bind(this, this._hideSummaryNotificationCompleted));
this._summaryNotificationBoxPointer.hide(true, Lang.bind(this, this._hideSummaryNotificationCompleted));
},
_hideSummaryNotificationCompleted: function() {
this._summaryNotificationState = State.HIDDEN;
this._summaryNotificationBoxPointer.bin.child = null;
this._summaryNotification.collapseCompleted();
this._summaryNotification.disconnect(this._summaryNotificationClickedId);
this._summaryNotificationClickedId = 0;
let summaryNotification = this._summaryNotification;
this._summaryNotification = null;
if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide)
summaryNotification.destroy();
if (this._reNotifyWithSummaryNotificationAfterHide) {
this._onNotify(summaryNotification.source, summaryNotification);
this._reNotifyWithSummaryNotificationAfterHide = false;

View File

@ -75,11 +75,11 @@ const Urgency = {
const rewriteRules = {
'XChat': [
{ pattern: /^XChat: Private message from: (\S*) \(.*\)$/,
replacement: '&lt;$1&gt;' },
replacement: '<$1>' },
{ pattern: /^XChat: New public message from: (\S*) \((.*)\)$/,
replacement: '$2 &lt;$1&gt;' },
replacement: '$2 <$1>' },
{ pattern: /^XChat: Highlighted message from: (\S*) \((.*)\)$/,
replacement: '$2 &lt;$1&gt;' }
replacement: '$2 <$1>' }
]
};
@ -175,14 +175,43 @@ NotificationDaemon.prototype = {
}
},
_newSource: function(title, pid) {
let source = new Source(title, pid);
this._sources[pid] = source;
// Returns the source associated with ndata.notification if it is set.
// Otherwise, returns the source associated with the pid if one is
// stored in this._sources and the notification is not transient.
// Otherwise, creates a new source as long as pid is provided.
//
// Either a pid or ndata.notification is needed to retrieve or
// create a source.
_getSource: function(title, pid, ndata) {
if (!pid && !(ndata && ndata.notification))
return null;
source.connect('destroy', Lang.bind(this,
function() {
delete this._sources[pid];
}));
// We use notification's source for the notifications we still have
// around that are getting replaced because we don't keep sources
// for transient notifications in this._sources, but we still want
// the notification associated with them to get replaced correctly.
if (ndata && ndata.notification)
return ndata.notification.source;
let isForTransientNotification = (ndata && ndata.hints['transient'] == true);
// We don't want to override a persistent notification
// with a transient one from the same sender, so we
// always create a new source object for new transient notifications
// and never add it to this._sources .
if (!isForTransientNotification && this._sources[pid])
return this._sources[pid];
let source = new Source(title, pid);
source.setTransient(isForTransientNotification);
if (!isForTransientNotification) {
this._sources[pid] = source;
source.connect('destroy', Lang.bind(this,
function() {
delete this._sources[pid];
}));
}
Main.messageTray.add(source);
return source;
@ -205,8 +234,6 @@ NotificationDaemon.prototype = {
return id;
}
summary = GLib.markup_escape_text(summary, -1);
let rewrites = rewriteRules[appName];
if (rewrites) {
for (let i = 0; i < rewrites.length; i++) {
@ -236,7 +263,8 @@ NotificationDaemon.prototype = {
let sender = DBus.getCurrentMessageContext().sender;
let pid = this._senderToPid[sender];
let source = pid ? this._sources[pid] : null;
let source = this._getSource(appName, pid, ndata);
if (source) {
this._notifyForSource(source, ndata);
@ -257,16 +285,23 @@ NotificationDaemon.prototype = {
if (!ndata)
return;
this._senderToPid[sender] = pid;
source = this._sources[pid];
if (!source)
source = this._newSource(appName, pid);
source.connect('destroy', Lang.bind(this,
function() {
delete this._senderToPid[sender];
}));
source = this._getSource(appName, pid, ndata);
// We only store sender-pid entries for persistent sources.
// Removing the entries once the source is destroyed
// would result in the entries associated with transient
// sources removed once the notification is shown anyway.
// However, keeping these pairs would mean that we would
// possibly remove an entry associated with a persistent
// source when a transient source for the same sender is
// distroyed.
if (!source.isTransient) {
this._senderToPid[sender] = pid;
source.connect('destroy', Lang.bind(this,
function() {
delete this._senderToPid[sender];
}));
}
this._notifyForSource(source, ndata);
}));
@ -281,7 +316,9 @@ NotificationDaemon.prototype = {
let iconActor = this._iconForNotificationData(icon, hints, source.ICON_SIZE);
if (notification == null) {
notification = new MessageTray.Notification(source, summary, body, { icon: iconActor });
notification = new MessageTray.Notification(source, summary, body,
{ icon: iconActor,
bannerMarkup: true });
ndata.notification = notification;
notification.connect('clicked', Lang.bind(this,
function(n) {
@ -291,9 +328,13 @@ NotificationDaemon.prototype = {
function(n) {
delete this._notifications[id];
}));
notification.connect('action-invoked', Lang.bind(this, this._actionInvoked, source, id));
notification.connect('action-invoked', Lang.bind(this,
function(n, actionId) {
this._emitActionInvoked(id, actionId);
}));
} else {
notification.update(summary, body, { icon: iconActor,
bannerMarkup: true,
clear: true });
}
@ -304,6 +345,10 @@ NotificationDaemon.prototype = {
}
notification.setUrgent(hints.urgency == Urgency.CRITICAL);
notification.setResident(hints.resident == true);
// 'transient' is a reserved keyword in JS, so we have to retrieve the value
// of the 'transient' hint with hints['transient'] rather than hints.transient
notification.setTransient(hints['transient'] == true);
let sourceIconActor = source.useNotificationIcon ? this._iconForNotificationData(icon, hints, source.ICON_SIZE) : null;
source.notify(notification, sourceIconActor);
@ -351,17 +396,13 @@ NotificationDaemon.prototype = {
for (let id in this._sources) {
let source = this._sources[id];
if (source.app == tracker.focus_app) {
source.activated();
if (source.notification && !source.notification.resident)
source.notification.destroy();
return;
}
}
},
_actionInvoked: function(notification, action, source, id) {
source.activated();
this._emitActionInvoked(id, action);
},
_emitNotificationClosed: function(id, reason) {
DBus.session.emit_signal('/org/freedesktop/Notifications',
'org.freedesktop.Notifications',
@ -377,9 +418,7 @@ NotificationDaemon.prototype = {
},
_onTrayIconAdded: function(o, icon) {
let source = this._sources[icon.pid];
if (!source)
source = this._newSource(icon.title || icon.wm_class || _("Unknown"), icon.pid);
let source = this._getSource(icon.title || icon.wm_class || _("Unknown"), icon.pid, null);
source.setTrayIcon(icon);
},
@ -420,6 +459,9 @@ Source.prototype = {
},
_setApp: function() {
if (this.app)
return;
this.app = Shell.WindowTracker.get_default().get_app_from_pid(this._pid);
if (!this.app)
return;
@ -439,12 +481,10 @@ Source.prototype = {
},
_notificationClicked: function(notification) {
notification.destroy();
this.openApp();
this.activated();
},
activated: function() {
_notificationRemoved: function() {
if (!this._isTrayIcon)
this.destroy();
},

View File

@ -28,7 +28,6 @@ const ANIMATION_TIME = 0.25;
// We split the screen vertically between the dash and the view selector.
const DASH_SPLIT_FRACTION = 0.1;
const SHELL_INFO_HIDE_TIMEOUT = 10;
function Source() {
this._init();
@ -44,8 +43,8 @@ Source.prototype = {
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'info',
icon_type: St.IconType.FULLCOLOR,
return new St.Icon({ icon_name: 'dialog-information',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
@ -61,14 +60,10 @@ function ShellInfo() {
ShellInfo.prototype = {
_init: function() {
this._source = null;
this._timeoutId = 0;
this._undoCallback = null;
},
_onUndoClicked: function() {
Mainloop.source_remove(this._timeoutId);
this._timeoutId = 0;
if (this._undoCallback)
this._undoCallback();
this._undoCallback = null;
@ -77,20 +72,7 @@ ShellInfo.prototype = {
this._source.destroy();
},
_onTimeout: function() {
this._timeoutId = 0;
if (this._source)
this._source.destroy();
return false;
},
setMessage: function(text, undoCallback, undoLabel) {
if (this._timeoutId)
Mainloop.source_remove(this._timeoutId);
this._timeoutId = Mainloop.timeout_add_seconds(SHELL_INFO_HIDE_TIMEOUT,
Lang.bind(this, this._onTimeout));
if (this._source == null) {
this._source = new Source();
this._source.connect('destroy', Lang.bind(this,
@ -106,6 +88,8 @@ ShellInfo.prototype = {
else
notification.update(text, null, { clear: true });
notification.setTransient(true);
this._undoCallback = undoCallback;
if (undoCallback) {
notification.addButton('system-undo',
@ -124,15 +108,15 @@ function Overview() {
Overview.prototype = {
_init : function() {
this._desktopFade = new St.Bin();
global.overlay_group.add_actor(this._desktopFade);
// The actual global.background_actor is inside global.window_group,
// which is hidden when displaying the overview, so we display a clone.
this._background = new Clutter.Clone({ source: global.background_actor });
this._background.hide();
global.overlay_group.add_actor(this._background);
this._desktopFade = new St.Bin();
global.overlay_group.add_actor(this._desktopFade);
this._spacing = 0;
this._group = new St.Group({ name: 'overview' });
@ -171,17 +155,16 @@ Overview.prototype = {
this._group.add_actor(this.viewSelector.actor);
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this.viewSelector.addViewTab("Windows", this._workspacesDisplay.actor);
this.viewSelector.addViewTab(_("Windows"), this._workspacesDisplay.actor);
let appView = new AppDisplay.AllAppDisplay();
this.viewSelector.addViewTab("Applications", appView.actor);
this.viewSelector.addViewTab(_("Applications"), appView.actor);
// Default search providers
this.viewSelector.addSearchProvider(new AppDisplay.AppSearchProvider());
this.viewSelector.addSearchProvider(new AppDisplay.PrefsSearchProvider());
this.viewSelector.addSearchProvider(new PlaceDisplay.PlaceSearchProvider());
this.viewSelector.addSearchProvider(new DocDisplay.DocSearchProvider());
this.viewSelector.addSearchProvider(new WorkspacesView.WindowSearchProvider());
// TODO - recalculate everything when desktop size changes
this._dash = new Dash.Dash();

View File

@ -12,6 +12,7 @@ const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Calendar = imports.ui.calendar;
const Config = imports.misc.config;
const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
@ -36,6 +37,9 @@ const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
'battery': imports.ui.status.power.Indicator
};
if (Config.HAVE_BLUETOOTH)
STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
const CLOCK_FORMAT_KEY = 'format';
const CLOCK_CUSTOM_FORMAT_KEY = 'custom-format';
const CLOCK_SHOW_DATE_KEY = 'show-date';
@ -508,11 +512,14 @@ ClockButton.prototype = {
_onButtonPress: function(actor, event) {
let button = event.get_button();
if (button == 3 &&
(!this._calendarPopup || !this._calendarPopup.isOpen))
let menuShowing = this.menu.isOpen;
let calendarShowing = this._calendarPopup && this._calendarPopup.isOpen;
if (menuShowing || (button == 3 && !calendarShowing))
this.menu.toggle();
else
this._toggleCalendar();
return true;
},
closeCalendar: function() {
@ -521,15 +528,12 @@ ClockButton.prototype = {
this._calendarPopup.hide();
this.menu.isOpen = false;
this.actor.remove_style_pseudo_class('pressed');
},
openCalendar: function() {
this._calendarPopup.show();
// simulate an open menu, so it won't appear beneath the calendar
this.menu.isOpen = true;
this.actor.add_style_pseudo_class('pressed');
},
@ -799,7 +803,8 @@ Panel.prototype = {
this._clockButton = new ClockButton();
this._centerBox.add(this._clockButton.actor, { y_fill: true });
this._menus.addMenu(this._clockButton.menu);
let clockMenuManager = new PopupMenu.PopupMenuManager(this);
clockMenuManager.addMenu(this._clockButton.menu);
/* right */
@ -815,25 +820,9 @@ Panel.prototype = {
this._rightBox.add(trayBox);
this._rightBox.add(statusBox);
for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
let role = STANDARD_TRAY_ICON_ORDER[i];
let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
if (!constructor) {
// This icon is not implemented (this is a bug)
continue;
}
let indicator = new constructor();
statusBox.add(indicator.actor);
this._menus.addMenu(indicator.menu);
}
Main.statusIconDispatcher.connect('status-icon-added', Lang.bind(this, this._onTrayIconAdded));
Main.statusIconDispatcher.connect('status-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
this._statusmenu = new StatusMenu.StatusMenuButton();
this._menus.addMenu(this._statusmenu.menu);
this._rightBox.add(this._statusmenu.actor);
// TODO: decide what to do with the rest of the panel in the Overview mode (make it fade-out, become non-reactive, etc.)
// We get into the Overview mode on button-press-event as opposed to button-release-event because eventually we'll probably
// have the Overview act like a menu that allows the user to release the mouse on the activity the user wants
@ -859,6 +848,24 @@ Panel.prototype = {
Main.chrome.addActor(this.actor, { visibleInOverview: true });
},
startStatusArea: function() {
for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
let role = STANDARD_TRAY_ICON_ORDER[i];
let constructor = STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION[role];
if (!constructor) {
// This icon is not implemented (this is a bug)
continue;
}
let indicator = new constructor();
this._statusBox.add(indicator.actor);
this._menus.addMenu(indicator.menu);
}
this._statusmenu = new StatusMenu.StatusMenuButton();
this._menus.addMenu(this._statusmenu.menu);
this._rightBox.add(this._statusmenu.actor);
},
hideCalendar: function() {
this._clockButton.closeCalendar();
},

View File

@ -47,12 +47,9 @@ Button.prototype = {
},
_onOpenStateChanged: function(menu, open) {
if (open) {
if (open)
this.actor.add_style_pseudo_class('pressed');
let focus = global.stage.get_key_focus();
if (!focus || (focus != this.actor && !menu.contains(focus)))
this.actor.grab_key_focus();
} else
else
this.actor.remove_style_pseudo_class('pressed');
}
};

View File

@ -87,7 +87,7 @@ PopupBaseMenuItem.prototype = {
},
_onButtonReleaseEvent: function (actor, event) {
this.emit('activate', event);
this.activate(event);
return true;
},
@ -95,7 +95,7 @@ PopupBaseMenuItem.prototype = {
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.emit('activate', event);
this.activate(event);
return true;
}
return false;
@ -132,29 +132,16 @@ PopupBaseMenuItem.prototype = {
this.emit('destroy');
},
// true if non descendant content includes @actor
contains: function(actor) {
return false;
},
// adds an actor to the menu item; @column defaults to the next
// open column, @span defaults to 1. If @span is -1, the actor
// will span the width of the menu item. Children are not
// allowed to overlap each other.
addActor: function(child, column, span) {
if (column == null) {
if (this._children.length) {
let lastChild = this._children[this._children.length - 1];
column = lastChild.column + lastChild.span;
} else
column = 0;
span = 1;
} else if (span == null)
span = 1;
this._children.push({ actor: child,
column: column,
span: span });
// adds an actor to the menu item; @params can contain %span
// (column span; defaults to 1, -1 means "all the remaining width"),
// %expand (defaults to #false), and %align (defaults to
// #St.Align.START)
addActor: function(child, params) {
params = Params.parse(params, { span: 1,
expand: false,
align: St.Align.START });
params.actor = child;
this._children.push(params);
this.actor.connect('destroy', Lang.bind(this, function () { this._removeChild(child); }));
this.actor.add_actor(child);
},
@ -272,39 +259,58 @@ PopupBaseMenuItem.prototype = {
for (let i = 0, col = 0; i < this._children.length; i++) {
let child = this._children[i];
let childBox = new Clutter.ActorBox();
childBox.x1 = x;
let [minWidth, naturalWidth] = child.actor.get_preferred_width(-1);
let availWidth, extraWidth;
if (this._columnWidths) {
if (child.span == -1)
childBox.x2 = box.x2;
availWidth = box.x2 - x;
else {
childBox.x2 = x;
availWidth = 0;
for (let j = 0; j < child.span; j++)
childBox.x2 += this._columnWidths[col++];
availWidth += this._columnWidths[col++];
}
extraWidth = availWidth - naturalWidth;
} else {
let [min, natural] = child.actor.get_preferred_width(-1);
childBox.x2 = x + natural;
availWidth = naturalWidth;
extraWidth = 0;
}
let [min, natural] = child.actor.get_preferred_height(-1);
childBox.y1 = Math.round(box.y1 + (height - natural) / 2);
childBox.y2 = childBox.y1 + natural;
if (child.expand) {
childBox.x1 = x;
childBox.x2 = x + availWidth;
} else if (child.align === St.Align.CENTER) {
childBox.x1 = x + Math.round(extraWidth / 2);
childBox.x2 = childBox.x1 + naturalWidth;
} else if (child.align === St.Align.END) {
childBox.x2 = x + availWidth;
childBox.x1 = childBox.x2 - naturalWidth;
} else {
childBox.x1 = x;
childBox.x2 = x + naturalWidth;
}
let [minHeight, naturalHeight] = child.actor.get_preferred_height(-1);
childBox.y1 = Math.round(box.y1 + (height - naturalHeight) / 2);
childBox.y2 = childBox.y1 + naturalHeight;
child.actor.allocate(childBox, flags);
x = childBox.x2 + this._spacing;
x += availWidth + this._spacing;
}
}
};
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
function PopupMenuItem(text) {
this._init(text);
function PopupMenuItem() {
this._init.apply(this, arguments);
}
PopupMenuItem.prototype = {
__proto__: PopupBaseMenuItem.prototype,
_init: function (text) {
PopupBaseMenuItem.prototype._init.call(this);
_init: function (text, params) {
PopupBaseMenuItem.prototype._init.call(this, params);
this.label = new St.Label({ text: text });
this.addActor(this.label);
@ -322,7 +328,7 @@ PopupSeparatorMenuItem.prototype = {
PopupBaseMenuItem.prototype._init.call(this, { reactive: false });
this._drawingArea = new St.DrawingArea({ style_class: 'popup-separator-menu-item' });
this.addActor(this._drawingArea, 0, -1);
this.addActor(this._drawingArea, { span: -1, expand: true });
this._drawingArea.connect('repaint', Lang.bind(this, this._onRepaint));
},
@ -367,7 +373,7 @@ PopupSliderMenuItem.prototype = {
this._value = Math.max(Math.min(value, 1), 0);
this._slider = new St.DrawingArea({ style_class: 'popup-slider-menu-item', reactive: true });
this.addActor(this._slider, 0, -1);
this.addActor(this._slider, { span: -1, expand: true });
this._slider.connect('repaint', Lang.bind(this, this._sliderRepaint));
this._slider.connect('button-press-event', Lang.bind(this, this._startDragging));
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
@ -534,7 +540,7 @@ PopupSwitchMenuItem.prototype = {
this._switch = new Switch(active);
this.addActor(this.label);
this.addActor(this._switch.actor);
this.addActor(this._switch.actor, { align: St.Align.END });
this.connect('activate', Lang.bind(this,function(from) {
this.toggle();
@ -569,7 +575,7 @@ PopupImageMenuItem.prototype = {
this.label = new St.Label({ text: text });
this.addActor(this.label);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.addActor(this._icon);
this.addActor(this._icon, { align: St.Align.END });
this.setIcon(iconName);
},
@ -601,76 +607,21 @@ function findNextInCycle(items, current, direction) {
return items[mod(cur + direction, items.length)];
}
function PopupMenu() {
this._init.apply(this, arguments);
function PopupMenuBase() {
throw new TypeError('Trying to instantiate abstract class PopupMenuBase');
}
PopupMenu.prototype = {
_init: function(sourceActor, alignment, arrowSide, gap) {
PopupMenuBase.prototype = {
_init: function(sourceActor, styleClass) {
this.sourceActor = sourceActor;
this._alignment = alignment;
this._arrowSide = arrowSide;
this._gap = gap;
this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START });
this.actor = this._boxPointer.actor;
this.actor.style_class = 'popup-menu-boxpointer';
this._boxWrapper = new Shell.GenericContainer();
this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth));
this._boxWrapper.connect('get-preferred-height', Lang.bind(this, this._boxGetPreferredHeight));
this._boxWrapper.connect('allocate', Lang.bind(this, this._boxAllocate));
this._boxPointer.bin.set_child(this._boxWrapper);
this._box = new St.BoxLayout({ style_class: 'popup-menu-content',
vertical: true });
this._boxWrapper.add_actor(this._box);
this.actor.add_style_class_name('popup-menu');
global.focus_manager.add_group(this.actor);
if (sourceActor._delegate instanceof PopupSubMenuMenuItem) {
this._isSubMenu = true;
this.actor.reactive = true;
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
}
this.box = new St.BoxLayout({ style_class: styleClass,
vertical: true });
this.isOpen = false;
this._activeMenuItem = null;
},
_boxGetPreferredWidth: function (actor, forHeight, alloc) {
// Update the menuitem column widths
let columnWidths = [];
let items = this._box.get_children();
for (let i = 0; i < items.length; i++) {
if (items[i]._delegate instanceof PopupBaseMenuItem) {
let itemColumnWidths = items[i]._delegate.getColumnWidths();
for (let j = 0; j < itemColumnWidths.length; j++) {
if (j >= columnWidths.length || itemColumnWidths[j] > columnWidths[j])
columnWidths[j] = itemColumnWidths[j];
}
}
}
for (let i = 0; i < items.length; i++) {
if (items[i]._delegate instanceof PopupBaseMenuItem)
items[i]._delegate.setColumnWidths(columnWidths);
}
// Now they will request the right sizes
[alloc.min_size, alloc.natural_size] = this._box.get_preferred_width(forHeight);
},
_boxGetPreferredHeight: function (actor, forWidth, alloc) {
[alloc.min_size, alloc.natural_size] = this._box.get_preferred_height(forWidth);
},
_boxAllocate: function (actor, box, flags) {
this._box.allocate(box, flags);
},
addAction: function(title, callback) {
var menuItem = new PopupMenuItem(title);
this.addMenuItem(menuItem);
@ -681,9 +632,29 @@ PopupMenu.prototype = {
addMenuItem: function(menuItem, position) {
if (position == undefined)
this._box.add(menuItem.actor);
this.box.add(menuItem.actor);
else
this._box.insert_actor(menuItem.actor, position);
this.box.insert_actor(menuItem.actor, position);
if (menuItem instanceof PopupSubMenuMenuItem) {
if (position == undefined)
this.box.add(menuItem.menu.actor);
else
this.box.insert_actor(menuItem.menu.actor, position + 1);
menuItem._subMenuActivateId = menuItem.menu.connect('activate', Lang.bind(this, function() {
this.emit('activate');
this.close(true);
}));
menuItem._subMenuActiveChangeId = menuItem.menu.connect('active-changed', Lang.bind(this, function(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
this._activeMenuItem.setActive(false);
this._activeMenuItem = submenuItem;
this.emit('active-changed', submenuItem);
}));
menuItem._closingId = this.connect('open-state-changed', function(self, open) {
if (!open)
menuItem.menu.close(false);
});
}
menuItem._activeChangeId = menuItem.connect('active-changed', Lang.bind(this, function (menuItem, active) {
if (active && this._activeMenuItem != menuItem) {
if (this._activeMenuItem)
@ -697,22 +668,50 @@ PopupMenu.prototype = {
}));
menuItem._activateId = menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
this.emit('activate', menuItem);
this.close();
this.close(true);
}));
menuItem.connect('destroy', Lang.bind(this, function(emitter) {
menuItem.disconnect(menuItem._activateId);
menuItem.disconnect(menuItem._activeChangeId);
if (menuItem.menu) {
menuItem.menu.disconnect(menuItem._subMenuActivateId);
menuItem.menu.disconnect(menuItem._subMenuActiveChangeId);
this.disconnect(menuItem._closingId);
}
if (menuItem == this._activeMenuItem)
this._activeMenuItem = null;
}));
},
getColumnWidths: function() {
let columnWidths = [];
let items = this.box.get_children();
for (let i = 0; i < items.length; i++) {
if (items[i]._delegate instanceof PopupBaseMenuItem || items[i]._delegate instanceof PopupMenuBase) {
let itemColumnWidths = items[i]._delegate.getColumnWidths();
for (let j = 0; j < itemColumnWidths.length; j++) {
if (j >= columnWidths.length || itemColumnWidths[j] > columnWidths[j])
columnWidths[j] = itemColumnWidths[j];
}
}
}
return columnWidths;
},
setColumnWidths: function(widths) {
let items = this.box.get_children();
for (let i = 0; i < items.length; i++) {
if (items[i]._delegate instanceof PopupBaseMenuItem || items[i]._delegate instanceof PopupMenuBase)
items[i]._delegate.setColumnWidths(widths);
}
},
addActor: function(actor) {
this._box.add(actor);
this.box.add(actor);
},
getMenuItems: function() {
return this._box.get_children().map(function (actor) { return actor._delegate; });
return this.box.get_children().map(function (actor) { return actor._delegate; }).filter(function(item) { return item instanceof PopupBaseMenuItem; });
},
removeAll: function() {
@ -723,110 +722,22 @@ PopupMenu.prototype = {
}
},
setArrowOrigin: function(origin) {
this._boxPointer.setArrowOrigin(origin);
},
activateFirst: function() {
let children = this._box.get_children();
let children = this.box.get_children();
for (let i = 0; i < children.length; i++) {
let actor = children[i];
if (actor._delegate && actor.visible && actor.reactive) {
if (actor._delegate && actor._delegate instanceof PopupBaseMenuItem && actor.visible && actor.reactive) {
actor._delegate.setActive(true);
break;
}
}
},
open: function() {
if (this.isOpen)
return;
let primary = global.get_primary_monitor();
// We need to show it now to force an allocation,
// so that we can query the correct size.
this.actor.show();
// Position correctly relative to the sourceActor
let [sourceX, sourceY] = this.sourceActor.get_transformed_position();
let [sourceWidth, sourceHeight] = this.sourceActor.get_transformed_size();
let [minWidth, minHeight, natWidth, natHeight] = this.actor.get_preferred_size();
let menuWidth = natWidth, menuHeight = natHeight;
// Position the non-pointing axis
if (this._isSubmenu) {
if (this._arrowSide == St.Side.TOP || this._arrowSide == St.Side.BOTTOM) {
// vertical submenu
if (sourceY + sourceHeigth + menuHeight + this._gap < primary.y + primary.height)
this._boxPointer._arrowSide = this._arrowSide = St.Side.TOP;
else if (primary.y + menuHeight + this._gap < sourceY)
this._boxPointer._arrowSide = this._arrowSide = St.Side.BOTTOM;
else
this._boxPointer._arrowSide = this._arrowSide = St.Side.TOP;
} else {
// horizontal submenu
if (sourceX + sourceWidth + menuWidth + this._gap < primary.x + primary.width)
this._boxPointer._arrowSide = this._arrowSide = St.Side.LEFT;
else if (primary.x + menuWidth + this._gap < sourceX)
this._boxPointer._arrowSide = this._arrowSide = St.Side.RIGHT;
else
this._boxPointer._arrowSide = this._arrowSide = St.Side.LEFT;
}
}
this._boxPointer.setPosition(this.sourceActor, this._gap, this._alignment);
// Now show it
this.actor.reactive = true;
this._boxPointer.animateAppear();
this.isOpen = true;
this.emit('open-state-changed', true);
},
close: function() {
if (!this.isOpen)
return;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this.actor.reactive = false;
this._boxPointer.animateDisappear();
this.isOpen = false;
this.emit('open-state-changed', false);
},
toggle: function() {
if (this.isOpen)
this.close();
this.close(true);
else
this.open();
},
_onKeyPressEvent: function(actor, event) {
// Move focus back to parent menu if the user types Left.
// (This handler is only connected if the PopupMenu is a
// submenu.)
if (this.isOpen &&
this._activeMenuItem &&
event.get_key_symbol() == Clutter.KEY_Left) {
this._activeMenuItem.setActive(false);
return true;
}
return false;
},
// return true if the actor is inside the menu or
// any actor related to the active submenu
contains: function(actor) {
if (this.actor.contains(actor))
return true;
if (this._activeMenuItem)
return this._activeMenuItem.contains(actor);
return false;
this.open(true);
},
destroy: function() {
@ -836,7 +747,184 @@ PopupMenu.prototype = {
this.emit('destroy');
}
};
Signals.addSignalMethods(PopupMenu.prototype);
Signals.addSignalMethods(PopupMenuBase.prototype);
function PopupMenu() {
this._init.apply(this, arguments);
}
PopupMenu.prototype = {
__proto__: PopupMenuBase.prototype,
_init: function(sourceActor, alignment, arrowSide, gap) {
PopupMenuBase.prototype._init.call (this, sourceActor, 'popup-menu-content');
this._alignment = alignment;
this._arrowSide = arrowSide;
this._gap = gap;
this._boxPointer = new BoxPointer.BoxPointer(arrowSide,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START });
this.actor = this._boxPointer.actor;
this.actor._delegate = this;
this.actor.style_class = 'popup-menu-boxpointer';
this._boxWrapper = new Shell.GenericContainer();
this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth));
this._boxWrapper.connect('get-preferred-height', Lang.bind(this, this._boxGetPreferredHeight));
this._boxWrapper.connect('allocate', Lang.bind(this, this._boxAllocate));
this._boxPointer.bin.set_child(this._boxWrapper);
this._boxWrapper.add_actor(this.box);
this.actor.add_style_class_name('popup-menu');
global.focus_manager.add_group(this.actor);
this.actor.reactive = true;
},
_boxGetPreferredWidth: function (actor, forHeight, alloc) {
let columnWidths = this.getColumnWidths();
this.setColumnWidths(columnWidths);
// Now they will request the right sizes
[alloc.min_size, alloc.natural_size] = this.box.get_preferred_width(forHeight);
},
_boxGetPreferredHeight: function (actor, forWidth, alloc) {
[alloc.min_size, alloc.natural_size] = this.box.get_preferred_height(forWidth);
},
_boxAllocate: function (actor, box, flags) {
this.box.allocate(box, flags);
},
setArrowOrigin: function(origin) {
this._boxPointer.setArrowOrigin(origin);
},
open: function(animate) {
if (this.isOpen)
return;
this.isOpen = true;
this._boxPointer.setPosition(this.sourceActor, this._gap, this._alignment);
this._boxPointer.show(animate);
this.emit('open-state-changed', true);
},
close: function(animate) {
if (!this.isOpen)
return;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._boxPointer.hide(animate);
this.isOpen = false;
this.emit('open-state-changed', false);
}
};
function PopupSubMenu() {
this._init.apply(this, arguments);
}
PopupSubMenu.prototype = {
__proto__: PopupMenuBase.prototype,
_init: function(sourceActor, sourceArrow) {
PopupMenuBase.prototype._init.call(this, sourceActor, 'popup-sub-menu');
this._arrow = sourceArrow;
this._arrow.rotation_center_z_gravity = Clutter.Gravity.CENTER;
this.actor = this.box;
this.actor._delegate = this;
this.actor.clip_to_allocation = true;
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this.actor.hide();
},
open: function(animate) {
if (this.isOpen)
return;
this.isOpen = true;
// we don't implement the !animate case because that doesn't
// currently get used...
let [naturalHeight, minHeight] = this.actor.get_preferred_height(-1);
this.actor.height = 0;
this.actor.show();
this.actor._arrow_rotation = this._arrow.rotation_angle_z;
Tweener.addTween(this.actor,
{ _arrow_rotation: 90,
height: naturalHeight,
time: 0.25,
onUpdateScope: this,
onUpdate: function() {
this._arrow.rotation_angle_z = this.actor._arrow_rotation;
},
onCompleteScope: this,
onComplete: function() {
this.actor.set_height(-1);
this.emit('open-state-changed', true);
}
});
},
close: function(animate) {
if (!this.isOpen)
return;
this.isOpen = false;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
if (animate) {
this.actor._arrow_rotation = this._arrow.rotation_angle_z;
Tweener.addTween(this.actor,
{ _arrow_rotation: 0,
height: 0,
time: 0.25,
onCompleteScope: this,
onComplete: function() {
this.actor.hide();
this.actor.set_height(-1);
this.emit('open-state-changed', false);
},
onUpdateScope: this,
onUpdate: function() {
this._arrow.rotation_angle_z = this.actor._arrow_rotation;
}
});
} else {
this._arrow.rotation_angle_z = 0;
this.actor.hide();
this.isOpen = false;
this.emit('open-state-changed', false);
}
},
_onKeyPressEvent: function(actor, event) {
// Move focus back to parent menu if the user types Left.
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
this.close(true);
this.sourceActor._delegate.setActive(true);
return true;
}
return false;
}
};
function PopupSubMenuMenuItem() {
this._init.apply(this, arguments);
@ -846,77 +934,46 @@ PopupSubMenuMenuItem.prototype = {
__proto__: PopupBaseMenuItem.prototype,
_init: function(text) {
PopupBaseMenuItem.prototype._init.call(this, { activate: false, hover: false });
this.actor.connect('enter-event', Lang.bind(this, this._mouseEnter));
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
PopupBaseMenuItem.prototype._init.call(this);
this.actor.add_style_class_name('popup-submenu-menu-item');
this.label = new St.Label({ text: text });
this.addActor(this.label);
this.addActor(new St.Label({ text: '>' }));
this._triangle = new St.Label({ text: '\u25B8' });
this.addActor(this._triangle, { align: St.Align.END });
this.menu = new PopupMenu(this.actor, St.Align.MIDDLE, St.Side.LEFT, 0, true);
Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
affectsStruts: false });
this.menu.actor.hide();
this._openStateChangedId = this.menu.connect('open-state-changed', Lang.bind(this, this._subMenuOpenStateChanged));
this._activateId = this.menu.connect('activate', Lang.bind(this, this._subMenuActivate));
this.menu = new PopupSubMenu(this.actor, this._triangle);
this.menu.connect('open-state-changed', Lang.bind(this, this._subMenuOpenStateChanged));
},
_subMenuOpenStateChanged: function(menu, open) {
PopupBaseMenuItem.prototype.setActive.call(this, open);
},
_subMenuActivate: function(menu, menuItem) {
this.emit('activate', null);
},
setMenu: function(newmenu) {
if (this.menu) {
this.menu.close();
this.menu.disconnect(this._openStateChangedId);
this.menu.disconnect(this._activateId);
}
if (newmenu) {
this._openStateChangedId = newmenu.connect('open-state-changed', Lang.bind(this, this._subMenuOpenStateChanged));
this._activateId = newmenu.connect('activate', Lang.bind(this, this._subMenuActivate));
}
this.menu = newmenu;
if (open)
this.actor.add_style_pseudo_class('open');
else
this.actor.remove_style_pseudo_class('open');
},
destroy: function() {
if (this.menu)
this.menu.destroy();
this.menu.destroy();
PopupBaseMenuItem.prototype.destroy.call(this);
},
setActive: function(active) {
if (this.menu) {
if (active)
this.menu.open();
else
this.menu.close();
}
PopupBaseMenuItem.prototype.setActive.call(this, active);
},
_onKeyPressEvent: function(actor, event) {
if (!this.menu)
return false;
if (event.get_key_symbol() == Clutter.KEY_Right) {
this.menu.open(true);
this.menu.activateFirst();
return true;
}
return false;
return PopupBaseMenuItem.prototype._onKeyPressEvent.call(this, actor, event);
},
contains: function(actor) {
return this.menu && this.menu.contains(actor);
activate: function(event) {
this.menu.open(true);
},
_mouseEnter: function(event) {
this.setActive(true);
_onButtonReleaseEvent: function(actor) {
this.menu.toggle();
}
};
@ -939,23 +996,24 @@ PopupMenuManager.prototype = {
this._leaveEventId = 0;
this._activeMenu = null;
this._menus = [];
this._delayedMenus = [];
this._preGrabInputMode = null;
},
addMenu: function(menu, position) {
let menudata = {
menu: menu,
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
activateId: menu.connect('activate', Lang.bind(this, this._onMenuActivated)),
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
enterId: 0,
focusId: 0
focusInId: 0,
focusOutId: 0
};
let source = menu.sourceActor;
if (source) {
menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusOutId = source.connect('key-focus-out', Lang.bind(this, function() { this._onKeyFocusOut(menu); }));
}
if (position == undefined)
@ -974,18 +1032,19 @@ PopupMenuManager.prototype = {
let menudata = this._menus[position];
menu.disconnect(menudata.openStateChangeId);
menu.disconnect(menudata.activateId);
menu.disconnect(menudata.destroyId);
if (menudata.enterId)
menu.sourceActor.disconnect(menudata.enterId);
if (menudata.focusId)
menu.sourceActor.disconnect(menudata.focusId);
if (menudata.focusInId)
menu.sourceActor.disconnect(menudata.focusInId);
if (menudata.focusOutId)
menu.sourceActor.disconnect(menudata.focusOutId);
this._menus.splice(position, 1);
},
grab: function() {
_grab: function() {
Main.pushModal(this._owner.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
@ -997,7 +1056,7 @@ PopupMenuManager.prototype = {
this.grabbed = true;
},
ungrab: function() {
_ungrab: function() {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
global.stage.disconnect(this._keyPressEventId);
@ -1013,40 +1072,100 @@ PopupMenuManager.prototype = {
_onMenuOpenState: function(menu, open) {
if (open) {
if (!this.grabbed) {
this._preGrabInputMode = global.stage_input_mode;
this._grab();
}
this._activeMenu = menu;
if (!this.grabbed)
this.grab();
// if the focus is not already associated with the menu,
// then focus the menu
let focus = global.stage.key_focus;
if (!this._activeMenuContains(focus))
menu.sourceActor.grab_key_focus();
} else if (menu == this._activeMenu) {
this._activeMenu = null;
let focus = global.stage.key_focus;
let fromActive = this._activeMenuContains(focus);
if (this.grabbed)
this.ungrab();
this._ungrab();
this._activeMenu = null;
// If keynav was in effect before we grabbed, then we need
// to properly re-establish it after we ungrab. (popModal
// will have unset the focus.) If some part of the menu
// was focused at the time of the ungrab then focus its
// sourceActor. Otherwise just reset the focus to where it
// was right before the ungrab.
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED) {
global.stage_input_mode = Shell.StageInputMode.FOCUSED;
if (fromActive)
menu.sourceActor.grab_key_focus();
else
focus.grab_key_focus();
}
}
},
// change the currently-open menu without dropping grab
_changeMenu: function(newMenu) {
if (this._activeMenu) {
// _onOpenMenuState will drop the grab if it sees
// this._activeMenu being closed; so clear _activeMenu
// before closing it to keep that from happening
let oldMenu = this._activeMenu;
this._activeMenu = null;
oldMenu.close(false);
newMenu.open(false);
} else
newMenu.open(true);
},
_onMenuSourceEnter: function(menu) {
if (!this.grabbed || menu == this._activeMenu)
return false;
if (this._activeMenu != null)
this._activeMenu.close();
menu.open();
this._changeMenu(menu);
return false;
},
_onMenuActivated: function(menu, item) {
if (this.grabbed)
this.ungrab();
_onKeyFocusOut: function(menu) {
if (!this.grabbed || menu != this._activeMenu)
return;
// We want to close the menu if the focus has moved somewhere
// other than inside the menu or to another menu's sourceActor.
// Unfortunately, when key-focus-out is emitted,
// stage.key_focus will be null. So we have to wait until
// after it emits the key-focus-in as well.
let id = global.stage.connect('notify::key-focus', Lang.bind(this,
function () {
global.stage.disconnect(id);
if (menu != this._activeMenu)
return;
let focus = global.stage.key_focus;
if (!focus || this._activeMenuContains(focus))
return;
if (focus._delegate && this._findMenu(focus._delegate.menu) != -1)
return;
menu.close(true);
}));
},
_onMenuDestroy: function(menu) {
this.removeMenu(menu);
},
_eventIsOnActiveMenu: function(event) {
let src = event.get_source();
_activeMenuContains: function(actor) {
return this._activeMenu != null
&& (this._activeMenu.contains(src) ||
(this._activeMenu.sourceActor && this._activeMenu.sourceActor.contains(src)));
&& (this._activeMenu.actor.contains(actor) ||
(this._activeMenu.sourceActor && this._activeMenu.sourceActor.contains(actor)));
},
_eventIsOnActiveMenu: function(event) {
return this._activeMenuContains(event.get_source());
},
_eventIsOnAnyMenuSource: function(event) {
@ -1108,10 +1227,7 @@ PopupMenuManager.prototype = {
let pos = this._findMenu(this._activeMenu);
let next = this._menus[mod(pos + direction, this._menus.length)].menu;
if (next != this._activeMenu) {
let oldMenu = this._activeMenu;
this._activeMenu = next;
oldMenu.close();
next.open();
this._changeMenu(next);
next.activateFirst();
}
return true;
@ -1122,6 +1238,6 @@ PopupMenuManager.prototype = {
_closeMenu: function() {
if (this._activeMenu != null)
this._activeMenu.close();
this._activeMenu.close(true);
}
};

View File

@ -10,24 +10,24 @@ const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const A11Y_SCHEMA = "org.gnome.desktop.a11y.keyboard";
const KEY_STICKY_KEYS_ENABLED = "stickykeys-enable";
const KEY_BOUNCE_KEYS_ENABLED = "bouncekeys-enable";
const KEY_SLOW_KEYS_ENABLED = "slowkeys-enable";
const KEY_MOUSE_KEYS_ENABLED = "mousekeys-enable";
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const KEY_STICKY_KEYS_ENABLED = 'stickykeys-enable';
const KEY_BOUNCE_KEYS_ENABLED = 'bouncekeys-enable';
const KEY_SLOW_KEYS_ENABLED = 'slowkeys-enable';
const KEY_MOUSE_KEYS_ENABLED = 'mousekeys-enable';
const AT_SCREEN_KEYBOARD_SCHEMA = "org.gnome.desktop.default-applications.at.mobility";
const AT_SCREEN_READER_SCHEMA = "org.gnome.desktop.default-applications.at.visual";
const MAGNIFIER_SCHEMA = 'org.gnome.accessibility.magnifier';
const AT_SCREEN_KEYBOARD_SCHEMA = 'org.gnome.desktop.default-applications.at.mobility';
const AT_SCREEN_READER_SCHEMA = 'org.gnome.desktop.default-applications.at.visual';
const XSETTINGS_SCHEMA = "org.gnome.settings-daemon.plugins.xsettings";
const KEY_DPI = "dpi";
const XSETTINGS_SCHEMA = 'org.gnome.settings-daemon.plugins.xsettings';
const KEY_DPI = 'dpi';
const DPI_LOW_REASONABLE_VALUE = 50;
const DPI_HIGH_REASONABLE_VALUE = 500;
@ -37,14 +37,14 @@ const DPI_FACTOR_LARGER = 1.5;
const DPI_FACTOR_LARGEST = 2.0;
const DPI_DEFAULT = 96;
const KEY_META_DIR = "/apps/metacity/general";
const KEY_VISUAL_BELL = KEY_META_DIR + "/visual_bell";
const KEY_META_DIR = '/apps/metacity/general';
const KEY_VISUAL_BELL = KEY_META_DIR + '/visual_bell';
const DESKTOP_INTERFACE_SCHEMA = "org.gnome.desktop.interface";
const KEY_GTK_THEME = "gtk-theme";
const KEY_ICON_THEME = "icon-theme";
const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface';
const KEY_GTK_THEME = 'gtk-theme';
const KEY_ICON_THEME = 'icon-theme';
const HIGH_CONTRAST_THEME = "HighContrast";
const HIGH_CONTRAST_THEME = 'HighContrast';
function getDPIFromX() {
let screen = global.get_gdk_screen();
@ -79,7 +79,7 @@ ATIndicator.prototype = {
let highContrast = this._buildHCItem();
this.menu.addMenuItem(highContrast);
let magnifier = this._buildMagItem();
let magnifier = this._buildItem(_("Zoom"), MAGNIFIER_SCHEMA, 'show-magnifier');
this.menu.addMenuItem(magnifier);
let textZoom = this._buildFontItem();
@ -219,18 +219,6 @@ ATIndicator.prototype = {
return widget;
},
_buildMagItem: function() {
let mag = Main.magnifier;
let widget = this._buildItemExtended(_("Zoom"),
mag.isActive(),
true,
Lang.bind(mag, mag.setActive));
mag.connect('active-changed', function(magnifier, active) {
widget.setToggleState(active);
});
return widget;
},
_keyChanged: function() {
this.emit('gconf-changed');
}

448
js/ui/status/bluetooth.js Normal file
View File

@ -0,0 +1,448 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const GnomeBluetoothApplet = imports.gi.GnomeBluetoothApplet;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const ConnectionState = {
DISCONNECTED: 0,
CONNECTED: 1,
DISCONNECTING: 2,
CONNECTING: 3
}
function Indicator() {
this._init.apply(this, arguments);
}
Indicator.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
PanelMenu.SystemStatusButton.prototype._init.call(this, 'bluetooth-disabled', null);
GLib.spawn_command_line_sync ('pkill -f "^bluetooth-applet$"');
this._applet = new GnomeBluetoothApplet.Applet();
this._killswitch = new PopupMenu.PopupSwitchMenuItem(_("Bluetooth"), false);
this._applet.connect('notify::killswitch-state', Lang.bind(this, this._updateKillswitch));
this._killswitch.connect('toggled', Lang.bind(this, function() {
let current_state = this._applet.killswitch_state;
if (current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED &&
current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER) {
this._applet.killswitch_state = this._killswitch.state ?
GnomeBluetoothApplet.KillswitchState.UNBLOCKED:
GnomeBluetoothApplet.KillswitchState.SOFT_BLOCKED;
} else
this._killswitch.setToggleState(false);
}));
this._discoverable = new PopupMenu.PopupSwitchMenuItem(_("Visibility"), this._applet.discoverable);
this._applet.connect('notify::discoverable', Lang.bind(this, function() {
this._discoverable.setToggleState(this._applet.discoverable);
}));
this._discoverable.connect('toggled', Lang.bind(this, function() {
this._applet.discoverable = this._discoverable.state;
}));
this._updateKillswitch();
this.menu.addMenuItem(this._killswitch);
this.menu.addMenuItem(this._discoverable);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._fullMenuItems = [new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
new PopupMenu.PopupSeparatorMenuItem(),
new PopupMenu.PopupSeparatorMenuItem(),
new PopupMenu.PopupMenuItem(_("Setup a New Device..."))];
this._deviceSep = this._fullMenuItems[1]; // hidden if no device exists
this._fullMenuItems[0].connect('activate', function() {
GLib.spawn_command_line_async('bluetooth-sendto');
});
this._fullMenuItems[3].connect('activate', function() {
GLib.spawn_command_line_async('bluetooth-wizard');
});
for (let i = 0; i < this._fullMenuItems.length; i++) {
let item = this._fullMenuItems[i];
this.menu.addMenuItem(item);
}
this._deviceItemPosition = 5;
this._deviceItems = [];
this._applet.connect('devices-changed', Lang.bind(this, this._updateDevices));
this._updateDevices();
this._applet.connect('notify::show-full-menu', Lang.bind(this, this._updateFullMenu));
this._updateFullMenu();
this.menu.addAction(_("Bluetooth Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center bluetooth');
});
this._applet.connect('pincode-request', Lang.bind(this, this._pinRequest));
this._applet.connect('confirm-request', Lang.bind(this, this._confirmRequest));
this._applet.connect('auth-request', Lang.bind(this, this._authRequest));
this._applet.connect('cancel-request', Lang.bind(this, this._cancelRequest));
},
_updateKillswitch: function() {
let current_state = this._applet.killswitch_state;
let on = current_state == GnomeBluetoothApplet.KillswitchState.UNBLOCKED;
let can_toggle = current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER &&
current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
this._killswitch.setToggleState(on);
this._killswitch.actor.reactive = can_toggle;
if (on) {
this._discoverable.actor.show();
this.setIcon('bluetooth-active');
} else {
this._discoverable.actor.hide();
this.setIcon('bluetooth-disabled');
}
},
_updateDevices: function() {
this._destroyAll(this._deviceItems);
this._deviceItems = [];
let devices = this._applet.get_devices();
let anydevice = false;
for (let i = 0; i < devices.length; i++) {
let d = devices[i];
let item = this._createDeviceItem(d);
if (item) {
this.menu.addMenuItem(item, this._deviceItemPosition + this._deviceItems.length);
this._deviceItems.push(item);
anydevice = true;
}
}
if (anydevice)
this._deviceSep.actor.show();
else
this._deviceSep.actor.hide();
},
_createDeviceItem: function(device) {
if (!device.can_connect && device.capabilities == GnomeBluetoothApplet.Capabilities.NONE)
return null;
let item = new PopupMenu.PopupSubMenuMenuItem(device.alias);
item._device = device;
if (device.can_connect) {
item._connected = device.connected;
let menuitem = new PopupMenu.PopupSwitchMenuItem(_("Connection"), device.connected);
menuitem.connect('toggled', Lang.bind(this, function() {
if (item._connected > ConnectionState.CONNECTED) {
// operation already in progress, revert
menuitem.setToggleState(menuitem.state);
}
if (item._connected) {
item._connected = ConnectionState.DISCONNECTING;
this._applet.disconnect_device(item._device.device_path, function(applet, success) {
if (success) { // apply
item._connected = ConnectionState.DISCONNECTED;
menuitem.setToggleState(false);
} else { // revert
item._connected = ConnectionState.CONNECTED;
menuitem.setToggleState(true);
}
});
} else {
item._connected = ConnectionState.CONNECTING;
this._applet.connect_device(item._device.device_path, function(applet, success) {
if (success) { // apply
item._connected = ConnectionState.CONNECTED;
menuitem.setToggleState(true);
} else { // revert
item._connected = ConnectionState.DISCONNECTED;
menuitem.setToggleState(false);
}
});
}
}));
item.menu.addMenuItem(menuitem);
}
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_PUSH) {
item.menu.addAction(_("Send Files..."), Lang.bind(this, function() {
this._applet.send_to_address(device.bdaddr, device.alias);
}));
}
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_FILE_TRANSFER) {
item.menu.addAction(_("Browse Files..."), Lang.bind(this, function(event) {
this._applet.browse_address(device.bdaddr, event.get_time(),
Lang.bind(this, function(applet, result) {
try {
applet.browse_address_finish(result);
} catch (e) {
this._ensureSource();
this._source.notify(new MessageTray.Notification(this._source,
_("Bluetooth"),
_("Error browsing device"),
{ body: _("The requested device cannot be browsed, error is '%s'").format(e) }));
}
}));
}));
}
switch (device.type) {
case GnomeBluetoothApplet.Type.KEYBOARD:
item.menu.addAction(_("Keyboard Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center keyboard');
});
break;
case GnomeBluetoothApplet.Type.MOUSE:
item.menu.addAction(_("Mouse Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center mouse');
});
break;
case GnomeBluetoothApplet.Type.HEADSET:
case GnomeBluetoothApplet.Type.HEADPHONES:
case GnomeBluetoothApplet.Type.OTHER_AUDIO:
item.menu.addAction(_("Sound Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center sound');
});
break;
default:
break;
}
return item;
},
_updateFullMenu: function() {
if (this._applet.show_full_menu) {
this._showAll(this._fullMenuItems);
this._showAll(this._deviceItems);
} else {
this._hideAll(this._fullMenuItems);
this._hideAll(this._deviceItems);
}
},
_showAll: function(items) {
for (let i = 0; i < items.length; i++)
items[i].actor.show();
},
_hideAll: function(items) {
for (let i = 0; i < items.length; i++)
items[i].actor.hide();
},
_destroyAll: function(items) {
for (let i = 0; i < items.length; i++)
items[i].destroy();
},
_ensureSource: function() {
if (!this._source) {
this._source = new Source();
Main.messageTray.add(this._source);
}
},
_authRequest: function(applet, device_path, name, long_name, uuid) {
this._ensureSource();
this._source.notify(new AuthNotification(this._source, this._applet, device_path, name, long_name, uuid));
},
_confirmRequest: function(applet, device_path, name, long_name, pin) {
this._ensureSource();
this._source.notify(new ConfirmNotification(this._source, this._applet, device_path, name, long_name, pin));
},
_pinRequest: function(applet, device_path, name, long_name, numeric) {
this._ensureSource();
this._source.notify(new PinNotification(this._source, this._applet, device_path, name, long_name, numeric));
},
_cancelRequest: function() {
this._source.destroy();
}
}
function Source() {
this._init.apply(this, arguments);
}
Source.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function() {
MessageTray.Source.prototype._init.call(this, _("Bluetooth Agent"));
this._setSummaryIcon(this.createNotificationIcon());
},
notify: function(notification) {
this._private_destroyId = notification.connect('destroy', Lang.bind(this, function(notification) {
if (this.notification == notification) {
// the destroyed notification is the last for this source
this.notification.disconnect(this._private_destroyId);
this.destroy();
}
}));
MessageTray.Source.prototype.notify.call(this, notification);
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'bluetooth-active',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
}
}
function AuthNotification() {
this._init.apply(this, arguments);
}
AuthNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, applet, device_path, name, long_name, uuid) {
MessageTray.Notification.prototype._init.call(this,
source,
_("Bluetooth Agent"),
_("Authorization request from %s").format(name),
{ customContent: true });
this.setResident(true);
this._applet = applet;
this._devicePath = device_path;
this.addBody(_("Device %s wants access to the service '%s'").format(long_name, uuid));
this.addButton('always-grant', _("Always grant access"));
this.addButton('grant', _("Grant this time only"));
this.addButton('reject', _("Reject"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) {
case 'always-grant':
this._applet.agent_reply_auth(this._devicePath, true, true);
break;
case 'grant':
this._applet.agent_reply_auth(this._devicePath, true, false);
break;
case 'reject':
default:
this._applet.agent_reply_auth(this._devicePath, false, false);
}
this.destroy();
}));
}
}
function ConfirmNotification() {
this._init.apply(this, arguments);
}
ConfirmNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, applet, device_path, name, long_name, pin) {
MessageTray.Notification.prototype._init.call(this,
source,
_("Bluetooth Agent"),
_("Pairing confirmation for %s").format(name),
{ customContent: true });
this.setResident(true);
this._applet = applet;
this._devicePath = device_path;
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addBody(_("Please confirm whether the PIN '%s' matches the one on the device.").format(pin));
this.addButton('matches', _("Matches"));
this.addButton('does-not-match', _("Does not match"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'matches')
this._applet.agent_reply_confirm(this._devicePath, true);
else
this._applet.agent_reply_confirm(this._devicePath, false);
this.destroy();
}));
}
}
function PinNotification() {
this._init.apply(this, arguments);
}
PinNotification.prototype = {
__proto__: MessageTray.Notification.prototype,
_init: function(source, applet, device_path, name, long_name, numeric) {
MessageTray.Notification.prototype._init.call(this,
source,
_("Bluetooth Agent"),
_("Pairing request for %s").format(name),
{ customContent: true });
this.setResident(true);
this._applet = applet;
this._devicePath = device_path;
this._numeric = numeric;
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addBody(_("Please enter the PIN mentioned on the device."));
this._entry = new St.Entry();
this._entry.connect('key-release-event', Lang.bind(this, function(entry, event) {
let key = event.get_key_symbol();
if (key == Clutter.KEY_Return) {
this.emit('action-invoked', 'ok');
return true;
} else if (key == Clutter.KEY_Escape) {
this.emit('action-invoked', 'cancel');
return true;
}
return false;
}));
this.addActor(this._entry);
this.addButton('ok', _("OK"));
this.addButton('cancel', _("Cancel"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'ok') {
if (this._numeric)
this._applet.agent_reply_passkey(this._devicePath, parseInt(this._entry.text));
else
this._applet.agent_reply_pincode(this._devicePath, this._entry.text);
} else {
if (this._numeric)
this._applet.agent_reply_passkey(this._devicePath, -1);
else
this._applet.agent_reply_pincode(this._devicePath, null);
}
this.destroy();
}));
},
grabFocus: function(lockTray) {
MessageTray.Notification.prototype.grabFocus.call(this, lockTray);
global.stage.set_key_focus(this._entry);
}
}

View File

@ -26,7 +26,10 @@ const UPDeviceType = {
MOUSE: 5,
KEYBOARD: 6,
PDA: 7,
PHONE: 8
PHONE: 8,
MEDIA_PLAYER: 9,
TABLET: 10,
COMPUTER: 11
};
const UPDeviceState = {
@ -68,15 +71,17 @@ Indicator.prototype = {
this._deviceItems = [ ];
this._hasPrimary = false;
this._primaryDeviceId = null;
this._batteryItem = new PopupMenu.PopupMenuItem('');
this._primaryPercentage = new St.Label();
this._batteryItem.addActor(this._primaryPercentage, { align: St.Align.END });
this.menu.addMenuItem(this._batteryItem);
this._deviceSep = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(this._deviceSep);
this._otherDevicePosition = 2;
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("What's using power..."),function() {
GLib.spawn_command_line_async('gnome-power-statistics --device wakeups');
});
this.menu.addAction(_("Power Settings"),function() {
GLib.spawn_command_line_async('gnome-control-center power');
});
@ -95,10 +100,26 @@ Indicator.prototype = {
this._deviceSep.actor.hide();
return;
}
let [device_id, device_type, summary, percentage, state, time] = device;
let [device_id, device_type, icon, percentage, state, seconds] = device;
if (device_type == UPDeviceType.BATTERY) {
this._hasPrimary = true;
this._batteryItem.label.text = summary;
let time = Math.round(seconds / 60);
let minutes = time % 60;
let hours = Math.floor(time / 60);
let timestring;
if (time > 60) {
if (minutes == 0) {
timestring = Gettext.ngettext("%d hour remaining", "%d hours remaining", hours).format(hours);
} else {
/* TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" */
let template = _("%d %s %d %s remaining");
timestring = template.format (hours, Gettext.ngettext("hour", "hours", hours), minutes, Gettext.ngettext("minute", "minutes", minutes));
}
} else
timestring = Gettext.ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes);
this._batteryItem.label.text = timestring;
this._primaryPercentage.text = Math.round(percentage) + '%';
this._batteryItem.actor.show();
if (this._deviceItems.length > 0)
this._deviceSep.actor.show();
@ -109,6 +130,18 @@ Indicator.prototype = {
}
this._primaryDeviceId = device_id;
if (this._primaryDeviceId) {
this._batteryItem.actor.reactive = true;
this._batteryItem.actor.can_focus = true;
this._batteryItem.connect('activate', function(item) {
let p = new Shell.Process({ args: ['gnome-power-statistics', '--device', device_id] });
p.run();
});
} else {
// virtual device
this._batteryItem.actor.reactive = false;
this._batteryItem.actor.can_focus = false;
}
}));
},
@ -181,24 +214,12 @@ DeviceItem.prototype = {
_init: function(device) {
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
let [device_id, device_type, summary, percentage, state, time] = device;
let [device_id, device_type, icon, percentage, state, time] = device;
this._box = new St.BoxLayout({ style_class: 'popup-device-menu-item' });
this._label = new St.Label({ text: summary });
this._label = new St.Label({ text: this._deviceTypeToString(device_type) });
let icon;
switch (state) {
case UPDeviceState.FULLY_CHARGED:
icon = 'battery-full-charged';
break;
case UPDeviceState.UNKNOWN:
icon = 'battery-missing';
break;
default:
icon = this._percentageToIcon(percentage) + (state == UPDeviceState.CHARGING ? '-charging' : '');
}
this._icon = new St.Icon({ icon_name: icon,
this._icon = new St.Icon({ gicon: Shell.util_icon_from_string(icon),
icon_type: St.IconType.SYMBOLIC,
style_class: 'popup-menu-icon' });
@ -206,21 +227,36 @@ DeviceItem.prototype = {
this._box.add_actor(this._label);
this.addActor(this._box);
let percentBin = new St.Bin({ x_align: St.Align.END });
let percentLabel = new St.Label({ text: '%d%%'.format(Math.round(percentage)) });
percentBin.child = percentLabel;
this.addActor(percentBin);
this.addActor(percentLabel, { align: St.Align.END });
},
_percentageToIcon: function(p) {
if (p > 60)
return 'battery-full';
if (p > 30)
return 'battery-good';
if (p > 10)
return 'battery-low';
if (p > 0)
return 'battery-caution';
return 'battery-empty';
_deviceTypeToString: function(type) {
switch (type) {
case UPDeviceType.AC_POWER:
return _("AC adapter");
case UPDeviceType.BATTERY:
return _("Laptop battery");
case UPDeviceType.UPS:
return _("UPS");
case UPDeviceType.MONITOR:
return _("Monitor");
case UPDeviceType.MOUSE:
return _("Mouse");
case UPDeviceType.KEYBOARD:
return _("Keyboard");
case UPDeviceType.PDA:
return _("PDA");
case UPDeviceType.PHONE:
return _("Cell phone");
case UPDeviceType.MEDIA_PLAYER:
return _("Media player");
case UPDeviceType.TABLET:
return _("Tablet");
case UPDeviceType.COMPUTER:
return _("Computer");
default:
return _("Unknown");
}
}
}

View File

@ -38,12 +38,11 @@ Indicator.prototype = {
this._output = null;
this._outputVolumeId = 0;
this._outputMutedId = 0;
this._outputSwitch = new PopupMenu.PopupSwitchMenuItem(_("Volume: Muted"), false);
this._outputSwitch.connect('toggled', Lang.bind(this, this._switchToggled, '_output'));
this._outputTitle = new PopupMenu.PopupMenuItem(_("Volume"), { reactive: false });
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.menu.addMenuItem(this._outputSwitch);
this.menu.addMenuItem(this._outputTitle);
this.menu.addMenuItem(this._outputSlider);
this._separator = new PopupMenu.PopupSeparatorMenuItem();
@ -52,12 +51,11 @@ Indicator.prototype = {
this._input = null;
this._inputVolumeId = 0;
this._inputMutedId = 0;
this._inputSwitch = new PopupMenu.PopupSwitchMenuItem(_("Microphone: Muted"), false);
this._inputSwitch.connect('toggled', Lang.bind(this, this._switchToggled, '_input'));
this._inputTitle = new PopupMenu.PopupMenuItem(_("Microphone"), { reactive: false });
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
this.menu.addMenuItem(this._inputSwitch);
this.menu.addMenuItem(this._inputTitle);
this.menu.addMenuItem(this._inputSlider);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@ -75,11 +73,18 @@ Indicator.prototype = {
let currentVolume = this._output.volume;
if (direction == Clutter.ScrollDirection.DOWN) {
let prev_muted = this._output.is_muted;
this._output.volume = Math.max(0, currentVolume - VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
if (this._output.volume < 1) {
this._output.volume = 0;
if (!prev_muted)
this._output.change_is_muted(true);
}
this._output.push_volume();
}
else if (direction == Clutter.ScrollDirection.UP) {
this._output.volume = Math.min(VOLUME_MAX, currentVolume + VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
this._output.change_is_muted(false);
this._output.push_volume();
}
},
@ -103,8 +108,7 @@ Indicator.prototype = {
this._mutedChanged (null, null, '_output');
this._volumeChanged (null, null, '_output');
} else {
this._outputSwitch.label.text = _("Volume: Muted");
this._outputSwitch.setToggleState(false);
this._outputSlider.setValue(0);
this.setIcon('audio-volume-muted-symbolic');
}
},
@ -124,7 +128,7 @@ Indicator.prototype = {
this._volumeChanged (null, null, '_input');
} else {
this._separator.actor.hide();
this._inputSwitch.actor.hide();
this._inputTitle.actor.hide();
this._inputSlider.actor.hide();
}
},
@ -147,11 +151,11 @@ Indicator.prototype = {
}
if (showInput) {
this._separator.actor.show();
this._inputSwitch.actor.show();
this._inputTitle.actor.show();
this._inputSlider.actor.show();
} else {
this._separator.actor.hide();
this._inputSwitch.actor.hide();
this._inputTitle.actor.hide();
this._inputSlider.actor.hide();
}
},
@ -174,7 +178,17 @@ Indicator.prototype = {
log ('Volume slider changed for %s, but %s does not exist'.format(property, property));
return;
}
this[property].volume = value * VOLUME_MAX;
let volume = value * VOLUME_MAX;
let prev_muted = this[property].is_muted;
if (volume < 1) {
this[property].volume = 0;
if (!prev_muted)
this[property].change_is_muted(true);
} else {
this[property].volume = volume;
if (prev_muted)
this[property].change_is_muted(false);
}
this[property].push_volume();
},
@ -182,20 +196,10 @@ Indicator.prototype = {
global.play_theme_sound('audio-volume-change');
},
_switchToggled: function(switchItem, state, property) {
if (this[property] == null) {
log ('Volume mute switch toggled for %s, but %s does not exist'.format(property, property));
return;
}
this[property].change_is_muted(!state);
this._notifyVolumeChange();
},
_mutedChanged: function(object, param_spec, property) {
let muted = this[property].is_muted;
let toggleSwitch = this[property+'Switch'];
toggleSwitch.setToggleState(!muted);
this._updateLabel(property);
let slider = this[property+'Slider'];
slider.setValue(muted ? 0 : (this[property].volume / VOLUME_MAX));
if (property == '_output') {
if (muted)
this.setIcon('audio-volume-muted');
@ -206,17 +210,7 @@ Indicator.prototype = {
_volumeChanged: function(object, param_spec, property) {
this[property+'Slider'].setValue(this[property].volume / VOLUME_MAX);
this._updateLabel(property);
if (property == '_output' && !this._output.is_muted)
this.setIcon(this._volumeToIcon(this._output.volume));
},
_updateLabel: function(property) {
let label;
if (this[property].is_muted)
label = (property == '_output' ? _("Volume: Muted") : _("Microphone: Muted"));
else
label = (property == '_output' ? _("Volume: %3.0f%%") : _("Microphone: %3.0f%%")).format(this[property].volume / VOLUME_MAX * 100);
this[property+'Switch'].label.text = label;
}
};

View File

@ -111,11 +111,11 @@ StatusMenuButton.prototype = {
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("My Account..."));
item = new PopupMenu.PopupMenuItem(_("My Account"));
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("System Settings..."));
item = new PopupMenu.PopupMenuItem(_("System Settings"));
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
this.menu.addMenuItem(item);
@ -138,7 +138,7 @@ StatusMenuButton.prototype = {
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Suspend"));
item = new PopupMenu.PopupMenuItem(_("Suspend..."));
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
this.menu.addMenuItem(item);
@ -153,12 +153,12 @@ StatusMenuButton.prototype = {
_onMyAccountActivate: function() {
Main.overview.hide();
this._spawn(['gnome-about-me']);
this._spawn(['gnome-control-center', 'user-accounts']);
},
_onPreferencesActivate: function() {
Main.overview.hide();
this._spawn(['gnome-control-center']);
this._spawn(['gnome-control-center', '-o']);
},
_onLockScreenActivate: function() {

View File

@ -3,6 +3,7 @@
const DBus = imports.dbus;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
@ -16,6 +17,7 @@ let contactManager;
let channelDispatcher;
// See Notification.appendMessage
const SCROLLBACK_IMMEDIATE_TIME = 60; // 1 minute
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
const SCROLLBACK_RECENT_LENGTH = 20;
const SCROLLBACK_IDLE_LENGTH = 5;
@ -42,6 +44,10 @@ subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.ChannelType'] = Telepathy.C
subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.TargetHandleType'] = Telepathy.HandleType.LIST;
subscribedContactsChannel[Telepathy.CHANNEL_NAME + '.TargetID'] = 'subscribe';
const NotificationDirection = {
SENT: 'chat-sent',
RECEIVED: 'chat-received'
};
// This is GNOME Shell's implementation of the Telepathy 'Client'
// interface. Specifically, the shell is a Telepathy 'Observer', which
@ -469,8 +475,7 @@ Source.prototype = {
}));
}
this._notification = undefined;
this._sentMessages = [];
this._notification = new Notification(this);
// Since we only create sources when receiving a message, this
// is a plausible default
@ -525,32 +530,23 @@ Source.prototype = {
this.destroy();
},
_ensureNotification: function() {
_messageReceived: function(channel, id, timestamp, sender,
type, flags, text) {
this._notification.appendMessage(text, timestamp, NotificationDirection.RECEIVED);
this.notify();
},
// This is called for both messages we send from
// our client and other clients as well.
_messageSent: function(channel, timestamp, type, text) {
this._notification.appendMessage(text, timestamp, NotificationDirection.SENT);
},
notify: function() {
if (!Main.messageTray.contains(this))
Main.messageTray.add(this);
if (!this._notification) {
this._notification = new Notification(this);
for (let i = 0; i < this._sentMessages.length; i ++)
this._notification.appendMessage(this._sentMessages[i], false, true);
this._sentMessages = [];
}
},
_messageReceived: function(channel, id, timestamp, sender,
type, flags, text) {
this._ensureNotification();
this._notification.appendMessage(text, false, false);
this.notify(this._notification);
},
_messageSent: function(channel, timestamp, type, text) {
if (this._notification) {
this._notification.appendMessage(text, false, true);
this.notify(this._notification);
} else {
this._sentMessages.push(text);
}
MessageTray.Source.prototype.notify.call(this, this._notification);
},
respond: function(text) {
@ -558,22 +554,22 @@ Source.prototype = {
},
setPresence: function(presence, message) {
let msg, notify;
let msg, shouldNotify;
if (presence == Telepathy.ConnectionPresenceType.AVAILABLE) {
msg = _("%s is online.").format(this.title);
notify = (this._presence == Telepathy.ConnectionPresenceType.OFFLINE);
shouldNotify = (this._presence == Telepathy.ConnectionPresenceType.OFFLINE);
} else if (presence == Telepathy.ConnectionPresenceType.OFFLINE ||
presence == Telepathy.ConnectionPresenceType.EXTENDED_AWAY) {
presence = Telepathy.ConnectionPresenceType.OFFLINE;
msg = _("%s is offline.").format(this.title);
notify = (this._presence != Telepathy.ConnectionPresenceType.OFFLINE);
shouldNotify = (this._presence != Telepathy.ConnectionPresenceType.OFFLINE);
} else if (presence == Telepathy.ConnectionPresenceType.AWAY) {
msg = _("%s is away.").format(this.title);
notify = false;
shouldNotify = false;
} else if (presence == Telepathy.ConnectionPresenceType.BUSY) {
msg = _("%s is busy.").format(this.title);
notify = false;
shouldNotify = false;
} else
return;
@ -582,10 +578,9 @@ Source.prototype = {
if (message)
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
this._ensureNotification();
this._notification.appendMessage(msg, true, false);
if (notify)
this.notify(this._notification);
this._notification.appendPresence(msg, shouldNotify);
if (shouldNotify)
this.notify();
}
};
@ -598,29 +593,47 @@ Notification.prototype = {
_init: function(source) {
MessageTray.Notification.prototype._init.call(this, source, source.title, null, { customContent: true });
this.setResident(true);
this._responseEntry = new St.Entry({ style_class: 'chat-response' });
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
this.setActionArea(this._responseEntry);
this._history = [];
this._timestampTimeoutId = 0;
},
appendMessage: function(text, asTitle, sent) {
if (asTitle)
this.update(text, null, { customContent: true });
else
this.update(this.source.title, text, { customContent: true });
this._append(text, sent ? 'chat-sent' : 'chat-received');
appendMessage: function(text, timestamp, direction) {
this.update(this.source.title, text, { customContent: true });
this._append(text, direction, timestamp);
},
_append: function(text, style) {
_append: function(text, style, timestamp) {
let currentTime = (Date.now() / 1000);
if (!timestamp)
timestamp = currentTime;
let lastMessageTime = -1;
if (this._history.length > 0)
lastMessageTime = this._history[0].time;
// Reset the old message timeout
if (this._timestampTimeoutId)
Mainloop.source_remove(this._timestampTimeoutId);
let body = this.addBody(text);
body.add_style_class_name(style);
this.scrollTo(St.Side.BOTTOM);
let now = new Date().getTime() / 1000;
this._history.unshift({ actor: body, time: now });
this._history.unshift({ actor: body, time: timestamp, realMessage: true });
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME)
this._appendTimestamp();
else
// Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME
// from the timestamp of the message.
this._timestampTimeoutId = Mainloop.timeout_add_seconds(
SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp),
Lang.bind(this, this._appendTimestamp));
if (this._history.length > 1) {
// Keep the scrollback from growing too long. If the most
@ -629,17 +642,44 @@ Notification.prototype = {
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
let lastMessageTime = this._history[1].time;
let maxLength = (lastMessageTime < now - SCROLLBACK_RECENT_TIME) ?
let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
if (this._history.length > maxLength) {
let expired = this._history.splice(maxLength);
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
if (filteredHistory.length > maxLength) {
let lastMessageToKeep = filteredHistory[maxLength];
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
for (let i = 0; i < expired.length; i++)
expired[i].actor.destroy();
}
}
},
_appendTimestamp: function() {
let lastMessageTime = this._history[0].time;
let lastMessageDate = new Date(lastMessageTime * 1000);
/* Translators: this is a time format string followed by a date.
If applicable, replace %X with a strftime format valid for your
locale, without seconds. */
// xgettext:no-c-format
let timeLabel = this.addBody(lastMessageDate.toLocaleFormat(_("Sent at %X on %A")), false, { expand: true, x_fill: false, x_align: St.Align.END });
timeLabel.add_style_class_name('chat-meta-message');
this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false });
this._timestampTimeoutId = 0;
return false;
},
appendPresence: function(text, asTitle) {
if (asTitle)
this.update(text, null, { customContent: true });
else
this.update(this.source.title, null, { customContent: true });
let label = this.addBody(text);
label.add_style_class_name('chat-meta-message');
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
},
grabFocus: function(lockTray) {
// Need to call the base class function first so that
// it saves where the key focus was before.
@ -652,6 +692,8 @@ Notification.prototype = {
if (text == '')
return;
// Telepathy sends out the Sent signal for us.
// see Source._messageSent
this._responseEntry.set_text('');
this.source.respond(text);
}

View File

@ -16,12 +16,12 @@ const SearchDisplay = imports.ui.searchDisplay;
const Tweener = imports.ui.tweener;
function SearchEntry() {
this._init();
function SearchEntry(focusBase) {
this._init(focusBase);
}
SearchEntry.prototype = {
_init : function() {
_init : function(focusBase) {
this.actor = new St.Entry({ name: 'searchEntry',
hint_text: _("Search your computer") });
this.entry = this.actor.clutter_text;
@ -45,11 +45,12 @@ SearchEntry.prototype = {
this.pane = null;
this._capturedEventId = 0;
this._focusBase = focusBase;
},
_updateCursorVisibility: function() {
let focus = global.stage.get_key_focus();
if (focus == global.stage || focus == this.entry)
if (focus == this._focusBase || focus == this.entry)
this.entry.set_cursor_visible(true);
else
this.entry.set_cursor_visible(false);
@ -81,8 +82,8 @@ SearchEntry.prototype = {
this.entry.text = '';
// Return focus to the stage
global.stage.set_key_focus(null);
// Return focus to the viewSelector
global.stage.set_key_focus(this._focusBase);
this.entry.set_cursor_visible(true);
this.entry.set_selection(0, 0);
@ -117,11 +118,11 @@ SearchEntry.prototype = {
}
return false;
case Clutter.EventType.KEY_PRESS:
// If neither the stage nor our entry have key focus, some
// "special" actor grabbed the focus (run dialog, looking
// glass); we don't want to interfere with that
// If some "special" actor grabbed the focus (run
// dialog, looking glass); we don't want to interfere
// with that
let focus = global.stage.get_key_focus();
if (focus != global.stage && focus != this.entry)
if (focus != this._focusBase && focus != this.entry)
return false;
let sym = event.get_key_symbol();
@ -231,22 +232,23 @@ ViewTab.prototype = {
};
function SearchTab() {
this._init();
function SearchTab(focusBase) {
this._init(focusBase);
}
SearchTab.prototype = {
__proto__: BaseTab.prototype,
_init: function() {
_init: function(focusBase) {
this._searchActive = false;
this._searchPending = false;
this._keyPressId = 0;
this._searchTimeoutId = 0;
this._focusBase = focusBase;
this._searchSystem = new Search.SearchSystem();
this._searchEntry = new SearchEntry();
this._searchEntry = new SearchEntry(focusBase);
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
BaseTab.prototype._init.call(this,
this._searchEntry.actor,
@ -274,15 +276,15 @@ SearchTab.prototype = {
BaseTab.prototype.show.call(this);
if (this._keyPressId == 0)
this._keyPressId = global.stage.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._keyPressId = this._searchEntry.entry.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
},
hide: function() {
BaseTab.prototype.hide.call(this);
if (this._keyPressId > 0) {
global.stage.disconnect(this._keyPressId);
this._searchEntry.entry.disconnect(this._keyPressId);
this._keyPressId = 0;
}
this._searchEntry.reset();
@ -317,14 +319,7 @@ SearchTab.prototype = {
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, this._doSearch));
},
_onKeyPress: function(stage, event) {
// If neither the stage nor the search entry have key focus, some
// "special" actor grabbed the focus (run dialog, looking glass);
// we don't want to interfere with that
let focus = stage.get_key_focus();
if (focus != stage && focus != this._searchEntry.entry)
return false;
_onKeyPress: function(entry, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.Up) {
if (!this._searchActive)
@ -393,7 +388,7 @@ ViewSelector.prototype = {
this._tabs = [];
this._activeTab = null;
this._searchTab = new SearchTab();
this._searchTab = new SearchTab(this.actor);
this._searchArea.set_child(this._searchTab.title);
this._addTab(this._searchTab);
@ -559,14 +554,7 @@ ViewSelector.prototype = {
}));
},
_onKeyPress: function(stage, event) {
// Only process events if the stage has key focus - search is handled
// by the search tab, and we do not want to interfere with "special"
// actors grabbing focus (run dialog, looking glass, notifications).
let focus = stage.get_key_focus();
if (focus != stage)
return false;
_onKeyPress: function(actor, event) {
let modifiers = Shell.get_event_state(event);
let symbol = event.get_key_symbol();
if (symbol == Clutter.Escape) {
@ -600,8 +588,8 @@ ViewSelector.prototype = {
this._overviewHidingId = Main.overview.connect('hiding',
Lang.bind(this, this._switchDefaultTab));
if (this._keyPressId == 0)
this._keyPressId = global.stage.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._keyPressId = this.actor.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._switchDefaultTab();
},
@ -610,7 +598,7 @@ ViewSelector.prototype = {
this._searchTab.setFindAsYouType(false);
if (this._keyPressId > 0) {
global.stage.disconnect(this._keyPressId);
this.actor.disconnect(this._keyPressId);
this._keyPressId = 0;
}

View File

@ -543,24 +543,34 @@ WindowManager.prototype = {
},
actionMoveWorkspaceLeft: function() {
let rtl = (St.Widget.get_default_direction() == St.TextDirection.RTL);
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
if (activeWorkspaceIndex > 0) {
global.screen.get_workspace_by_index(activeWorkspaceIndex - 1).activate(global.get_current_time());
if (!Main.overview.visible)
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex - 1);
} else if (!Main.overview.visible) {
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, activeWorkspaceIndex);
}
let indexToActivate = activeWorkspaceIndex;
if (rtl && activeWorkspaceIndex < global.screen.n_workspaces - 1)
indexToActivate++;
else if (!rtl && activeWorkspaceIndex > 0)
indexToActivate--;
if (indexToActivate != activeWorkspaceIndex)
global.screen.get_workspace_by_index(indexToActivate).activate(global.get_current_time());
if (!Main.overview.visible)
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.LEFT, indexToActivate);
},
actionMoveWorkspaceRight: function() {
let rtl = (St.Widget.get_default_direction() == St.TextDirection.RTL);
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
if (activeWorkspaceIndex < global.screen.n_workspaces - 1) {
global.screen.get_workspace_by_index(activeWorkspaceIndex + 1).activate(global.get_current_time());
if (!Main.overview.visible)
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex + 1);
} else if (!Main.overview.visible) {
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, activeWorkspaceIndex);
}
let indexToActivate = activeWorkspaceIndex;
if (rtl && activeWorkspaceIndex > 0)
indexToActivate--;
else if (!rtl && activeWorkspaceIndex < global.screen.n_workspaces - 1)
indexToActivate++;
if (indexToActivate != activeWorkspaceIndex)
global.screen.get_workspace_by_index(indexToActivate).activate(global.get_current_time());
if (!Main.overview.visible)
this._workspaceSwitcherPopup.display(WorkspaceSwitcherPopup.RIGHT, indexToActivate);
}
};

View File

@ -132,7 +132,10 @@ WindowClone.prototype = {
if (this.inDrag || this._zooming)
// We'll fix up the stack after the drag/zooming
return;
this.actor.raise(this._stackAbove);
if (this._stackAbove == null)
this.actor.lower_bottom();
else
this.actor.raise(this._stackAbove);
},
destroy: function () {
@ -239,11 +242,13 @@ WindowClone.prototype = {
this.emit('zoom-end');
this.actor.reparent(this._origParent);
if (this._stackAbove == null)
this.actor.lower_bottom();
// If the workspace has been destroyed while we were reparented to
// the stage, _stackAbove will be unparented and we can't raise our
// actor above it - as we are bound to be destroyed anyway in that
// case, we can skip that step
if (this._stackAbove && this._stackAbove.get_parent())
else if (this._stackAbove.get_parent())
this.actor.raise(this._stackAbove);
[this.actor.x, this.actor.y] = this._zoomLocalOrig.getPosition();
@ -275,8 +280,13 @@ WindowClone.prototype = {
// We may not have a parent if DnD completed successfully, in
// which case our clone will shortly be destroyed and replaced
// with a new one on the target workspace.
if (this.actor.get_parent() != null)
this.actor.raise(this._stackAbove);
if (this.actor.get_parent() != null) {
if (this._stackAbove == null)
this.actor.lower_bottom();
else
this.actor.raise(this._stackAbove);
}
this.emit('drag-end');
}
@ -386,7 +396,7 @@ WindowOverlay.prototype = {
// These parameters are not the values retrieved with
// get_transformed_position() and get_transformed_size(),
// as windowClone might be moving.
// See Workspace._fadeInWindowOverlay
// See Workspace._showWindowOverlay
updatePositions: function(cloneX, cloneY, cloneWidth, cloneHeight) {
let button = this.closeButton;
let title = this.title;
@ -459,12 +469,10 @@ WindowOverlay.prototype = {
_idleToggleCloseButton: function() {
this._idleToggleCloseId = 0;
let [x, y, mask] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
x, y);
if (actor != this._windowClone.actor && actor != this.closeButton) {
if (!this._windowClone.actor.has_pointer &&
!this.closeButton.has_pointer)
this.closeButton.hide();
}
return false;
},
@ -558,8 +566,6 @@ Workspace.prototype = {
Lang.bind(this, this._windowRemoved));
this._repositionWindowsId = 0;
this._visible = false;
this.leavingOverview = false;
},
@ -873,8 +879,7 @@ Workspace.prototype = {
xCenter = xCenter * global.screen_width;
let rect = new Meta.Rectangle();
metaWindow.get_outer_rect(rect);
let rect = metaWindow.get_outer_rect();
let buttonOuterHeight, captionHeight;
let buttonOuterWidth = 0;
@ -941,6 +946,9 @@ Workspace.prototype = {
let slots = this._computeAllWindowSlots(visibleClones.length);
visibleClones = this._orderWindowsByMotionAndStartup(visibleClones, slots);
let currentWorkspace = global.screen.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == currentWorkspace;
for (let i = 0; i < visibleClones.length; i++) {
let slot = slots[i];
let clone = visibleClones[i];
@ -957,7 +965,7 @@ Workspace.prototype = {
if (overlay)
overlay.hide();
if (animate) {
if (animate && isOnCurrentWorkspace) {
if (!metaWindow.showing_on_its_workspace()) {
/* Hidden windows should fade in and grow
* therefore we need to resize them now so they
@ -987,20 +995,18 @@ Workspace.prototype = {
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this._fadeInWindowOverlay(clone, overlay);
this._showWindowOverlay(clone, overlay, true);
})
});
} else {
clone.actor.set_position(x, y);
clone.actor.set_scale(scale, scale);
this._fadeInWindowOverlay(clone, overlay);
this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace);
}
}
},
syncStacking: function(stackIndices) {
let desktopClone = this._windows[0];
let visibleClones = this._getVisibleClones();
visibleClones.sort(function (a, b) { return stackIndices[a.metaWindow.get_stable_sequence()] - stackIndices[b.metaWindow.get_stable_sequence()]; });
@ -1008,7 +1014,7 @@ Workspace.prototype = {
let clone = visibleClones[i];
let metaWindow = clone.metaWindow;
if (i == 0) {
clone.setStackAbove(desktopClone.actor);
clone.setStackAbove(null);
} else {
let previousClone = visibleClones[i - 1];
clone.setStackAbove(previousClone.actor);
@ -1016,7 +1022,7 @@ Workspace.prototype = {
}
},
_fadeInWindowOverlay: function(clone, overlay) {
_showWindowOverlay: function(clone, overlay, fade) {
if (clone.inDrag)
return;
@ -1038,17 +1044,21 @@ Workspace.prototype = {
if (overlay) {
overlay.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight);
overlay.fadeIn();
if (fade)
overlay.fadeIn();
else
overlay.show();
}
},
_fadeInAllOverlays: function() {
_showAllOverlays: function() {
let currentWorkspace = global.screen.get_active_workspace();
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
let overlay = this._windowOverlays[i];
if (this._showOnlyWindows != null && !(clone.metaWindow in this._showOnlyWindows))
continue;
this._fadeInWindowOverlay(clone, overlay);
this._showWindowOverlay(clone, overlay, this.metaWorkspace == currentWorkspace);
}
},
@ -1084,7 +1094,7 @@ Workspace.prototype = {
showWindowsOverlays: function() {
this._windowOverlaysGroup.show();
this._fadeInAllOverlays();
this._showAllOverlays();
},
hideWindowsOverlays: function() {
@ -1201,12 +1211,12 @@ Workspace.prototype = {
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.ZOOM);
else
this.positionWindows(WindowPositionFlags.ZOOM);
this._visible = true;
},
// Animates the return from Overview mode
zoomFromOverview : function() {
let currentWorkspace = global.screen.get_active_workspace();
this.leavingOverview = true;
this._hideAllOverlays();
@ -1218,6 +1228,9 @@ Workspace.prototype = {
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
this._doneLeavingOverview));
if (this._metaWorkspace == currentWorkspace)
return;
// Position and scale the windows.
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
@ -1248,7 +1261,6 @@ Workspace.prototype = {
}
}
this._visible = false;
},
destroy : function() {

View File

@ -89,6 +89,7 @@ WorkspaceSwitcherPopup.prototype = {
let children = this._list.get_children();
let childBox = new Clutter.ActorBox();
let rtl = (St.Widget.get_default_direction() == St.TextDirection.RTL);
let x = box.x1;
let prevChildBoxX2 = box.x1 - this._itemSpacing;
for (let i = 0; i < children.length; i++) {
@ -98,6 +99,11 @@ WorkspaceSwitcherPopup.prototype = {
childBox.y2 = box.y1 + this._childHeight;
x += this._childWidth + this._itemSpacing;
prevChildBoxX2 = childBox.x2;
if (rtl) {
let ltrChildBoxX1 = childBox.x1;
childBox.x1 = box.x2 - (childBox.x2 - box.x1);
childBox.x2 = box.x2 - (ltrChildBoxX1 - box.x1);
}
children[i].allocate(childBox, flags);
}
},

View File

@ -14,7 +14,6 @@ const Main = imports.ui.main;
const Overview = imports.ui.overview;
const Tweener = imports.ui.tweener;
const Workspace = imports.ui.workspace;
const Search = imports.ui.search;
const WORKSPACE_SWITCH_TIME = 0.25;
// Note that mutter has a compile-time limit of 36
@ -35,7 +34,7 @@ function WorkspacesView(width, height, x, y, workspaces) {
WorkspacesView.prototype = {
_init: function(width, height, x, y, workspaces) {
this.actor = new St.Group({ style_class: 'workspaces single' });
this.actor = new St.Group({ style_class: 'workspaces-view' });
this.actor.set_clip(x, y, width, height);
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
@ -803,13 +802,15 @@ WorkspaceIndicatorPanel.prototype = {
this._workspaces = null;
},
// Allocate the box centered to the available area like StBin would do,
// except that the full height is used even if the box is not actually
// shown. This is a workaround, as the size of the workspace area is
// determined once when entering the overview, so if it would take up
// the indicator space in that case, it would overlap it later when
// additional workspaces were added.
_allocate: function(actor, box, flags) {
let children = this._box.get_children();
// Don't display a single indicator
if (children.length == 1)
return;
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
let [minWidth, natWidth] = this._box.get_preferred_width(-1);
@ -839,6 +840,12 @@ WorkspaceIndicatorPanel.prototype = {
updateWorkspaces: function(workspaces) {
this._workspaces = workspaces;
// Do not display a single indicator
if (this._workspaces.length == 1)
this.actor.set_skip_paint(this._box, true);
else
this.actor.set_skip_paint(this._box, false);
this._box.remove_all();
for (let i = 0; i < this._workspaces.length; i++) {
let actor = new St.Button({ style_class: 'workspace-indicator',
@ -937,18 +944,45 @@ WorkspaceControlsContainer.prototype = {
this._controls.connect('notify::hover',
Lang.bind(this, this._onHoverChanged));
let workId = Main.initializeDeferredWork(this.actor,
Lang.bind(this, function() {
Main.overview.connect('item-drag-begin',
Lang.bind(this, this.popOut));
Main.overview.connect('item-drag-end',
Lang.bind(this, this.popIn));
Main.overview.connect('window-drag-begin',
Lang.bind(this, this.popOut));
Main.overview.connect('window-drag-end',
Lang.bind(this, this.popIn));
this._controls.x = this._poppedInX();
}));
this._itemDragBeginId = 0;
this._itemDragEndId = 0;
this._windowDragBeginId = 0;
this._windowDragEndId = 0;
},
show: function() {
if (this._itemDragBeginId == 0)
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
Lang.bind(this, this.popOut));
if (this._itemDragEndId == 0)
this._itemDragEndId = Main.overview.connect('item-drag-end',
Lang.bind(this, this.popIn));
if (this._windowDragBeginId == 0)
this._windowDragBeginId = Main.overview.connect('window-drag-begin',
Lang.bind(this, this.popOut));
if (this._windowDragEndId == 0)
this._windowDragEndId = Main.overview.connect('window-drag-end',
Lang.bind(this, this.popIn));
this._controls.x = this._poppedInX();
},
hide: function() {
if (this._itemDragBeginId > 0) {
Main.overview.disconnect(this._itemDragBeginId);
this._itemDragBeginId = 0;
}
if (this._itemEndBeginId > 0) {
Main.overview.disconnect(this._itemDragEndId);
this._itemDragEndId = 0;
}
if (this._windowDragBeginId > 0) {
Main.overview.disconnect(this._windowDragBeginId);
this._windowDragBeginId = 0;
}
if (this._windowDragEndId > 0) {
Main.overview.disconnect(this._windowDragEndId);
this._windowDragEndId = 0;
}
},
_getPreferredWidth: function(actor, forHeight, alloc) {
@ -957,12 +991,19 @@ WorkspaceControlsContainer.prototype = {
alloc.natural_size = natWidth;
},
// Always request the full width ...
_getPreferredHeight: function(actor, forWidth, alloc) {
let [minHeight, natHeight] = this._controls.get_preferred_height(-1);
alloc.min_size = minHeight;
alloc.natural_size = natHeight;
},
// ... even when the controls are popped in, to keep the width constant.
// This is necessary as the workspace size is determined once before
// entering the overview, when the controls are popped in - if the width
// varied, the workspaces would be given too much width, and the controls
// would be overlapped by the workspaces when popped out, rendering them
// useless.
_allocate: function(actor, box, flags) {
let childBox = new Clutter.ActorBox();
childBox.x1 = this._controls.x;
@ -1052,7 +1093,9 @@ WorkspacesDisplay.prototype = {
this._nWorkspacesNotifyId = 0;
},
show: function() {
show: function() {
this._controlsContainer.show();
this._workspaces = [];
for (let i = 0; i < global.screen.n_workspaces; i++) {
let metaWorkspace = global.screen.get_workspace_by_index(i);
@ -1099,6 +1142,8 @@ WorkspacesDisplay.prototype = {
},
hide: function() {
this._controlsContainer.hide();
if (this._nWorkspacesNotifyId > 0)
global.screen.disconnect(this._nWorkspacesNotifyId);
this.workspacesView.destroy();
@ -1153,77 +1198,3 @@ WorkspacesDisplay.prototype = {
}
};
Signals.addSignalMethods(WorkspacesDisplay.prototype);
function WindowSearchProvider() {
this._init();
}
WindowSearchProvider.prototype = {
__proto__: Search.SearchProvider.prototype,
_init: function() {
Search.SearchProvider.prototype._init.call(this, _("WINDOWS"));
this._tracker = Shell.WindowTracker.get_default();
},
_matchWindow: function(window, terms) {
let title = window.get_title().toLowerCase();
let mtype = Search.MatchType.NONE;
for (let i = 0; i < terms.length; i ++) {
let idx = title.indexOf(terms[i]);
if (idx < 0)
return Search.MatchType.NONE;
if (idx == 0)
return Search.MatchType.PREFIX;
}
return Search.MatchType.SUBSTRING;
},
_search: function(items, terms) {
let prefixMatches = [];
let substringMatches = [];
for (let i = 0; i < items.length; i ++) {
let item = items[i];
let match = this._matchWindow(item, terms);
if (match == Search.MatchType.PREFIX)
prefixMatches.push(item);
else if (match == Search.MatchType.SUBSTRING)
substringMatches.push(item);
}
return prefixMatches.concat(substringMatches);
},
getInitialResultSet: function(terms) {
let windows = global.get_window_actors();
windows = windows.map(function(w) { return w.metaWindow });
windows = windows.filter(this._tracker.is_window_interesting);
return this._search(windows, terms);
},
getSubsearchResultSet: function(previousResults, terms) {
return this._search(previousResults, terms);
},
// FIXME: resultId is the metaWindow because there's no obvious lookup ID
getResultMeta: function(resultId) {
if (!resultId)
return null;
let app = this._tracker.get_window_app(resultId);
return { 'id': resultId,
'name': resultId.get_title(),
'icon': app.create_icon_texture(Search.RESULT_ICON_SIZE) };
},
activateResult: function(resultId) {
Main.activateWindow(resultId);
},
expandSearch: function(resultId) {
if (Main.overview && Main.overview.viewSelector)
Main.overview.viewSelector._switchDefaultTab();
}
};

View File

@ -8,6 +8,7 @@ el
en_GB
es
et
fa
fi
fr
ga

View File

@ -15,10 +15,16 @@ js/ui/popupMenu.js
js/ui/runDialog.js
js/ui/statusMenu.js
js/ui/status/accessibility.js
js/ui/status/bluetooth.js
js/ui/status/power.js
js/ui/status/volume.js
js/ui/telepathyClient.js
js/ui/viewSelector.js
js/ui/windowAttentionHandler.js
js/ui/workspacesView.js
src/gvc/gvc-mixer-control.c
src/gdmuser/gdm-user.c
src/shell-app-system.c
src/shell-global.c
src/shell-uri-util.c
src/shell-util.c

353
po/es.po
View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-10-30 17:51+0000\n"
"PO-Revision-Date: 2010-10-31 21:36+0100\n"
"POT-Creation-Date: 2010-12-18 19:25+0000\n"
"PO-Revision-Date: 2010-12-19 13:12+0100\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
@ -100,10 +100,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "Lista de ID de archivos de escritorio para las aplicaciones favoritas"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Modo de visualización de la vista previa del área de trabajo"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -125,19 +121,19 @@ msgstr ""
"predeterminada. Actualmente es «videorate ! theoraenc ! oggmux» y greba en "
"Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Mostrar la fecha en el reloj"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Mostrar la fecha de la semana en el calendario"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Mostrar la hora con segundos"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -145,7 +141,7 @@ msgstr ""
"Las aplicaciones correspondientes con esos identificadores se mostrarán en "
"el área de favoritos."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -155,7 +151,7 @@ msgstr ""
"basado en la fecha actual y usará esta extensión. Se debería cambiar al "
"grabar en otro formato contenedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -163,19 +159,11 @@ msgstr ""
"La tasa de fotogramas de la grabación resultante grabada por el grabador de "
"«screencast» de GNOME Shell, en fotogramas por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La tubería de gstreamer usada para codificar el «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"El modo de vista del área de trabajo seleccionada en la vista general. Los "
"valores soportados son «single» (sencillo) y «grid» (rejilla)."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -187,7 +175,7 @@ msgstr ""
"mantienen de forma privada, puede querer desactivarlo por razones de "
"privacidad. Note que haciéndolo no eliminará los datos ya guardados."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -200,7 +188,7 @@ msgstr ""
"formato específico. Consulte el manual de strftime() para obtener más "
"información."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -217,11 +205,11 @@ msgstr ""
"«custom_format». Note que si se establece a «unix» o «custom» se ignoran las "
"claves «show_date» y «show_seconds»."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "Uuid de las extensiones que desactivar"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr ""
"Indica si se deben recolectar estadísticas acerca del uso de las aplicaciones"
@ -411,62 +399,45 @@ msgstr "Formato _12 horas"
msgid "_24 hour format"
msgstr "Formato _24 horas"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:154
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:235
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:265
msgid "PREFERENCES"
msgstr "PREFERENCIAS"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:562
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:566
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:567
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "Arrastrar aquí para añadir a los favoritos"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "Se ha añadido %s a sus favoritos."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "Se ha quitado %s de sus favoritos."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Buscar"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Quitar"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "No se encontró ningún resultado coincidente."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "ELEMENTOS RECIENTES"
@ -500,63 +471,71 @@ msgstr "Ver fuente"
msgid "Web Page"
msgstr "Página web"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "Deshacer"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "Ventanas"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "Aplicaciones"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "Salir de %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "Preferencias"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:586
msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %H:%M:%S"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e de %b, %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:604
msgid "%a %l:%M %p"
msgstr "%a %H:%M"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "Actividades"
@ -573,6 +552,10 @@ msgstr "Reintentar"
msgid "Connect to..."
msgstr "Conectar a…"
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -599,43 +582,38 @@ msgstr "Disponible"
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Invisible"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Mi cuenta"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "Mi cuenta…"
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Configuración del sistema"
#: ../js/ui/statusMenu.js:123
#| msgid "System Preferences..."
msgid "System Settings..."
msgstr "Ajustes del sistema…"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Salir…"
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "Suspender"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Suspender"
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "Reiniciar…"
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Apagar…"
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Lector de pantalla"
@ -672,13 +650,137 @@ msgstr "Preferencias del acceso universal"
msgid "High Contrast"
msgstr "Contraste alto"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "<b>Texto:</b>"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Configuración de energía"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "Queda %d hora"
msgstr[1] "Queda %d horas"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Quedan %d %s %d %s"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "hora"
msgstr[1] "horas"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "miuto"
msgstr[1] "minutos"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "Queda %d minuto"
msgstr[1] "Queda %d minutos"
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "Batería del portátil"
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "SAI"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "Ratón"
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "Tableta"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "Equipo"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Desconocido"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Volumen"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Configuración del sonido"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s está conectado/a."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s está desconectado/a."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "%s está ausente."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s está ocupado/a."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Enviado a las %X el %A"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Buscar en su equipo"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -690,14 +792,14 @@ msgstr "%s finalizó su lanzamiento"
msgid "'%s' is ready"
msgstr "«%s» está preparado"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"No se puede añadir un área de trabajo nueva porque se ha llegado al límite "
"de áreas de trabajo."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "No se puede quitar el primer área de trabajo."
@ -723,49 +825,49 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "Hace menos de un minuto"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "Hace %d semana"
msgstr[1] "Hace %d semanas"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Carpeta personal"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "Sistema de archivos"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
@ -774,11 +876,42 @@ msgstr "Buscar"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "What's using power..."
#~ msgstr "Lo que está usando energía…"
#~ msgid "Overview workspace view mode"
#~ msgstr "Modo de visualización de la vista previa del área de trabajo"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "El modo de vista del área de trabajo seleccionada en la vista general. "
#~ "Los valores soportados son «single» (sencillo) y «grid» (rejilla)."
#~ msgid "Drag here to add favorites"
#~ msgstr "Arrastrar aquí para añadir a los favoritos"
#~ msgid "Find"
#~ msgstr "Buscar"
#~ msgid "Searching..."
#~ msgstr "Buscando…"
#~ msgid "No matching results."
#~ msgstr "No se encontró ningún resultado coincidente."
#~ msgid "Invisible"
#~ msgstr "Invisible"
#~ msgid "Restart..."
#~ msgstr "Reiniciar…"
#~ msgid "Account Information..."
#~ msgstr "Información de la cuenta…"
@ -794,9 +927,6 @@ msgstr "%1$s: %2$s"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Applications"
#~ msgstr "Aplicaciones"
#~ msgid "Recent Documents"
#~ msgstr "Documentos recientes"
@ -815,9 +945,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "RESULTADOS DE LA BÚSQUEDA"
#~ msgid "Unknown"
#~ msgstr "Desconocido"
#~ msgid "Can't lock screen: %s"
#~ msgstr "No se puede bloquear la pantalla: %s"

236
po/et.po
View File

@ -8,9 +8,9 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-10-16 19:24+0000\n"
"PO-Revision-Date: 2010-10-17 17:16+0300\n"
"Last-Translator: Mattias Põldaru <mahfiaz gmail com>\n"
"POT-Creation-Date: 2010-12-18 23:05+0000\n"
"PO-Revision-Date: 2010-12-18 11:47+0200\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
"Language-Team: Estonian <gnome-et@linux.ee>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
@ -83,9 +83,6 @@ msgstr "Kui tõene, kuvatakse kalendris kuupäeva ISO nädalate järgi."
msgid "List of desktop file IDs for favorite applications"
msgstr "Lemmikrakenduste töölauafailide ID-de loend"
msgid "Overview workspace view mode"
msgstr ""
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 "
@ -125,11 +122,6 @@ msgstr ""
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -270,7 +262,7 @@ msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr "Niitristi moodustavate püst- ja rõhtjoone laius"
msgid "Clock Format"
msgstr "Kella formaat"
msgstr "Kellaaja vorming"
msgid "Clock Preferences"
msgstr "Kella eelistused"
@ -290,7 +282,9 @@ msgstr "_12 tunni vorming"
msgid "_24 hour format"
msgstr "_24 tunni vorming"
#. **** Applications ****
msgid "All"
msgstr ""
msgid "APPLICATIONS"
msgstr "Rakendused"
@ -306,9 +300,6 @@ msgstr "Eemalda lemmikutest"
msgid "Add to Favorites"
msgstr "Lisa lemmikutesse"
msgid "Drag here to add favorites"
msgstr "Lemmikute lisamiseks lohista need siia"
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s lisati lemmikutesse."
@ -317,22 +308,9 @@ msgstr "%s lisati lemmikutesse."
msgid "%s has been removed from your favorites."
msgstr "%s eemaldati lemmikutest."
msgid "Find"
msgstr "Otsi"
msgid "Remove"
msgstr ""
msgid "Searching..."
msgstr "Otsimine..."
msgid "No matching results."
msgstr "Tulemused puuduvad."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
msgid "PLACES & DEVICES"
msgstr "Asukohad ja seadmed"
#. **** Documents ****
msgid "RECENT ITEMS"
msgstr "Hiljutised dokumendid"
@ -342,6 +320,8 @@ msgstr "Ühtegi laiendust pole paigaldatud"
msgid "Enabled"
msgstr "Lubatud"
#. translators:
#. * The device has been disabled
msgid "Disabled"
msgstr "Keelatud"
@ -360,6 +340,12 @@ msgstr "Veebileht"
msgid "Undo"
msgstr "Võta tagasi"
msgid "Windows"
msgstr "Aknad"
msgid "Applications"
msgstr "Rakendused"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#, c-format
msgid "Quit %s"
@ -415,6 +401,9 @@ msgstr "Proovi uuesti"
msgid "Connect to..."
msgstr "Ühendumine..."
msgid "PLACES & DEVICES"
msgstr "Asukohad ja seadmed"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -436,14 +425,11 @@ msgstr "Saadaval"
msgid "Busy"
msgstr "Hõivatud"
msgid "Invisible"
msgstr "Nähtamatu"
msgid "My Account"
msgstr "Minu konto"
msgid "Account Information..."
msgstr "Konto andmed..."
msgid "System Settings..."
msgstr "Süsteemi sätted..."
msgid "System Settings"
msgstr "Süsteemi sätted"
msgid "Lock Screen"
msgstr "Lukusta ekraan"
@ -454,9 +440,146 @@ msgstr "Vaheta kasutajat"
msgid "Log Out..."
msgstr "Logi välja..."
msgid "Suspend..."
msgstr ""
msgid "Shut Down..."
msgstr "Lülita välja..."
msgid "Zoom"
msgstr ""
msgid "Screen Reader"
msgstr "Ekraanilugeja"
msgid "Screen Keyboard"
msgstr "Ekraaniklaviatuur"
msgid "Visual Alerts"
msgstr "Visuaalsed märguanded"
msgid "Sticky Keys"
msgstr "Kleepuvad klahvid"
msgid "Slow Keys"
msgstr "Aeglased klahvid"
msgid "Bounce Keys"
msgstr ""
msgid "Mouse Keys"
msgstr "Hiireklahvid"
msgid "Universal Access Settings"
msgstr "Universaalse ligipääsu sätted"
msgid "High Contrast"
msgstr ""
msgid "Large Text"
msgstr ""
msgid "Power Settings"
msgstr "Toitesätted..."
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] ""
msgstr[1] ""
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#, c-format
msgid "%d %s %d %s remaining"
msgstr ""
msgid "hour"
msgid_plural "hours"
msgstr[0] "tund"
msgstr[1] "tundi"
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minut"
msgstr[1] "minutit"
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] ""
msgstr[1] ""
msgid "AC adapter"
msgstr "Võrgutoite adapter"
msgid "Laptop battery"
msgstr "Sülearvuti aku"
msgid "UPS"
msgstr "UPS"
msgid "Monitor"
msgstr "Monitor"
msgid "Mouse"
msgstr "Hiir"
msgid "Keyboard"
msgstr "Klaviatuur"
msgid "PDA"
msgstr ""
msgid "Cell phone"
msgstr "Mobiiltelefon"
msgid "Media player"
msgstr "Meediaesitaja"
msgid "Tablet"
msgstr ""
msgid "Computer"
msgstr "Arvuti"
msgid "Unknown"
msgstr "Tundmatu"
msgid "Volume"
msgstr "Helivaljus"
msgid "Microphone"
msgstr "Mikrofon"
msgid "Sound Settings"
msgstr "Helisätted"
#, c-format
msgid "%s is online."
msgstr "%s on ühendatud."
#, c-format
msgid "%s is offline."
msgstr "%s on ühendamata."
#, c-format
msgid "%s is away."
msgstr "%s on eemal."
#, c-format
msgid "%s is busy."
msgstr "%s on hõivatud."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#, no-c-format
msgid "Sent at %X on %A"
msgstr ""
msgid "Search your computer"
msgstr ""
#, c-format
msgid "%s has finished starting"
msgstr "%s läks käima"
@ -472,6 +595,25 @@ msgstr "Pole võimalik uut tööala lisada, kuna tööalade piir on saavutatud."
msgid "Can't remove the first workspace."
msgstr "Esimest tööala pole võimalik eemaldada."
#. translators:
#. * The number of sound outputs on a particular device
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
msgstr[1] ""
#. translators:
#. * The number of sound inputs on a particular device
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
msgstr[1] ""
msgid "System Sounds"
msgstr "Süsteemi helid"
msgid "Less than a minute ago"
msgstr "Vähem kui minuti eest"
@ -518,3 +660,21 @@ msgstr "Otsing"
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Drag here to add favorites"
#~ msgstr "Lemmikute lisamiseks lohista need siia"
#~ msgid "Find"
#~ msgstr "Otsi"
#~ msgid "Searching..."
#~ msgstr "Otsimine..."
#~ msgid "No matching results."
#~ msgstr "Tulemused puuduvad."
#~ msgid "Invisible"
#~ msgstr "Nähtamatu"
#~ msgid "Account Information..."
#~ msgstr "Konto andmed..."

730
po/fa.po Normal file
View File

@ -0,0 +1,730 @@
# Persian translation for gnome-shell.
# Copyright (C) 2010 Iranian Free Software Users Group (IFSUG.org)translation team.
# This file is distributed under the same license as the gnome-shell package.
# Arash Mousavi <mousavi.arash@gmail.com>, 2010.
# Mahyar Moghimi <mahyar.moqimi@gmail.com>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-12-01 18:12+0000\n"
"PO-Revision-Date: 2010-12-03 13:24+0330\n"
"Last-Translator: Mahyar Moghimi <mahyar.moqimi@gmail.com>\n"
"Language-Team: Persian <translate@ifsug.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Poedit-Language: Persian\n"
"X-Poedit-Country: IRAN\n"
"X-Poedit-SourceCharset: utf-8\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "پوسته‌ی گنوم"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "مدیریت پنجره‌ها و اجرا کننده‌ی برنامه‌ها"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
msgstr "ساعت"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "سفارشی‌سازی ساعت تابلو"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog."
msgstr "اجازه دسترسی به ابزارهای اشکال‌زدا و پایشگر داخلی با استفاده از محاوره‌ی Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "قالب سفارشی برای ساعت"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "فعال کردن ابزارهای داخلی مفید برای توسعه دهندگان و آزمایش کنندگان از طریق Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
msgstr "پسوند پرونده‌ی قابل استفاده برای ذخیره تصویربرداری از صفحه‌نمایش"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording screencasts."
msgstr "سرعت فریم استفاده شده در تصویربرداری از صفحه‌نمایش."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should not be loaded."
msgstr "افزونه‌های پوسته‌ی گنوم مشخصه‌ی uuid دارند؛ این کلید افزونه‌هایی که نباید بار شوند را فهرست می‌کند."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
msgstr "تاریخچه‌ی فرمان برای محاوره‌ی (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "قالب ساعت"
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true and format is either \"12-hour\" or \"24-hour\", display date in the clock, in addition to time."
msgstr "اگر روی «درست» تنظیم شود و قالب ساعت هر یک از حالت‌های «۱۲ ساعته» و یا «۲۴ ساعته» باشد، تاریخ را در کنار ساعت نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "If true and format is either \"12-hour\" or \"24-hour\", display seconds in time."
msgstr "اگر بر روی «درست» تنظیم شود و قالب ساعت هر یک از جالت‌های «۱۲ ساعته» و یا «۲۴ ساعته» باشد، ثانیه را در کنار ساعت نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "در صورت تنظیم بر روی «درست»، تاریخ هفتگی ایزو را در تقویم نشان می‌دهد."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr "فهرست شناسه‌های پرونده‌ی رومیزی برای برنامه‌های مورد پسند"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "نمایش تاریخ در ساعت"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "نمایش هفته در تقویم"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "نمایش ساعت همراه با ثانیه"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
msgstr "برنامه‌های مشابه این شناسه‌ها در قسمت مورد پسندها نمایش داده می‌شود."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format."
msgstr "نام پرونده‌ی ضبط شده برای تصویربرداری از صفحه‌نمایش یکتا و براساس تاریخ جاری خواهد بود و از این افزونه استفاده خواهد کرد. اگر در زمان ضبط از قالب دیگری استفاده کنید باید تغییر کند."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
msgstr "سرعت فریم حاصل از تصویربرداری از صفحه نمایش با استفاده از ضبط کننده نمایشگر پوسته‌ی گنوم بر اساس فریم بر ثانیه"
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "مجرای ارتباطی gstreamer برای کدگذاری تصویربرداری از صفحه نمایش"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data."
msgstr "پوسته گنوم در حالت عادی برنامه‌های فعال را جهت ارائه برنامه‌های بیشتر استفاده شده پایش می کند. (برای مثال در اجرا کننده‌ها). با اینکه که این اطلاعات به صورت خصوصی نگاه‌داری می‌شود، ممکن است شما بخواهید این امکان را به دلایل امنیتی غیرفعال کنید. لطفا توجه کنید این کار باعث پاک شدن اطلاعاتی که تاکنون ذخیره شده‌اند نمی‌شود."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "This key specifies the format used by the panel clock when the format key is set to \"custom\". You can use conversion specifiers understood by strftime() to obtain a specific format. See the strftime() manual for more information."
msgstr "این کلید قالب ساعتِ قاب را هنگامی که بر روی «سفارشی» تنظیم شده باشد تعیین می‌کند. شما می‌توانید از مبدل‌های قابل فهم در تابع ()strftime برای اختصاص قالب مشخص استفاده کنید. برای اطلاعات بیشتر مستندات ()strftime را مشاهده کنید."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "This key specifies the hour format used by the panel clock. Possible values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set to \"custom\", the clock will display time according to the format specified in the custom_format key. Note that if set to either \"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
msgstr "این کلید قالب ساعت را در تابلو مشخص می‌کند. مقادیر ممکن عبارتند از: «۱۲ ساعته»، «۲۴ ساعته»، «یونیکس» و «سفارشی». چنانچه بر روی «یونیکس» تنظیم گردد، ساعت زمان را به ثانیه از زمان مبدا تاریخ نشان می‌دهد، برای مثال ۰۱-۰۱-۱۹۷۰. اگر بر روی «سفارشی» تنظیم شود ساعت زمان را با توجه به قالب معرفی شده در کلید custom_format نمایش خواهد داد. توجه کنید که چنانچه بر روی یکی از حالت‌های «یونیکس» و یا «سفارشی» تنظیم شود، کلیدهای show_date و show_seconds نادیده گرفته خواهند شد."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "شناسه‌های Uuid مربوط به افزونه‌ها که غیرفعال شود"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "اینکه اطلاعات برنامه‌ها درباره‌ی میزان استفاده از منابع جمع‌آوری شود یا خیر"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
msgid "Color of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
msgid "Determines the length of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid "Determines the position of the magnified mouse image within the magnified view and how it reacts to system mouse movement. The values are - none: no mouse tracking; - centered: the mouse image is displayed at the center of the zoom region (which also represents the point under the system mouse) and the magnified contents are scrolled as the system mouse moves; - proportional: the position of the magnified mouse in the zoom region is proportionally the same as the position of the system mouse on screen; - push: when the magnified mouse intersects a boundary of the zoom region, the contents are scrolled into view."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
msgid "Determines the transparency of the crosshairs, from fully opaque to fully transparent."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
msgid "Determines whether the crosshairs intersect the magnified mouse sprite, or are clipped such that the ends of the horizontal and vertical lines surround the mouse image."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
#| msgid "Enabled"
msgid "Enable lens mode"
msgstr "به کار انداختن حالت لنز"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
msgid "Enables/disables display of crosshairs centered on the magnified mouse sprite."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:9
msgid "For centered mouse tracking, when the system pointer is at or near the edge of the screen, the magnified contents continue to scroll such that the screen edge moves into the magnified view."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
msgid "Magnification factor"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
msgid "Mouse Tracking Mode"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
msgid "Opacity of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
msgid "Screen position"
msgstr "مکان روی صفحه نمایش"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
msgid "Show or hide the magnifier"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
msgid "The color of the the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
msgid "The magnified view either fills the entire screen, or occupies the top-half, bottom-half, left-half, or right-half of the screen."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:21
msgid "The power of the magnification. A value of 1.0 means no magnification. A value of 2.0 doubles the size."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
msgid "Whether the magnified view should be centered over the location of the system mouse and move with it."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "قالب ساعت"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "ترجیحات ساعت"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "نمایش تابلو"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "نمایش _ثانیهها"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "نمایش _تاریخ"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "فالب _۱۲ ساعته"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "قالب _۲۴ ساعته"
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "برنامه‌ها"
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "ترجیحات"
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "پنجره‌ی جدید"
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "حذف از مورد پسندها"
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "اضافه کردن به مورد پسندها"
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "مورد %s به مورد پسندهای شما اضافه شد."
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "مورد %s ازمورد پسندهای شما حذف شد."
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "حذف"
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "موارد اخیر"
#: ../js/ui/lookingGlass.js:552
msgid "No extensions installed"
msgstr "هیچ افزونه‌ای نصب نشده است"
#: ../js/ui/lookingGlass.js:589
msgid "Enabled"
msgstr "به کار انداختن"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591
#: ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "از کار انداختن"
#: ../js/ui/lookingGlass.js:593
msgid "Error"
msgstr "خطا"
#: ../js/ui/lookingGlass.js:595
msgid "Out of date"
msgstr "قدیمی"
#: ../js/ui/lookingGlass.js:620
msgid "View Source"
msgstr "نمایش کدمنبع"
#: ../js/ui/lookingGlass.js:626
msgid "Web Page"
msgstr "صفحه‌ی وب"
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "برگردان"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "خروج از %s"
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "ترجیحات"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S"
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "فعالیت‌ها"
#: ../js/ui/placeDisplay.js:111
#, c-format
msgid "Failed to unmount '%s'"
msgstr "عدم توانایی در پیاده کردن «%s»"
#: ../js/ui/placeDisplay.js:114
msgid "Retry"
msgstr "سعی مجدد"
#: ../js/ui/placeDisplay.js:159
msgid "Connect to..."
msgstr "اتصال به..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "محل‌ها و ابزارها"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
msgstr "لطفا یک فرمان وارد کنید:"
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "اجرای «%s» شکست خورد:"
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "در دسترس"
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "مشغول"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "حساب من"
#: ../js/ui/statusMenu.js:118
#| msgid "System Settings..."
msgid "System Settings"
msgstr "تنظیمات سیستم"
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "قفل کردن صفحه"
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "تعویض کاربر"
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "خروج از سیستم..."
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "معلق کردن..."
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "خاموش کردن..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "بزرگنمایی"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "صفحه خوان"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr "صفحه‌کلید مجازی"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr ""
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr ""
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr ""
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr ""
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "کلیدهای موشی"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr ""
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr ""
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "متن درشت"
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr ""
#: ../js/ui/status/power.js:90
#| msgid "System Settings..."
msgid "Power Settings"
msgstr "تنظیمات برق"
#: ../js/ui/status/power.js:117
#, c-format
#| msgid "%d hour ago"
#| msgid_plural "%d hours ago"
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%Id ساعت مانده"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s مانده"
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "ساعت"
#: ../js/ui/status/power.js:122
#| msgid "%d minute ago"
#| msgid_plural "%d minutes ago"
msgid "minute"
msgid_plural "minutes"
msgstr[0] "%Id دقیقه‌"
#: ../js/ui/status/power.js:125
#, c-format
#| msgid "%d minute ago"
#| msgid_plural "%d minutes ago"
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%Id دقیقه‌ی مانده"
#: ../js/ui/status/power.js:244
msgid "AC adapter"
msgstr "آداپتور برق مستقیم"
#: ../js/ui/status/power.js:246
msgid "Laptop battery"
msgstr "باتری لپتاپ"
#: ../js/ui/status/power.js:248
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
msgid "Monitor"
msgstr "صفحه نمایش"
#: ../js/ui/status/power.js:252
msgid "Mouse"
msgstr "موشی"
#: ../js/ui/status/power.js:254
msgid "Keyboard"
msgstr "صفحه‌کلید"
#: ../js/ui/status/power.js:256
msgid "PDA"
msgstr "دستیار دیجیتال شخصی"
#: ../js/ui/status/power.js:258
msgid "Cell phone"
msgstr "تلفن سلولی"
#: ../js/ui/status/power.js:260
msgid "Media player"
msgstr "پخش کننده‌ی رسانه"
#: ../js/ui/status/power.js:262
#| msgid "Enabled"
msgid "Tablet"
msgstr "لوح‌رایانه"
#: ../js/ui/status/power.js:264
msgid "Computer"
msgstr "رایانه"
#: ../js/ui/status/power.js:266
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "ناشناخته"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "بلندی صدا"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "میکروفون"
#: ../js/ui/status/volume.js:62
#| msgid "System Settings..."
msgid "Sound Settings"
msgstr "تنظیمات صدا"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "جستجوی رایانه‌ی شما"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
msgstr "راه‌اندازی %s پایان یافته است"
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "«%s» آماده است"
#: ../js/ui/workspacesView.js:244
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "نمی‌توان میزکار جدیدی اضافه کرد زیرا به مرز بیشترین تعداد میزکار رسیده‌ایم."
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "نمی‌توان اولین میزکار را حذف کرد."
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u خروجی"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u ورودی"
#: ../src/gvc/gvc-mixer-control.c:1402
#| msgid "System Settings..."
msgid "System Sounds"
msgstr "صداهای سیستم"
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "کمتر از یک دقیقه قبل"
#: ../src/shell-global.c:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%Id دقیقه‌ی پیش"
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%Id ساعت پیش"
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%Id روز پیش"
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%Id هفته‌ی پیش"
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "پوشه‌ی آغازه"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:104
msgid "File System"
msgstr "سیستم پرونده‌ها"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "جستجو"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "حالت بررسی اجمالی میزکار"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "میزکار انتخاب شده در حال مشاهده اجمالی. مقادیر قابل پشتیبانی عبارتند از "
#~ "«تکی» و «شبکه‌ای»."
#~ msgid "Drag here to add favorites"
#~ msgstr "به اینجا بکشید تا به مجبوب‌ها اضافه شود"
#~ msgid "Find"
#~ msgstr "جستجو"
#~ msgid "Searching..."
#~ msgstr "درحال حستجو..."
#~ msgid "No matching results."
#~ msgstr "نتیجه‌ی منطبقی پیدا نشد."
#~ msgid "Invisible"
#~ msgstr "نامرئی"
#~ msgid "Account Information..."
#~ msgstr "اطلاعات جساب"

309
po/gl.po
View File

@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-11-03 00:26+0100\n"
"PO-Revision-Date: 2010-11-03 00:28+0100\n"
"POT-Creation-Date: 2010-12-10 23:25+0100\n"
"PO-Revision-Date: 2010-12-10 23:29+0100\n"
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
"Language-Team: Galician <gnome-gl-list@gnome.org>\n"
"Language: gl\n"
@ -73,7 +73,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
msgstr "Hitorial do diálogo de orde (Alt-F2)"
msgstr "Historial do diálogo de orde (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
@ -104,10 +104,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "Mostra os ID de ficheiros desktop para os aplicativos preferidos"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Modo de visualización do espazo de traballo de vista previa"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -128,19 +124,19 @@ msgstr ""
"está a un valor baleiro, usarase a tubería predeterminada. Actualmente é "
"«videorate ! theoraenc ! oggmux» e grava en Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Mostrar a data no reloxo"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Mostrar a data da semana no calendario"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Mostrar a hora con segundos"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -148,7 +144,7 @@ msgstr ""
"Os aplicativos que corresponden a estes identificadores mostraranse na área "
"de preferidos."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -158,7 +154,7 @@ msgstr ""
"baseado na data actual e usa esta extensión. Debería cambiar ao grabar nun "
"formato de contedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -166,19 +162,11 @@ msgstr ""
"A taxa de marcos do screencast resultante grabado polo grabador de "
"screencasts de GNOME Shell en marcos-por-segundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A tubería de gstreamer usada para codificar o screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"O modo de visualización do espazo de traballo seleccionado na vista previa. "
"Os valores admitidos son \"single\" e \"grid\"."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -190,7 +178,7 @@ msgstr ""
"privados, vostede pode desactivar isto por motivos de privacidade. Teña en "
"conta que facendo isto non eliminará os datos gardados."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -202,7 +190,7 @@ msgstr ""
"de conversión que entende strftime() para obter un formato de hora "
"especificado. Vexa o manual de strftime() para obter máis información."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -219,11 +207,11 @@ msgstr ""
"está estabelecido a «unix» ou «custom», as chaves show_date e show_seconds "
"ignoraranse."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "Os Uuid das extensións a desactivar"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "Indica se recoller estatísticas sobre o uso dos aplicativos"
@ -409,62 +397,41 @@ msgstr "Formato _12 horas"
msgid "_24 hour format"
msgstr "Formato _24 horas"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "APLICATIVOS"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "PREFERENCIAS"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "Eliminar dos favoritos"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "Engadir aos favoritos"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "Arrastre aquí para engadir aos favoritos"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s foi engadido aos seus favoritos."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s foi eliminado dos seus favoritos."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Buscar"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Eliminar"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Buscando..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Non hai resultados que coincidan."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "LUGARES E DISPOSITIVOS"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "ELEMENTOS RECENTES"
@ -498,63 +465,63 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Páxina web"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "Desfacer"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "Saír de %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "Preferencias"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %H:%M:%S"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e de %b, %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "Actividades"
@ -571,6 +538,10 @@ msgstr "Reintentar"
msgid "Connect to..."
msgstr "Conectar con..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "LUGARES E DISPOSITIVOS"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -597,42 +568,38 @@ msgstr "Dispoñíbel"
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Invisíbel"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "A miña conta"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "A miña conta..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Configuracións do sistema"
#: ../js/ui/statusMenu.js:123
msgid "System Settings..."
msgstr "Configuracións do sistema..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Bloquear pantalla"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Saír da sesión..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "Suspender"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Suspender..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "Reiniciar..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Apagar..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Lector de pantalla"
@ -669,13 +636,113 @@ msgstr "Configuracións de acceso universal"
msgid "High Contrast"
msgstr "Alto contraste"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Texto máis grande"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "Que está usando enerxía..."
#: ../js/ui/status/power.js:90
msgid "Power Settings"
msgstr "Configuracións de enerxía"
#: ../js/ui/status/power.js:117
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d hora restante"
msgstr[1] "%d horas restante"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s retante"
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "hora"
msgstr[1] "horas"
#: ../js/ui/status/power.js:122
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
#: ../js/ui/status/power.js:125
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuto restante"
msgstr[1] "%d minutos restantes"
#: ../js/ui/status/power.js:244
msgid "AC adapter"
msgstr "Adaptador de corrente"
#: ../js/ui/status/power.js:246
msgid "Laptop battery"
msgstr "Batería do portátil"
#: ../js/ui/status/power.js:248
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:252
msgid "Mouse"
msgstr "Rato"
#: ../js/ui/status/power.js:254
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:256
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:258
msgid "Cell phone"
msgstr "Teléfono móbil"
#: ../js/ui/status/power.js:260
msgid "Media player"
msgstr "Reprodutor multimedia"
#: ../js/ui/status/power.js:262
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:264
msgid "Computer"
msgstr "Computador"
#: ../js/ui/status/power.js:266 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Descoñecido"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Configuracións de son"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Buscar no seu computador"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -687,14 +754,14 @@ msgstr "%s rematou de iniarse"
msgid "'%s' is ready"
msgstr "«%s» está preparado"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Non é posíbel engadir unha área de traballo nova porque chegouse ao límite "
"de áreas de traballo."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Non é posíbel quitar a primeira área de traballo."
@ -720,49 +787,49 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "Hai menos dun minuto"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "hai %d minuto"
msgstr[1] "hai %d minutos"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "hai %d hora"
msgstr[1] "hai %d horas"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "hai %d día"
msgstr[1] "hai %d días"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "hai %d semana"
msgstr[1] "hai %d semanas"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Cartafol persoal"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "Sistema de ficheiros"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
@ -771,11 +838,39 @@ msgstr "Buscar"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "Modo de visualización do espazo de traballo de vista previa"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "O modo de visualización do espazo de traballo seleccionado na vista "
#~ "previa. Os valores admitidos son \"single\" e \"grid\"."
#~ msgid "Drag here to add favorites"
#~ msgstr "Arrastre aquí para engadir aos favoritos"
#~ msgid "Find"
#~ msgstr "Buscar"
#~ msgid "Searching..."
#~ msgstr "Buscando..."
#~ msgid "No matching results."
#~ msgstr "Non hai resultados que coincidan."
#~ msgid "Invisible"
#~ msgstr "Invisíbel"
#~ msgid "Restart..."
#~ msgstr "Reiniciar..."
#~ msgid "System Preferences..."
#~ msgstr "Preferencias do sistema..."

550
po/he.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-11-01 07:47+0200\n"
"PO-Revision-Date: 2010-11-01 07:48+0200\n"
"POT-Creation-Date: 2010-12-21 12:56+0200\n"
"PO-Revision-Date: 2010-12-21 12:59+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n"
@ -98,10 +98,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "List of desktop file IDs for favorite applications"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Overview workspace view mode"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -121,19 +117,19 @@ msgstr ""
"to an empty value, the default pipeline will be used. This is currently "
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Show date in clock"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Show the week date in the calendar"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Show time with seconds"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -141,81 +137,73 @@ msgstr ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"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."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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."
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"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."
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "The gstreamer pipeline used to encode the screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "Uuids of extensions to disable"
msgstr "Uuids of extensions to disable"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "Whether to collect stats about applications usage"
@ -402,62 +390,45 @@ msgstr "מבנה _12 שעות"
msgid "_24 hour format"
msgstr "מבנה _24 שעות"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:154
msgid "All"
msgstr "הכול"
#: ../js/ui/appDisplay.js:235
msgid "APPLICATIONS"
msgstr "יישומים"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:265
msgid "PREFERENCES"
msgstr "העדפות"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:562
msgid "New Window"
msgstr "חלון חדש"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:566
msgid "Remove from Favorites"
msgstr "הסרה מהמועדפים"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:567
msgid "Add to Favorites"
msgstr "הוספה למועדפים"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "יש לגרור פריטים לכאן כדי להוסיף מועדפים"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s נוסף למועדפים שלך."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s הוסר מהמועדפים שלך."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "חיפוש"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "הסרה"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "בחיפוש..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "אין תוצאות תואמות."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "פריטים אחרונים"
@ -491,63 +462,71 @@ msgstr "צפייה במקור"
msgid "Web Page"
msgstr "דף אינטרנט"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "ביטול"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "חלונות"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "יישומים"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "יציאה מ־%s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "העדפות"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:586
msgid "%a %b %e, %R"
msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:604
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "פעילויות"
@ -564,6 +543,10 @@ msgstr "ניסיון חוזר"
msgid "Connect to..."
msgstr "התחברות אל..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -590,42 +573,38 @@ msgstr "זמין"
msgid "Busy"
msgstr "עסוק"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "בלתי נראה"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "החשבון שלי"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "החשבון שלי..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "הגדרות המערכת"
#: ../js/ui/statusMenu.js:123
msgid "System Settings..."
msgstr "הגדרות המערכת..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "נעילת המסך"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "ניתוק..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "השהיה"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "השהיה..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "הפעלה מחדש..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "כיבוי..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "תקריב"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "מקריא מסך"
@ -662,13 +641,257 @@ msgstr "הגדרות גישה אוניברסלית"
msgid "High Contrast"
msgstr "ניגודיות גבוהה"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "טקסט גדול"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "תקריב"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:200
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "הצגה"
#: ../js/ui/status/bluetooth.js:68
msgid "Send Files to Device..."
msgstr "שליחת קובץ להתקן..."
#: ../js/ui/status/bluetooth.js:71
msgid "Setup a New Device..."
msgstr "הגדרת התקן חדש..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "הגדרות Bluetooth"
#: ../js/ui/status/bluetooth.js:151
msgid "Connection"
msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:187
msgid "Send Files..."
msgstr "שליחת קבצים..."
#: ../js/ui/status/bluetooth.js:192
msgid "Browse Files..."
msgstr "עיון בקבצים..."
#: ../js/ui/status/bluetooth.js:201
msgid "Error browsing device"
msgstr "שגיאה בעיון בהתקן"
#: ../js/ui/status/bluetooth.js:202
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
#: ../js/ui/status/bluetooth.js:210
msgid "Keyboard Settings"
msgstr "הגדרות מקלדת"
#: ../js/ui/status/bluetooth.js:215
msgid "Mouse Settings"
msgstr "הגדרות עכבר"
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "הגדרות שמע"
#: ../js/ui/status/bluetooth.js:293 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:367 ../js/ui/status/bluetooth.js:400
msgid "Bluetooth Agent"
msgstr "סוכן Bluetooth"
#: ../js/ui/status/bluetooth.js:328
#, c-format
msgid "Authorization request from %s"
msgstr "בקשת אישור מאת %s"
#: ../js/ui/status/bluetooth.js:334
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
#: ../js/ui/status/bluetooth.js:336
msgid "Always grant access"
msgstr "תמיד להעניק גישה"
#: ../js/ui/status/bluetooth.js:337
msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:338
msgid "Reject"
msgstr "סירוב"
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Pairing confirmation for %s"
msgstr "אישור צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:374 ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
#: ../js/ui/status/bluetooth.js:375
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "נא לאשר האם קוד ה־PIN '%s' תואם את זה שמופיע בהתקן."
#: ../js/ui/status/bluetooth.js:377
msgid "Matches"
msgstr "התאמות"
#: ../js/ui/status/bluetooth.js:378
msgid "Does not match"
msgstr "אינו תואם"
#: ../js/ui/status/bluetooth.js:401
#, c-format
msgid "Pairing request for %s"
msgstr "בקשת צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:409
msgid "Please enter the PIN mentioned on the device."
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
#: ../js/ui/status/bluetooth.js:425
msgid "OK"
msgstr "אישור"
#: ../js/ui/status/bluetooth.js:426
msgid "Cancel"
msgstr "ביטול"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "הגדרות צריכת החשמל"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "נותרה שעה"
msgstr[1] "נותרו %d שעות"
msgstr[2] "נותרו שעתיים"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s נותרו"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "שעה"
msgstr[1] "שעות"
msgstr[2] "שעתיים"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "דקה"
msgstr[1] "דקות"
msgstr[2] "דקות"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "דקה אחת נותרה"
msgstr[1] "%d דקות נותרו"
msgstr[2] "שתי דקות נותרו"
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "מתאם חשמל"
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "סוללת נייד"
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "אל־פסק"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "צג"
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "עכבר"
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "מקלדת"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "מחשב כף יד"
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "טלפון סלולרי"
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "נגן מדיה"
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "טבלת שליטה"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "מחשב"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "לא ידוע"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "עצמה"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "מיקרופון"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s התחבר/ה."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s התנתק/ה."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "'%s' מרוחק/ת."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s עסוק/ה."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#, no-c-format
msgid "Sent at %X on %A"
msgstr "נשלח ב־%X בשעה %A"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "חיפוש במחשב שלך"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -680,12 +903,12 @@ msgstr "%s סיים את תהליך ההתחלה"
msgid "'%s' is ready"
msgstr "'%s' מוכן"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "לא ניתן להוסיף מרחבי עבודה כיוון שהם ממלאים את המכסה המרבית."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "לא ניתן להסיר את מרחב העבודה הראשון."
@ -713,11 +936,11 @@ msgstr[2] "2 קלטים"
msgid "System Sounds"
msgstr "צלילי מערכת"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "לפני פחות מדקה"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -725,7 +948,7 @@ msgstr[0] "לפני דקה"
msgstr[1] "לפני %d דקות"
msgstr[2] "לפני 2 דקות"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -733,7 +956,7 @@ msgstr[0] "לפני שעה"
msgstr[1] "לפני %d שעות"
msgstr[2] "לפני שעתיים"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -741,7 +964,7 @@ msgstr[0] "לפני יום"
msgstr[1] "לפני %d ימים"
msgstr[2] "לפני יומיים"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -749,17 +972,17 @@ msgstr[0] "לפני שבוע"
msgstr[1] "לפני %d שבועות"
msgstr[2] "לפני שבועיים"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "תיקיית הבית"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "מערכת הקבצים"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "חיפוש"
@ -768,11 +991,42 @@ msgstr "חיפוש"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "What's using power..."
#~ msgstr "מה צורך חשמל..."
#~ msgid "Overview workspace view mode"
#~ msgstr "Overview workspace view mode"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgid "Drag here to add favorites"
#~ msgstr "יש לגרור פריטים לכאן כדי להוסיף מועדפים"
#~ msgid "Find"
#~ msgstr "חיפוש"
#~ msgid "Searching..."
#~ msgstr "בחיפוש..."
#~ msgid "No matching results."
#~ msgstr "אין תוצאות תואמות."
#~ msgid "Invisible"
#~ msgstr "בלתי נראה"
#~ msgid "Restart..."
#~ msgstr "הפעלה מחדש..."
#~ msgid "Account Information..."
#~ msgstr "פרטי המשתמש..."
@ -791,15 +1045,9 @@ msgstr "%1$s: %2$s"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Applications"
#~ msgstr "יישומים"
#~ msgid "Recent Documents"
#~ msgstr "מסמכים אחרונים"
#~ msgid "Unknown"
#~ msgstr "לא ידוע"
#~ msgid "Can't lock screen: %s"
#~ msgstr "לא ניתן לנעול את המסך: %s"

477
po/it.po
View File

@ -3,15 +3,16 @@
# This file is distributed under the same license as the gnome-shell package.
#
# Milo Casagrande <milo@ubuntu.com>, 2009, 2010.
# Luca Ferretti <elle.uca@infinito.it>, 2010.
# Luca Ferretti <lferrett@gnome.org>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-18 10:54+0200\n"
"PO-Revision-Date: 2010-10-18 11:04+0200\n"
"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
"POT-Creation-Date: 2010-12-20 22:54+0100\n"
"PO-Revision-Date: 2010-12-20 22:55+0100\n"
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -99,12 +100,7 @@ msgstr "Se VERO, visualizza il giorno della settimana ISO nel calendario."
msgid "List of desktop file IDs for favorite applications"
msgstr "Elenco di ID di file desktop per le applicazioni preferite"
# (ndt) lunga, ma non è che l'originale aiuti molto...
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Modalità di visualizzazione degli spazi di lavoro nella panoramica"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -125,19 +121,19 @@ msgstr ""
"alcun valore, viene usata la pipeline predefinita il cui valore è "
"\"videorate ! theoraenc ! oggmux\" e che registra nel formato Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Mostra la data nell'orologio"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Mostra il giorno della settimana nel calendario"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Mostra l'ora con i secondi"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -145,7 +141,7 @@ msgstr ""
"Le applicazioni che corrispondono a questi identificatori vengono "
"visualizzate nell'area dei preferiti."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -155,7 +151,7 @@ msgstr ""
"data corrente e utilizza questa estensione. Dovrebbe essere modificato "
"quando si registra utilizzando un diverso formato contenitore."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -163,20 +159,12 @@ msgstr ""
"Il framerate in fotogrammi al secondo dello screencast registrato attraverso "
"il registratore della GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La pipeline di gstreamer utilizzata per codificare lo screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"La modalità di visualizzazione degli spazi di lavoro nella panoramica. I "
"valori supportati sono \"single\" e \"grid\"."
# (ndt) quel "in launchers" non mi convince...
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -188,7 +176,7 @@ msgstr ""
"disabilitare questa funzionalità per motivi di privacy. I dati già salvati "
"non verranno comunque rimossi."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -200,7 +188,7 @@ msgstr ""
"specificatori di formato compatibili con strftime(). Per maggiori "
"informazioni, consultare il manuale di strftime()."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -217,11 +205,11 @@ msgstr ""
"impostata a \"unix\" o \"custom\", le chiavi show_date e show_seconds non "
"vengono considerate."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "UUID delle estensioni da disabilitare"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr ""
"Indica se raccogliere statistiche riguardo l'utilizzo delle applicazioni"
@ -266,7 +254,6 @@ msgid ""
"the mouse image."
msgstr ""
# (ndt) o abilitata?
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
msgid "Enable lens mode"
msgstr ""
@ -380,64 +367,47 @@ msgstr "Formato _12 ore"
msgid "_24 hour format"
msgstr "Formato _24 ore"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:154
msgid "All"
msgstr "Tutte"
#: ../js/ui/appDisplay.js:235
msgid "APPLICATIONS"
msgstr "Applicazioni"
msgstr "APPLICAZIONI"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:265
msgid "PREFERENCES"
msgstr "Preferenze"
msgstr "PREFERENZE"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:562
msgid "New Window"
msgstr "Nuova finestra"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:566
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:567
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
#: ../js/ui/appDisplay.js:830
msgid "Drag here to add favorites"
msgstr "Trascinare qui per aggiungere ai preferiti"
# (ndt) e usare:
# L'elemento %s è stato rimosso... ?
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s è stato aggiunto ai preferiti."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s è stato rimosso dai preferiti."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Trova"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Rimuovi"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Ricerca..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Nessun risultato."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "Risorse e dispositivi"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "Elementi recenti"
@ -451,7 +421,9 @@ msgid "Enabled"
msgstr "Abilitato"
# (ndt) o disabilitata?
#: ../js/ui/lookingGlass.js:591
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Disabilitato"
@ -471,64 +443,72 @@ msgstr "Visualizza sorgente"
msgid "Web Page"
msgstr "Pagina web"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "Annulla"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "Finestra"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "Applicazioni"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:468
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "Chiudi %s"
#: ../js/ui/panel.js:493
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "Preferenze"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:579
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %k.%M.%S"
# (ndt) proviamo col k, se non funge, sappiamo il perché...
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:586
msgid "%a %b %e, %R"
msgstr "%a %e %b, %k.%M"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:584
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%a %k.%M.%S"
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%a %k.%M"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:592
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %P"
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l.%M %P"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:597
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %P"
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:604
msgid "%a %l:%M %p"
msgstr "%a %l.%M %P"
#. 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".
#: ../js/ui/panel.js:743
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "Attività"
@ -546,6 +526,10 @@ msgstr "Riprova"
msgid "Connect to..."
msgstr "Connetti a..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "Risorse e dispositivi"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -564,42 +548,46 @@ msgstr "Inserire un comando:"
msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:"
#: ../js/ui/statusMenu.js:97
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "Disponibile"
#: ../js/ui/statusMenu.js:101
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "Non disponibile"
#: ../js/ui/statusMenu.js:105
msgid "Invisible"
msgstr "Invisibile"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Account personale"
#: ../js/ui/statusMenu.js:112
msgid "Account Information..."
msgstr "Informazioni account..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Impostazioni di sistema"
#: ../js/ui/statusMenu.js:116
msgid "System Settings..."
msgstr "Impostazioni di sistema..."
#: ../js/ui/statusMenu.js:123
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Blocca schermo"
#: ../js/ui/statusMenu.js:127
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Cambia utente"
#: ../js/ui/statusMenu.js:132
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Termina sessione..."
#: ../js/ui/statusMenu.js:136
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Sospendi..."
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Arresta..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Ingrandimento"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Lettore schermo"
@ -636,13 +624,258 @@ msgstr "Impostazioni accesso universale"
msgid "High Contrast"
msgstr "Contrasto elevato"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Caratteri grandi"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "Ingrandimento"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:200
msgid "Bluetooth"
msgstr "Bluetooth"
# as on Android :P
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Rilevabile"
#: ../js/ui/status/bluetooth.js:68
msgid "Send Files to Device..."
msgstr "Invia file al dispositivo..."
#: ../js/ui/status/bluetooth.js:71
msgid "Setup a New Device..."
msgstr "Imposta un nuovo dispositivo..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "Impostazioni Bluetooth"
# indica lo stato del device BT, per esempio gli auricolari
# credo sia meglio l'aggettivo che il sostantivo
#: ../js/ui/status/bluetooth.js:151
msgid "Connection"
msgstr "Collegato"
#: ../js/ui/status/bluetooth.js:187
msgid "Send Files..."
msgstr "Invia file..."
#: ../js/ui/status/bluetooth.js:192
msgid "Browse Files..."
msgstr "Esplora file..."
#: ../js/ui/status/bluetooth.js:201
msgid "Error browsing device"
msgstr "Errore nell'esplorare il dispositivo"
#: ../js/ui/status/bluetooth.js:202
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Non è possibile esplorare il dispositivo richiesto, l'errore è «%s»"
#: ../js/ui/status/bluetooth.js:210
msgid "Keyboard Settings"
msgstr "Impostazioni tastiera"
#: ../js/ui/status/bluetooth.js:215
msgid "Mouse Settings"
msgstr "Impostazioni mouse"
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Impostazioni audio"
#: ../js/ui/status/bluetooth.js:293 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:367 ../js/ui/status/bluetooth.js:400
msgid "Bluetooth Agent"
msgstr ""
#: ../js/ui/status/bluetooth.js:328
#, c-format
msgid "Authorization request from %s"
msgstr "Richesta autorizzazione da %s"
#: ../js/ui/status/bluetooth.js:334
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Il dispositivo %s vuole accedere al servizio «%s»"
#: ../js/ui/status/bluetooth.js:336
msgid "Always grant access"
msgstr "Consenti sempre accesso"
#: ../js/ui/status/bluetooth.js:337
msgid "Grant this time only"
msgstr "Consenti solo stavolta"
#: ../js/ui/status/bluetooth.js:338
msgid "Reject"
msgstr "Rifiuta"
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Conferma associazione per %s"
#: ../js/ui/status/bluetooth.js:374 ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Il dispositivo %s vuole associarsi con questo computer"
#: ../js/ui/status/bluetooth.js:375
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confermare la corrispondenza del PIN «%s» con quello sul dispositivo."
#: ../js/ui/status/bluetooth.js:377
msgid "Matches"
msgstr "Corrisponde"
#: ../js/ui/status/bluetooth.js:378
msgid "Does not match"
msgstr "Non corrisponde"
#: ../js/ui/status/bluetooth.js:401
#, c-format
msgid "Pairing request for %s"
msgstr "Richiesta associazione per %s"
#: ../js/ui/status/bluetooth.js:409
msgid "Please enter the PIN mentioned on the device."
msgstr "Inserire il PIN indicato sul dispositivo."
#: ../js/ui/status/bluetooth.js:425
msgid "OK"
msgstr "OK"
#: ../js/ui/status/bluetooth.js:426
msgid "Cancel"
msgstr "Annulla"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Impostazioni alimentazione"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d ora rimanente"
msgstr[1] "%d ore rimanenti"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s e %d %s rimanenti"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "ora"
msgstr[1] "ore"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minuti"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuto rimanente"
msgstr[1] "%d minuti rimanenti"
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "Alimentatore di corrente"
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "Batteria del portatile"
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "Mouse"
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "Tastiera"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "PDS"
# c'era una discussione su tp...
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "Cellulare"
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "Lettore multimediale"
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "Computer"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Sconosciuto"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Microfono"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s è disponibile."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s è fuori rete."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "%s è assente."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s non è disponibile."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Inviato alle %-H.%M.%S di %A"
# FIXME ma ha senso in inglese???
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Cerca nel computer"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -656,60 +889,82 @@ msgid "'%s' is ready"
msgstr "«%s» è pronto"
# (ndt) un po' liberetta...
#: ../js/ui/workspacesView.js:230
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Impossibile aggiungere un nuovo spazio di lavoro: raggiunto il limite "
"massimo consentito."
#: ../js/ui/workspacesView.js:247
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Impossibile rimuovere il primo spazio di lavoro."
#: ../src/shell-global.c:1196
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u uscita"
msgstr[1] "%u uscite"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u ingresso"
msgstr[1] "%u ingressi"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "Audio di sistema"
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "Meno di un minuto fa"
#: ../src/shell-global.c:1200
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minuto fa"
msgstr[1] "%d minuti fa"
#: ../src/shell-global.c:1205
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ora fa"
msgstr[1] "%d ore fa"
#: ../src/shell-global.c:1210
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d giorno fa"
msgstr[1] "%d giorni fa"
#: ../src/shell-global.c:1215
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d settimana fa"
msgstr[1] "%d settimane fa"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Cartella home"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "File system"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Cerca"
@ -719,13 +974,7 @@ msgstr "Cerca"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "ON"
#~ msgstr "On"
#~ msgid "OFF"
#~ msgstr "Off"

315
po/nb.po
View File

@ -5,10 +5,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 2.31.x\n"
"Project-Id-Version: gnome-shell 2.91.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-28 17:35+0200\n"
"PO-Revision-Date: 2010-10-28 17:38+0200\n"
"POT-Creation-Date: 2010-12-17 14:18+0100\n"
"PO-Revision-Date: 2010-12-17 14:19+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@ -92,10 +92,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -107,48 +103,42 @@ msgid ""
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Vis dato i klokken"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Vis dato for uken i kalender"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Vis tid med sekunder"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -156,7 +146,7 @@ msgid ""
"remove already saved data."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -164,7 +154,7 @@ msgid ""
"information."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -174,11 +164,11 @@ msgid ""
"the show_date and show_seconds keys are ignored."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "Uuider på utvidelser som skal slås av"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "Om det skal samles statistikk om bruk av programmer"
@ -335,62 +325,41 @@ msgstr "_12-timers format"
msgid "_24 hour format"
msgstr "_24-timers format"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "BRUKERVALG"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
#: ../js/ui/appDisplay.js:830
msgid "Drag here to add favorites"
msgstr "Dra hit for å legge til favoritter"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s ble lagt til i dine favoritter."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s ble fjernet fra dine favoritter."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Finn"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Fjern"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Søker..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Ingen treff."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "SISTE OPPFØRINGER"
@ -424,63 +393,71 @@ msgstr "Vis kildekode"
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "Angre"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "Vinduer"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "Programmer"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "Avslutt %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "Brukervalg"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R.%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %p"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l.%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l.%M %p"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "Aktiviteter"
@ -497,6 +474,10 @@ msgstr "Prøv igjen"
msgid "Connect to..."
msgstr "Koble til..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -523,42 +504,38 @@ msgstr "Tilgjengelig"
msgid "Busy"
msgstr "Opptatt"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Usynlig"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Min konto"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "Min konto..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Systeminnstillinger"
#: ../js/ui/statusMenu.js:123
msgid "System Preferences..."
msgstr "Brukervalg for systemet..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Lås skjerm"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Bytt bruker"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Logg ut..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "Hvilemodus"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Hvilemodus..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "Start på nytt..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Avslutt..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Skjermleser"
@ -595,13 +572,141 @@ msgstr "Innstillinger for tilgjengelighet"
msgid "High Contrast"
msgstr "Høy kontrast"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Stor tekst"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/power.js:85
msgid "What's using power..."
msgstr "Hva bruker strøm..."
#: ../js/ui/status/power.js:88
msgid "Power Settings"
msgstr "Innstillinger for strøm"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d time gjenstår"
msgstr[1] "%d timer gjenstår"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:118
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s gjenstår"
#: ../js/ui/status/power.js:120
msgid "hour"
msgid_plural "hours"
msgstr[0] "time"
msgstr[1] "timer"
#: ../js/ui/status/power.js:120
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minutt"
msgstr[1] "minutter"
#: ../js/ui/status/power.js:123
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:240
msgid "AC adapter"
msgstr "Strømadapter"
#: ../js/ui/status/power.js:242
msgid "Laptop battery"
msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:244
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:246
msgid "Monitor"
msgstr "Skjerm"
#: ../js/ui/status/power.js:248
msgid "Mouse"
msgstr "Mus"
#: ../js/ui/status/power.js:250
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/status/power.js:252
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:254
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:256
msgid "Media player"
msgstr "Medieavspiller"
#: ../js/ui/status/power.js:258
msgid "Tablet"
msgstr "Nettbrett"
#: ../js/ui/status/power.js:260
msgid "Computer"
msgstr "Datamaskin"
#: ../js/ui/status/power.js:262 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Ukjent"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Volum"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Innstillinger for lyd"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s er tilkoblet."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s er frakoblet."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "«%s» er borte."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s er opptatt."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Sendt %X på %A"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Søk på din datamaskin"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -613,14 +718,14 @@ msgstr "%s er ferdig startet"
msgid "'%s' is ready"
msgstr "«%s» er klar"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Kan ikke legge til nytt arbeidsområde fordi grensen for maksimalt antall "
"arbeidsområder er nådd."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Kan ikke fjerne første arbeidsområde"
@ -646,49 +751,49 @@ msgstr[1] "%u innganger"
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/shell-global.c:1204
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1208
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minutt siden"
msgstr[1] "%d minutter siden"
#: ../src/shell-global.c:1213
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d time siden"
msgstr[1] "%d timer siden"
#: ../src/shell-global.c:1218
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dag siden"
msgstr[1] "%d dager siden"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d uke siden"
msgstr[1] "%d uker siden"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Hjemmemappe"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "Filsystem"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Søk"
@ -697,7 +802,7 @@ msgstr "Søk"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"

233
po/pa.po
View File

@ -1,22 +1,22 @@
# Punjabi translation for gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
#
# A S Alam <aalam@users.sf.net>, 2009, 2010.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-10-27 23:15+0000\n"
"PO-Revision-Date: 2010-10-29 08:13+0530\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-11-29 15:38+0000\n"
"PO-Revision-Date: 2010-12-01 08:23+0530\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"Language-Team: punjabi-users@lists.sf.net\n"
"Language: pa\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.1\n"
"X-Generator: Virtaal 0.6.1\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
@ -92,10 +92,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "ਪਸੰਦੀਦਾ ਐਪਲੀਕੇਸ਼ਨ ਲਈ ਡੈਸਕਟਾਪ ਫਾਇਲ ID ਦੀ ਲਿਸਟ ਹੈ"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਦੀ ਝਲਕ"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -107,32 +103,32 @@ msgid ""
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "ਘੜੀ ਵਿੱਚ ਮਿਤੀ ਵੇਖੋ"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "ਕੈਲੰਡਰ ਵਿੱਚ ਹਫ਼ਤਾ ਮਿਤੀ ਵੇਖੋ"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "ਸਮਾਂ ਵਿੱਚ ਸਕਿੰਟ ਵੇਖੋ"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "ਇਹਨਾਂ ਐਂਡਟਟੀਫਾਇਰ ਨਾਲ ਸਬੰਧਿਤ ਐਪਲੀਕੇਸ਼ਨ ਨੂੰ ਪਸੰਦੀਦਾ ਖੇਤਰ 'ਚ ਵੇਖਾਇਆ ਜਾਵੇਗਾ।"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -140,18 +136,11 @@ msgstr ""
"ਗਨੋਮ ਸ਼ੈੱਲ ਦੇ ਸਕਰੀਨਕਾਸਟ ਰਿਕਾਰਡਰ ਵਲੋਂ ਰਿਕਾਰਡ ਕਰਕੇ ਬਣਾਈ ਗਈ ਸਕਰੀਨਕਾਸਟ ਦਾ ਫਰੇਮਰੇਟ ਫਰੇਮ ਪ੍ਰਤੀ "
"ਸਕਿੰਟ 'ਚ ਹੈ।"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "ਸਕਰੀਨਕਾਸਟ ਇੰਕੋਡ ਕਰਨ ਲਈ ਵਰਤਣ ਵਾਸਤੇ ਜੀਸਟਰੀਮਰ ਪਾਇਪਲਾਇਨ"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"ਸੰਖੇਪ ਵਿੱਚ ਚੁਣੇ ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਹੈ। ਸਹਾਇਕ ਮੁੱਲ ਹਨ \"single\"(ਇੱਕਲਾ) ਜਾਂ \"grid\" (ਗਰਿੱਡ)।"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -159,7 +148,7 @@ msgid ""
"remove already saved data."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -170,7 +159,7 @@ msgstr ""
"ਹੋਵੇ। ਤੁਸੀਂ ਖਾਸ ਫਾਰਮੈਟ ਦੇਣ ਲਈ ਹਦਾਇਤਾਂ ਵਾਸਤੇ strftime () ਨੂੰ ਵਰਤ ਸਕਦੇ ਹੋ। ਹੋਰ ਜਾਣਕਾਰੀ ਲਈ "
"strftime () ਦਸਤਾਵੇਜ਼ ਵੇਖੋ।"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -186,11 +175,11 @@ msgstr ""
"ਮੁਤਾਬਕ ਵੇਖਾਇਆ ਜਾਵੇਗਾ। ਯਾਦ ਰੱਖੋ ਕਿ ਜੇ \"ਯੂਨੈਕਸ\" ਜਾਂ \"ਪਸੰਦੀਦਾ\" ਸੈੱਟ ਕੀਤਾ ਤਾਂ ਅੱਪਗਰੇਡ ਮਿਤੀ "
"ਵੇਖਾਓ ਤੇ ਸਕਿੰਟ ਵੇਖਾਓ ਨੂੰ ਅਣਡਿੱਠਾ ਕੀਤਾ ਜਾਵੇਗਾ।"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "ਇਕਟੈਨਸ਼ਨ ਦੀ Uuids ਬੰਦ ਹੈ"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "ਐਪਲੀਕੇਸ਼ਨ ਵਰਤੋਂ ਬਾਰੇ ਅੰਕੜੇ ਇੱਕਠੇ ਕਰਨੇ ਹਨ"
@ -206,7 +195,7 @@ msgstr "ਕਰਾਂਸਹੇਅਰ ਦਾ ਰੰਗ"
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
msgstr "ਵਰਟੀਕਲ ਤੇ ਹਰੀਜੱਟਲ ਲਾਈਨਾਂ ਦੀ ਲੰਬਾਈ ਦੱਸੋ, ਜੋ ਕਿ ਕਰਾਂਸਹੇਅਰ ਬਣਾਉਂਦੀਆਂ ਹਨ।"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid ""
@ -225,7 +214,7 @@ msgstr ""
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr ""
msgstr "ਕਰਾਂਸਹੇਅਰ ਦੀ ਟਰਾਂਸਪਰੇਸੀ ਤਹਿ ਕਰੋ, ਪੂਰੀ ਤਰ੍ਹਾਂ ਧੁੰਦਲੇ ਤੋਂ ਪਾਰਦਰਸ਼ੀ ਹੀ।"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
msgid ""
@ -235,7 +224,6 @@ msgid ""
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
#| msgid "Enabled"
msgid "Enable lens mode"
msgstr "ਲੈਨਜ਼ ਮੋਡ ਚਾਲੂ"
@ -348,62 +336,41 @@ msgstr "_੨ ਘੰਟੇ ਫਾਰਮੈਟ"
msgid "_24 hour format"
msgstr "_੨ ਘੰਟੇ ਫਾਰਮੈਟ"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "ਪਸੰਦ"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:538
msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:542
msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:543
msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
#: ../js/ui/appDisplay.js:830
msgid "Drag here to add favorites"
msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ।"
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਤੋਂ ਹਟਾਇਆ ਜਾ ਚੁੱਕਿਆ ਹੈ।"
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "ਖੋਜ"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "ਹਟਾਓ"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "ਤਾਜ਼ਾ ਆਈਟਮਾਂ"
@ -437,63 +404,63 @@ msgstr "ਸਰੋਤ ਵੇਖੋ"
msgid "Web Page"
msgstr "ਵੈੱਬ ਪੇਜ਼"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "ਵਾਪਸ"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "%s ਬੰਦ ਕਰੋ"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "ਮੇਰੀ ਪਸੰਦ"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a, %e %b %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l:%M:%S %p"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "ਸਰਗਰਮੀਆਂ"
@ -510,6 +477,10 @@ msgstr "ਮੁੜ-ਕੋਸ਼ਿਸ਼"
msgid "Connect to..."
msgstr "...ਨਾਲ ਕੁਨੈਕਟ ਕਰੋ"
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -536,40 +507,34 @@ msgstr "ਉਪਲੱਬਧ"
msgid "Busy"
msgstr "ਰੁਝਿਆ"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "ਅਦਿੱਖ"
#: ../js/ui/statusMenu.js:114
#| msgid "My Account..."
msgid "My Account"
msgstr "ਮੇਰਾ ਅਕਾਊਂਟ"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "...ਮੇਰਾ ਅਕਾਊਂਟ"
#: ../js/ui/statusMenu.js:118
#| msgid "System Sounds"
msgid "System Settings"
msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ"
#: ../js/ui/statusMenu.js:123
#| msgid "Preferences"
msgid "System Preferences..."
msgstr "ਸਿਸਟਮ ਪਸੰਦ..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "ਲਾਗਆਉਟ..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "ਸਸਪੈਂਡ"
#: ../js/ui/statusMenu.js:141
#| msgid "Suspend"
msgid "Suspend..."
msgstr "ਸਸਪੈਂਡ..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "...ਮੁੜ-ਚਾਲੂ"
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "ਬੰਦ ਕਰੋ..."
@ -609,14 +574,18 @@ msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ"
msgid "High Contrast"
msgstr "ਵੱਧ ਕਨਟਰਾਸਟ"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "ਵੱਡੇ ਅੱਖਰ"
#: ../js/ui/status/accessibility.js:223
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "ਜ਼ੂਮ"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "ਆਪਣੇ ਕੰਪਿਊਟਰ ਉੱਤੇ ਲੱਭੋ"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
@ -627,11 +596,11 @@ msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ"
msgid "'%s' is ready"
msgstr "'%s' ਤਿਆਰ ਹੈ"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "ਨਵਾਂ ਵਰਕਸਪੇਸ ਜੋੜਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ, ਕਿਉਂਕਿ ਵਰਕਸਪੇਸਾਂ ਦੀ ਵੱਧੋ-ਵੱਧ ਗਿਣਤੀ ਪੂਰੀ ਹੋ ਚੁੱਕੀ ਹੈ।"
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "ਪਹਿਲਾਂ ਵਰਕਸਪੇਸ ਨਹੀਂ ਹਟਾਇਆ ਜਾ ਸਕਦਾ।"
@ -654,53 +623,56 @@ msgstr[0] "%u ਇੰਪੁੱਟ"
msgstr[1] "%u ਇੰਪੁੱਟ"
#: ../src/gvc/gvc-mixer-control.c:1402
#| msgid "System Settings..."
msgid "System Sounds"
msgstr "ਸਿਸਟਮ ਸਾਊਂਡ"
#: ../src/shell-global.c:1204
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "ਅਣਜਾਣ"
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1208
#: ../src/shell-global.c:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1213
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1218
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "ਘਰ ਫੋਲਡਰ"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "ਫਾਇਲ ਸਿਸਟਮ"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ਖੋਜ"
@ -709,11 +681,43 @@ msgstr "ਖੋਜ"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਦੀ ਝਲਕ"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "ਸੰਖੇਪ ਵਿੱਚ ਚੁਣੇ ਵਰਕਸਪੇਸ ਝਲਕ ਮੋਡ ਹੈ। ਸਹਾਇਕ ਮੁੱਲ ਹਨ \"single\"(ਇੱਕਲਾ) ਜਾਂ \"grid"
#~ "\" (ਗਰਿੱਡ)।"
#~ msgid "Drag here to add favorites"
#~ msgstr "ਪਸੰਦ ਵਿੱਚ ਜੋੜਨ ਲਈ ਇੱਥੇ ਸੁੱਟੋ"
#~ msgid "Find"
#~ msgstr "ਖੋਜ"
#~ msgid "Searching..."
#~ msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
#~ msgid "No matching results."
#~ msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
#~ msgid "Invisible"
#~ msgstr "ਅਦਿੱਖ"
#~| msgid "Preferences"
#~ msgid "System Preferences..."
#~ msgstr "ਸਿਸਟਮ ਪਸੰਦ..."
#~ msgid "Restart..."
#~ msgstr "...ਮੁੜ-ਚਾਲੂ"
#~ msgid "Account Information..."
#~ msgstr "ਅਕਾਊਂਟ ਜਾਣਕਾਰੀ..."
@ -744,9 +748,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "ਖੋਜ ਨਤੀਜੇ"
#~ msgid "Unknown"
#~ msgstr "ਅਣਜਾਣ"
#~ msgid "Can't lock screen: %s"
#~ msgstr "ਸਕਰੀਨ ਲਾਕ ਨਹੀਂ ਹੋ ਸਕਦੀ: %s"

View File

@ -5,16 +5,17 @@
# Rodrigo Flores <mail@rodrigoflores.org>, 2009.
# Felipe Borges <felipe10borges@gmail.com>, 2010.
# Henrique P. Machado <hpmachado@gnome.org>, 2010.
# Jonh Wendell <wendell@bani.com.br>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-10-30 17:51+0000\n"
"PO-Revision-Date: 2010-09-02 17:36-0300\n"
"Last-Translator: Henrique P. Machado <hpmachado@gnome.org>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-07 08:59-0200\n"
"PO-Revision-Date: 2010-12-06 16:03+0100\n"
"Last-Translator: Jonh Wendell <wendell@bani.com.br>\n"
"Language-Team: Brazilian Portuguese <pt_BR>\n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -104,10 +105,6 @@ msgstr ""
"Lista dos IDs de arquivo de área de trabalho para os aplicativos favoritos"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Resumo do modo de visão de áreas de trabalho"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -128,19 +125,19 @@ msgstr ""
"o fluxo de processamento padrão será usado. Atualmente é 'videorate ! "
"theoraenc ! oggmux' e gravação no formato Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Mostrar data no relógio"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Mostrar o número da semana no calendário"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Mostrar horário com segundos"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -148,7 +145,7 @@ msgstr ""
"Os aplicativos correspondentes a estes identificadores serão exibidos na "
"área de favoritos."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -158,7 +155,7 @@ msgstr ""
"baseado na data atual e usará esta extensão. Ele deve ser alterado ao gravar "
"para um contêiner de formato diferente."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -166,19 +163,11 @@ msgstr ""
"A taxa de quadros do screencast resultante gravado pelo gravador de "
"screencastsdo GNOME Shell em quadros por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "A fila de processamento gstreamer usada para codificar o screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"O o modo de visão do espaço de trabalho na visão geral. Valores aceitos são: "
"\"single\" e \"grid\"."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -190,7 +179,7 @@ msgstr ""
"segurança, você pode querer desabilitá-los por razões de privacidade. Por "
"favor, note que que ao fazer isso não removerá os dado já salvos."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -202,7 +191,7 @@ msgstr ""
"especificadores de conversão entendidos pela função strftime() para obter um "
"formato específico. Veja o manual da strftime() para maiores informações."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -219,11 +208,11 @@ msgstr ""
"custom_format. Note que se definida tanto como \"unix\" ou \"custom\", as "
"chaves show_date e show_seconds serão igoradas."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "Uuids das extensões a desabilitar"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "Quando coletar dados sobre uso de aplicativos"
@ -269,7 +258,6 @@ msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
#, fuzzy
#| msgid "Enabled"
msgid "Enable lens mode"
msgstr "Habilitado"
@ -382,62 +370,41 @@ msgstr "Formato de _12 horas"
msgid "_24 hour format"
msgstr "Formato de _24 horas"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "APLICATIVOS"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "PREFERÊNCIAS"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "Nova janela"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "Remover dos Favoritos"
msgstr "Remover dos favoritos"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "Adicionar aos Favoritos"
msgstr "Adicionar aos favoritos"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "Arraste até aqui para adicionar aos favoritos"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s foi adicionado aos seus favoritos."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s foi removido dos seus favoritos."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Localizar"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Remover"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Pesquisando..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Nenhum resultado encontrado."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "LOCAIS & DISPOSITIVOS"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "DOCUMENTOS RECENTES"
@ -471,63 +438,63 @@ msgstr "Ver fonte"
msgid "Web Page"
msgstr "Página Web"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "Desfazer"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "Sair de %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "Preferências"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %H:%M:%S"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %e de %b, %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %H:%M"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "Atividades"
@ -544,6 +511,10 @@ msgstr "Tentar novamente"
msgid "Connect to..."
msgstr "Conectar ao..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "LOCAIS & DISPOSITIVOS"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -551,7 +522,7 @@ msgstr "Conectar ao..."
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr ""
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
@ -570,86 +541,181 @@ msgstr "Disponível"
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Invisível"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Minha conta"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr ""
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Configurações do sistema"
#: ../js/ui/statusMenu.js:123
#| msgid "System Preferences..."
msgid "System Settings..."
msgstr "Configurações do sistema..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Travar a tela"
msgstr "Bloquear a tela"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Alternar usuário"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Encerrar sessão..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr ""
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Suspender..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr ""
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Desligar..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Ampliador"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr ""
msgstr "Leitor de tela"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr ""
msgstr "Teclado na tela"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr ""
msgstr "Alertas visuais"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr ""
msgstr "Teclas de aderência"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr ""
msgstr "Teclas lentas"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr ""
msgstr "Teclas de repercussão"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr ""
msgstr "Teclas do mouse"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr ""
msgstr "Configurações de acesso universal"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr ""
msgstr "Alto contraste"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr ""
msgstr "Texto grande"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr ""
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "Onde a energia está sendo gasta..."
#: ../js/ui/status/power.js:90
msgid "Power Settings"
msgstr "Gerenciamento de energia..."
#: ../js/ui/status/power.js:117
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d hora restante"
msgstr[1] "%d horas restantes"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s e %d %s restantes"
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "hora"
msgstr[1] "horas"
#: ../js/ui/status/power.js:122
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minutos"
#: ../js/ui/status/power.js:125
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuto restante"
msgstr[1] "%d minutos restantes"
#: ../js/ui/status/power.js:244
msgid "AC adapter"
msgstr "Tomada"
#: ../js/ui/status/power.js:246
msgid "Laptop battery"
msgstr "Bateria do laptop"
#: ../js/ui/status/power.js:248
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:252
msgid "Mouse"
msgstr "Mouse"
#: ../js/ui/status/power.js:254
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:256
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:258
msgid "Cell phone"
msgstr "Telefone celular"
#: ../js/ui/status/power.js:260
msgid "Media player"
msgstr "Reprodutor de música"
#: ../js/ui/status/power.js:262
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:264
msgid "Computer"
msgstr "Computador"
#: ../js/ui/status/power.js:266 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Desconhecido"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Microfone"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Configurações de som"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Pesquise no seu computador"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -661,14 +727,14 @@ msgstr "%s terminou sua inicialização"
msgid "'%s' is ready"
msgstr "\"%s\" está pronto"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Não é possível adicionar um novo espaço de trabalho porque foi atingido o "
"limite."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Não é possível remover o primeiro espaço de trabalho."
@ -678,8 +744,8 @@ msgstr "Não é possível remover o primeiro espaço de trabalho."
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u saída"
msgstr[1] "%u saídas"
#. translators:
#. * The number of sound inputs on a particular device
@ -687,56 +753,56 @@ msgstr[1] ""
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u entrada"
msgstr[1] "%u entradas"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr ""
msgstr "Sons do sistema"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "Há menos de um minuto"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Há %d minuto"
msgstr[1] "Há %d minutos"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Há %d hora"
msgstr[1] "Há %d horas"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Há %d dia"
msgstr[1] "Há %d dias"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "Há %d semana"
msgstr[1] "Há %d semanas"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Pasta pessoal"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "Sistema de arquivos"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Pesquisar"
@ -745,11 +811,36 @@ msgstr "Pesquisar"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "Resumo do modo de visão de áreas de trabalho"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "O o modo de visão do espaço de trabalho na visão geral. Valores aceitos "
#~ "são: \"single\" e \"grid\"."
#~ msgid "Drag here to add favorites"
#~ msgstr "Arraste até aqui para adicionar aos favoritos"
#~ msgid "Find"
#~ msgstr "Localizar"
#~ msgid "Searching..."
#~ msgstr "Pesquisando..."
#~ msgid "No matching results."
#~ msgstr "Nenhum resultado encontrado."
#~ msgid "Invisible"
#~ msgstr "Invisível"
#~ msgid "ON"
#~ msgstr "⚪"
@ -777,9 +868,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "RESULTADOS DA BUSCA"
#~ msgid "Unknown"
#~ msgstr "Desconhecido"
#~ msgid "Can't lock screen: %s"
#~ msgstr "Não foi possível travar a tela: %s"

348
po/sl.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-10-26 14:37+0000\n"
"PO-Revision-Date: 2010-10-26 19:29+0100\n"
"POT-Creation-Date: 2010-12-11 15:45+0000\n"
"PO-Revision-Date: 2010-12-11 20:40+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: Slovenian\n"
@ -86,62 +86,54 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "Seznam določil ID namiznih datotek priljubljenih programov"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Način pregleda predogleda delovnih površin"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr "Določa cevovod programa GStreamer, ki se uporablja za kodiranje posnetkov. Ta sledi skladnji, ki je uporabljena za gst-launch. Cevovod mora imeti nepovezano korito, kamor se posnetek snema. Običajno je za to namenjen nepovezan izvorni pomnilnik, katerega odvod se zapiše v odvodno datoteko. Vendar pa lahko cevovod ta korak naredi v lastni odvod - možnost se lahko uporabi pri pošiljanju odvoda na strežnik icecast preko shout2send ali podobno. Nedoločena ali prazna možnost se odrazi kot privzeti cevovod. Trenutno je to 'videorate ! theoraenc ! oggmux' in omogoča snemanje v zapis Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Pokaži datum v uri"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "Pokaži tedenski datum v koledarju"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Pokaži čas s sekundami"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
msgstr "Programi določeni s temi določili bodo prikazani v območju priljubljenih programov"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to 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."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
msgstr "Hitrost sličic shranjenega končnega zaslonskega posnetka v sličicah na sekundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "Uporabljen GStreamer cevovod za kodiranje zaslonskega posnetka."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "The selected workspace view mode in the overview. Supported values are \"single\" and \"grid\"."
msgstr "Izbrani pogled delovnih površin v predogledu. Podprte vrednosti sta \"enojno\" in \"mrežno\"."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data."
msgstr "Lupina običajno nadzira dejavne programe zaradi možnosti prikazovanja najpogosteje uporabljenih v zaganjalniku. Čeprav so podatki krajevni, jih je dobro onemogočiti zaradi varovanja zasebnosti. Z onemogočenje ne bodo odstranjeni že shranjeni podatki."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "This key specifies the format used by the panel clock when the format key is set to \"custom\". You can use conversion specifiers understood by strftime() to obtain a specific format. See the strftime() manual for more information."
msgstr "Ključ določa zapis, ki naj ga uporablja vstavek ure, kadar je ključ zapisa nastavljen kot \"prikrojen\". Za določitev zapisa lahko uporabite tudi oznake funkcije strftime(), ki so podrobneje zapisane v priročniku funkcije."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "This key specifies the hour format used by the panel clock. Possible values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set to \"custom\", the clock will display time according to the format specified in the custom_format key. Note that if set to either \"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
msgstr "Ključ določa zapis ure. Mogoče vrednosti so \"12-urni\", \"24-urni\", \"unix\" in \"po meri\". Možnost \"unix\" prikazuje čas v sekundah od začetka ere, torej od 01.01.1970, možnost \"po meri\" pa omogoča prikrojen zapis. Pri izbiri zapisa \"unix\" ali \"po meri\" sta izbiri pokaži datum in pokaži sekunde, prezrti."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "Določila UUID razširitev za onemogočenje"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "Ali naj se beleži statistika uporabe programov"
@ -179,7 +171,7 @@ msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:9
msgid "For centered mouse tracking, when the system pointer is at or near the edge of the screen, the magnified contents continue to scroll such that the screen edge moves into the magnified view."
msgstr ""
msgstr "Pri usredinjenem sledenju miški, ko je sistemski kazalnik ob robu zaslona, približanje vsebine drsi naprej tako, da je rob zaslona v približanem pogledu."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
@ -223,11 +215,11 @@ msgstr "Barva navpične in vodoravne črte, ki določata merek."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
msgid "The magnified view either fills the entire screen, or occupies the top-half, bottom-half, left-half, or right-half of the screen."
msgstr ""
msgstr "Približan pogled lahko zapolni celoten zaslon, lahko pa zasede zgornjo, spodnjo, levo ali pa desno polovico zaslona."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:21
msgid "The power of the magnification. A value of 1.0 means no magnification. A value of 2.0 doubles the size."
msgstr ""
msgstr "Vrednost približanja. Vrednost 1.0 pomeni brez približanja, vrednost 2.0 pa podvoji učinek približanja."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
@ -235,7 +227,7 @@ msgstr "Debelina merka"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
msgid "Whether the magnified view should be centered over the location of the system mouse and move with it."
msgstr ""
msgstr "Ali naj bo približan pogled usredinjen na mesto sistemske miške in se z njo premika."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
@ -269,64 +261,40 @@ msgstr "_12-urni zapis časa"
msgid "_24 hour format"
msgstr "_24-urni zapis časa"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316
#: ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "Programi"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "Možnosti"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "Novo okno"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "Odstrani iz priljubljenih"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "Dodaj med priljubljene"
#: ../js/ui/appDisplay.js:830
msgid "Drag here to add favorites"
msgstr "S potegom na to mesto se izbor doda med priljubljene"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "Program \"%s\" je dodan med priljubljeno."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "Program \"%s\" je odstranjen iz priljubljenih."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Najdi"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Odstrani"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Iskanje ..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Ni zadetkov iskanja"
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797
#: ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "Mesta in naprave"
#. **** Documents ****
#: ../js/ui/dash.js:804
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "Nedavni predmeti"
@ -339,7 +307,10 @@ msgstr "Ni nameščenih razširitev"
msgid "Enabled"
msgstr "Omogočeno"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591
#: ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Onemogočeno"
@ -359,63 +330,63 @@ msgstr "Poglej vir"
msgid "Web Page"
msgstr "Spletna stran"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "Razveljavi"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "Končaj %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "Možnosti"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a. %e. %b., %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a, %e. %b., %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a. %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a. %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a. %e. %b., %H:%M:%S"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a. %e. %b., %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a, %H:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a, %H:%M"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "Dejavnosti"
@ -432,6 +403,10 @@ msgstr "Poskusi znova"
msgid "Connect to..."
msgstr "Povezava z ..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "Mesta in naprave"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -458,42 +433,38 @@ msgstr "Na voljo"
msgid "Busy"
msgstr "Zaposleno"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Nevidno"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Račun"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "Račun ..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Sistemske nastavitve"
#: ../js/ui/statusMenu.js:123
msgid "System Preferences..."
msgstr "Sistemske možnosti ..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Zakleni zaslon"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Preklopi uporabnika"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Odjava ..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "V mirovanje"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "V pripravljenost"
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "Ponoven zagon ..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Izklopi ..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Približanje"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Zaslonski bralnik"
@ -530,13 +501,122 @@ msgstr "Splošne nastavitve dostopa"
msgid "High Contrast"
msgstr "Visok kontrast"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Veliko besedilo"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "Približanje"
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "Kaj porablja napetost ..."
#: ../js/ui/status/power.js:90
msgid "Power Settings"
msgstr "Upravljanje napajanja"
#: ../js/ui/status/power.js:117
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "preostaja še %d ur"
msgstr[1] "preostaja še %d ura"
msgstr[2] "preostajata še %d uri"
msgstr[3] "preostajajo še %d ure"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d %s %d %s remaining"
msgstr "Preostaja še %d %s %d %s"
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "ur"
msgstr[1] "ura"
msgstr[2] "uri"
msgstr[3] "ure"
#: ../js/ui/status/power.js:122
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minut"
msgstr[1] "minuta"
msgstr[2] "minuti"
msgstr[3] "minute"
#: ../js/ui/status/power.js:125
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "preostaja še %d minut"
msgstr[1] "preostaja še %d minuta"
msgstr[2] "preostajata še %d minuti"
msgstr[3] "preostajajo še %d minute"
#: ../js/ui/status/power.js:244
msgid "AC adapter"
msgstr "Električni prilagodilnik"
#: ../js/ui/status/power.js:246
msgid "Laptop battery"
msgstr "Baterija prenosnika"
#: ../js/ui/status/power.js:248
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
msgid "Monitor"
msgstr "Zaslon"
#: ../js/ui/status/power.js:252
msgid "Mouse"
msgstr "Miška"
#: ../js/ui/status/power.js:254
msgid "Keyboard"
msgstr "Tipkovnica"
#: ../js/ui/status/power.js:256
msgid "PDA"
msgstr "Dlančnik"
#: ../js/ui/status/power.js:258
msgid "Cell phone"
msgstr "Mobilni telefon"
#: ../js/ui/status/power.js:260
msgid "Media player"
msgstr "Predstavni predvajalnik"
#: ../js/ui/status/power.js:262
msgid "Tablet"
msgstr "Tablični računalnik"
#: ../js/ui/status/power.js:264
msgid "Computer"
msgstr "Računalnik"
#: ../js/ui/status/power.js:266
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Neznano"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Glasnost"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Nastavitve zvoka"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Iskanje po računalniku"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -548,19 +628,45 @@ msgstr "%s je končal začenjanje"
msgid "'%s' is ready"
msgstr "'%s' storitev je pripravljena"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "Ni mogoče dodati nove delovne površine, ker je doseženo njihovo največje dovoljeno število."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Ni mogoče odstraniti prve delovne površine."
#: ../src/shell-global.c:1204
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u odvodov naprave"
msgstr[1] "%u odvod naprave"
msgstr[2] "%u odvoda naprave"
msgstr[3] "%u odvodi naprave"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u dovodov naprave"
msgstr[1] "%u dovod naprave"
msgstr[2] "%u dovoda naprave"
msgstr[3] "%u dovodi naprave"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "Sistemski zvoki"
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "Pred manj kot eno minuto"
#: ../src/shell-global.c:1208
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -569,7 +675,7 @@ msgstr[1] "Pred %d minuto"
msgstr[2] "Pred %d minutama"
msgstr[3] "Pred %d minutami"
#: ../src/shell-global.c:1213
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -578,7 +684,7 @@ msgstr[1] "Pred %d uro"
msgstr[2] "Pred %d urama"
msgstr[3] "Pred %d urami"
#: ../src/shell-global.c:1218
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -587,7 +693,7 @@ msgstr[1] "Pred %d dnevom"
msgstr[2] "Pred %d dnevoma"
msgstr[3] "Pred %d dnevi"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -596,17 +702,17 @@ msgstr[1] "Pred %d tednom"
msgstr[2] "Pred %d tednoma"
msgstr[3] "Pred %d tedni"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Domača mapa"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "Datotečni sistem"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Poišči"
@ -615,15 +721,35 @@ msgstr "Poišči"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "Način pregleda predogleda delovnih površin"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "Izbrani pogled delovnih površin v predogledu. Podprte vrednosti sta "
#~ "\"enojno\" in \"mrežno\"."
#~ msgid "Drag here to add favorites"
#~ msgstr "S potegom na to mesto se izbor doda med priljubljene"
#~ msgid "Find"
#~ msgstr "Najdi"
#~ msgid "Searching..."
#~ msgstr "Iskanje ..."
#~ msgid "No matching results."
#~ msgstr "Ni zadetkov iskanja"
#~ msgid "Invisible"
#~ msgstr "Nevidno"
#~ msgid "System Preferences..."
#~ msgstr "Sistemske možnosti ..."
#~ msgid "Restart..."
#~ msgstr "Ponoven zagon ..."
#~ msgid "Account Information..."
#~ msgstr "Podrobnosti računa ..."
#~ msgid "System Settings..."
#~ msgstr "Sistemske nastavitve ..."
#~ msgid "ON"
#~ msgstr "⚪"
#~ msgid "OFF"
@ -640,8 +766,6 @@ msgstr "%1$s: %2$s"
#~ msgstr "Mesta"
#~ msgid "SEARCH RESULTS"
#~ msgstr "Rezultati iskanja"
#~ msgid "Unknown"
#~ msgstr "Neznano"
#~ msgid "Can't lock screen: %s"
#~ msgstr "Ni mogoče zakleniti zaslona: %s"
#~ msgid "Can't temporarily set screensaver to blank screen: %s"

544
po/ta.po
View File

@ -6,17 +6,17 @@
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-08-04 19:41+0000\n"
"PO-Revision-Date: 2010-08-05 21:37+0530\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-11-30 14:13+0530\n"
"PO-Revision-Date: 2010-12-01 12:57+0530\n"
"Last-Translator: Dr.T.Vasudevan <agnihot3@gmail.com>\n"
"Language-Team: Tamil <<Ubuntu-l10n-tam@lists.ubuntu.com>>\n"
"Language-Team: Tamil <kde-i18n-doc@kde.org>\n"
"Language: ta\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.0\n"
"X-Generator: Lokalize 1.1\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
@ -39,8 +39,8 @@ msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"உள்ளமை வழி நீக்கம் மற்றும் Alt-F2 உரையாடல் மூலம் கருவிகள் கண்காணிப்பு "
"ஆகியவற்றை அணுக உதவும்."
"உள்ளமை வழி நீக்கம் மற்றும் Alt-F2 உரையாடல் மூலம் கருவிகள் கண்காணிப்பு ஆகியவற்றை அணுக "
"உதவும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
@ -49,8 +49,8 @@ msgstr "கடிகாரத்தின் தனிப்பயன் வட
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"உருவாக்குவோர் மற்றூம் சோதிப்போருக்கு பயன்படுமாறு Alt-F2 வழியாக உள்ளமை "
"கருவிகளை செயலாக்கு"
"உருவாக்குவோர் மற்றூம் சோதிப்போருக்கு பயன்படுமாறு Alt-F2 வழியாக உள்ளமை கருவிகளை "
"செயலாக்கு"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
@ -65,8 +65,8 @@ msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
"க்னோம் ஷெல் நீட்சிகளுக்கு ஒரு யூயூஐடி பண்பு உண்டு. இந்த விசை எந்த நீட்சிகள் "
"ஏற்றப்பட வேண்டும் என பட்டியலிடுகிறது."
"க்னோம் ஷெல் நீட்சிகளுக்கு ஒரு யூயூஐடி பண்பு உண்டு. இந்த விசை எந்த நீட்சிகள் ஏற்றப்பட வேண்டும் "
"என பட்டியலிடுகிறது."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
@ -81,8 +81,8 @@ msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
"உண்மையெனில், அமைப்பு \"12 மணி\" அல்லது \"24 மணி\" என இருப்பின் நேரத்துடன் "
"நாளையும் காட்டு"
"உண்மையெனில், அமைப்பு \"12 மணி\" அல்லது \"24 மணி\" என இருப்பின் நேரத்துடன் நாளையும் "
"காட்டு"
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
@ -101,10 +101,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "விருப்ப பயன்பாடுகளுக்கு மேல்மேசை கோப்பு அடையாளங்கள்."
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "பணி இட மேல்பார்வை காட்சிப் பாங்கு."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -115,93 +111,76 @@ msgid ""
"to an empty value, the default pipeline will be used. This is currently "
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
"பதிவுகளை குறியாக்க ஜிஸ்ட்ரீமர் குழாயை அமைக்கிறது. ஜிஎஸ்டி லான்ஸ் க்கு "
"பயன்படும் அதே இலக்கணத்தை பின் பற்றும். குழாய்க்கு இணைப்பில்லா பதிவுக்குழி "
"இருத்தல் வேண்டும். இதில் விடியோ பதிவாகும். சாதாரணமாக இதில் ஒரு மூல பதிவேடு "
"இருக்கும்; இதன் வெளியீடு வெளியீட்டு கோப்பாக பதிவாகும். எனினும் குழாய் தன் "
"வெளியீட்டை தானே கவனித்துக்கொள்ள இயலும். இது வெளியீட்டை ஐஸ்காஸ்ட் அல்லது "
"ஷௌட்2சென்ட் போன்றவற்றுக்கு நேரடியாக அனுப்ப இயலும். அமைப்பை அன்செட் "
"செய்தாலல்லது காலி மதிப்புக்கு அமைத்தாலும் முன்னிருப்பு குழாய் "
"பயன்படுத்தப்படும். நடப்பில் இது 'விடியோரேட்!தியோரேங்க்!ஆக்மக்ஸ்' ஆகும்; இது "
"ஆக் தியோராவுக்கு பதிவுசெய்யும்."
"பதிவுகளை குறியாக்க ஜிஸ்ட்ரீமர் குழாயை அமைக்கிறது. ஜிஎஸ்டி லான்ஸ் க்கு பயன்படும் அதே "
"இலக்கணத்தை பின் பற்றும். குழாய்க்கு இணைப்பில்லா பதிவுக்குழி இருத்தல் வேண்டும். இதில் விடியோ "
"பதிவாகும். சாதாரணமாக இதில் ஒரு மூல பதிவேடு இருக்கும்; இதன் வெளியீடு வெளியீட்டு "
"கோப்பாக பதிவாகும். எனினும் குழாய் தன் வெளியீட்டை தானே கவனித்துக்கொள்ள இயலும். இது "
"வெளியீட்டை ஐஸ்காஸ்ட் அல்லது ஷௌட்2சென்ட் போன்றவற்றுக்கு நேரடியாக அனுப்ப இயலும். அமைப்பை "
"அன்செட் செய்தாலல்லது காலி மதிப்புக்கு அமைத்தாலும் முன்னிருப்பு குழாய் பயன்படுத்தப்படும். "
"நடப்பில் இது 'விடியோரேட்!தியோரேங்க்!ஆக்மக்ஸ்' ஆகும்; இது ஆக் தியோராவுக்கு பதிவுசெய்யும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "தேதியை கடிகாரத்தில் காட்டுக"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "நாட்காட்டியில் வார நாளை காட்டவும்"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "நொடிகளுடன் நேரம் காட்டுக"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"இந்த அடையாளங் காட்டிகளுக்கு பொருத்தமான பயன்பாடுகள் விருப்ப இடத்தில் "
"காட்டப்படும்."
msgstr "இந்த அடையாளங் காட்டிகளுக்கு பொருத்தமான பயன்பாடுகள் விருப்ப இடத்தில் காட்டப்படும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"ஸ்க்ரீன்காஸ்ட் இல் பதிவாவனக்கான கோப்புப்பெயர் தனித்தன்மை வாய்ந்தது. இது "
"நடப்பு தேதியை அடிப்படையாக கொண்டது; இந்த பின்னொட்டை பயன்படுத்தும். பதிவதை "
"வேறு கொள்கலத்தின் ஒழுங்கில் மாற்றுகையில் இதையும் மாற்ற வேண்டும்."
"ஸ்க்ரீன்காஸ்ட் இல் பதிவாவனக்கான கோப்புப்பெயர் தனித்தன்மை வாய்ந்தது. இது நடப்பு தேதியை "
"அடிப்படையாக கொண்டது; இந்த பின்னொட்டை பயன்படுத்தும். பதிவதை வேறு கொள்கலத்தின் ஒழுங்கில் "
"மாற்றுகையில் இதையும் மாற்ற வேண்டும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"க்னோம்ஷெல் இன் ஸ்க்ரீன்காஸ்ட் பதிவரில் ஸ்க்ரீன்காட் ஐ பதிகையில் வினாடிக்கு "
"சட்டங்களின் விகிதம்."
"க்னோம்ஷெல் இன் ஸ்க்ரீன்காஸ்ட் பதிவரில் ஸ்க்ரீன்காட் ஐ பதிகையில் வினாடிக்கு சட்டங்களின் விகிதம்."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "ஸ்க்ரீன்காஸ்டை குறியாக்க பயனாகும் ஜிஸ்ட்ரீமர் குழாய்."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"மேல்பார்வையில் தேர்ந்தெடுத்த பணீட காட்சி பாங்கு. ஆதரவுள்ள மதிப்புகள் 'ஒன்று' "
"மற்றும் 'வலை'"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"ஷெல் சாதாரணமாக செயலிலுள்ள நிரல்களை மேற்பார்வை இடுகிறது. அதனால் அடிக்கடி "
"பயனாகும் நிரல்கள் (எ-டு: துவக்கிகள்) முன் வைக்கப்படும். இந்த தரவு "
"அந்தரங்கமாக வைக்கப்பட்டாலும் நீங்கள் இதை நீக்க விரும்பலாம். அப்படிச் செய்வது "
"முன்னே சேகரித்த தரவை நீக்காஅது என் அறியவும்."
"ஷெல் சாதாரணமாக செயலிலுள்ள நிரல்களை மேற்பார்வை இடுகிறது. அதனால் அடிக்கடி பயனாகும் "
"நிரல்கள் (எ-டு: துவக்கிகள்) முன் வைக்கப்படும். இந்த தரவு அந்தரங்கமாக வைக்கப்பட்டாலும் நீங்கள் "
"இதை நீக்க விரும்பலாம். அப்படிச் செய்வது முன்னே சேகரித்த தரவை நீக்காஅது என் அறியவும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"வடிவமைப்பு விசை \"தனிப்பயன்\" என்று அமைக்கப்படும் போது பலக கடிகாரம் இந்த "
"விசையை "
"பயன்படுத்தும். குறிப்பிட்ட அமைப்பை பெற்றுக்கொள்ள strftime() ஆல் "
"புரிந்துகொள்ளக்கூடிய மாற்று "
"குறிப்புகளை தரவும். மேலும் அதிக விவரங்களுக்கு strftime() கையேட்டை "
"பார்க்கவும்."
"வடிவமைப்பு விசை \"தனிப்பயன்\" என்று அமைக்கப்படும் போது பலக கடிகாரம் இந்த விசையை "
"பயன்படுத்தும். குறிப்பிட்ட அமைப்பை பெற்றுக்கொள்ள strftime() ஆல் புரிந்துகொள்ளக்கூடிய "
"மாற்று குறிப்புகளை தரவும். மேலும் அதிக விவரங்களுக்கு strftime() கையேட்டை பார்க்கவும்."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -211,21 +190,159 @@ msgid ""
"the show_date and show_seconds keys are ignored."
msgstr ""
"இந்த விசை பலக கடிகாரம் பயன்படுத்த வேண்டிய மணி ஒழுங்கை குறிக்கிறது. தரக்கூடிய "
"மதிப்புகள் \"12-மணி\", \"24-மணி\", \"யூனிக்ஸ்\" மற்றும் \"தனிப்பயன்\". "
"\"யூனிக்ஸ்\" எனில் அது எபோக் அதாவது 1970-01-01 முதல் நடந்த காலத்தை "
"வினாடிகளில் காட்டும். \"தனிப்பயன்\" எனில் தனிப்பயன்_ஒழுங்கு இல் காட்டப்பட்ட "
"ஒழுங்கில் நேரத்தைக் காட்டும். \"யூனிக்ஸ்\" அல்லது \"தனிப்பயன்\" என "
"மைக்கும்போது தேதி_காட்டு, வினாடிகளை_காட்டு விசைகள் உதாசீனப்படுத்தப்படும் என "
"அறிக."
"மதிப்புகள் \"12-மணி\", \"24-மணி\", \"யூனிக்ஸ்\" மற்றும் \"தனிப்பயன்\". \"யூனிக்ஸ்\" "
"எனில் அது எபோக் அதாவது 1970-01-01 முதல் நடந்த காலத்தை வினாடிகளில் காட்டும். \"தனிப்பயன்"
"\" எனில் தனிப்பயன்_ஒழுங்கு இல் காட்டப்பட்ட ஒழுங்கில் நேரத்தைக் காட்டும். \"யூனிக்ஸ்\" அல்லது "
"\"தனிப்பயன்\" என மைக்கும்போது தேதி_காட்டு, வினாடிகளை_காட்டு விசைகள் "
"உதாசீனப்படுத்தப்படும் என அறிக."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "செயல்நீக்க வேண்டிய நீட்சிகளின் யூயூஐடிக்கள்."
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "நிரல்களின் பயன்பாடு குறித்த புள்ளிவிவரம் சேகரிக்க வேண்டுமா"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr "குறுக்கு இழைகளை மையத்தில் வெட்டிவிடுக"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
msgid "Color of the crosshairs"
msgstr "குறுக்கு இழைகளின் நிறம்"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr "குறுக்கு இழைகளை சொடுக்கியின் அடையாளத்தில் மையப்படுத்தி காட்டுகிறது/ மறைக்கிறது"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid ""
"Determines the position of the magnified mouse image within the magnified "
"view and how it reacts to system mouse movement. The values are - none: no "
"mouse tracking; - centered: the mouse image is displayed at the center of "
"the zoom region (which also represents the point under the system mouse) and "
"the magnified contents are scrolled as the system mouse moves; - "
"proportional: the position of the magnified mouse in the zoom region is "
"proportionally the same as the position of the system mouse on screen; - "
"push: when the magnified mouse intersects a boundary of the zoom region, the "
"contents are scrolled into view."
msgstr ""
"பெரிதாக்கப்பட்ட காட்சியில் பெரிதாக்கப்பட்ட சொடுக்கியின் பிம்பம் எங்கு இருக்க வேண்டும், அது "
"கணினி சொடுக்கி நகர்தலுடன் எப்படி நகர வேண்டும் என நிர்ணயிக்கிறது. மதிப்புகள் - ஏதுமில்லை: "
"சொடுக்கி தடம் தொடரப்பட மாட்டாது; -மையம்: சொடுக்கி பிம்பம் பெரிதாக்கப்பட்ட இடத்தின் மையத்தில் "
"காட்டப்படும் (இது சொடுக்கியின் கீழ் காணப்படும் இடம்தான்) பெரிதாக்கப்பட்ட பிம்பம் சொடுக்கி "
"நகரும் திசையின் தானும் நகரும்; - விகிதாசாரம்: அணுகல் பரப்பில் உள்ள பெரிதாக்கபட்ட சொடுக்கியின் "
"இடம் திரையில் விகிதாசாரப்படி கணினி சொடுக்கி இருக்கும் அதே இடம்தான்; - தள்ளு: பெரிதாக்கப்பட்ட "
"சொடுக்கி அணுகல் பரப்பின் விளிம்புக்கு வருமானால் அடக்கங்கள் உருண்டு பார்வைக்கு வரும்."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr "குறுக்கு இழைகளின் ஊடுருவும் தனமியை முழு மறைப்பிலிருந்து முழு ஊடுருவல் வரை நிர்ணயிக்கிறது"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
msgid ""
"Determines whether the crosshairs intersect the magnified mouse sprite, or "
"are clipped such that the ends of the horizontal and vertical lines surround "
"the mouse image."
msgstr ""
"குறுக்கு இழைகளை சொடுக்கியின் அடையாளத்தில் மையப்படுத்தி காட்டுவதா அல்லது செங்குத்து கிடை மட்ட "
"கோடுகளின் முனைகள் சொடுக்கி அடையாளத்தை சூழ்ந்து இருப்பதாக வெட்டுவதா என நிர்ணயிக்கிறது."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
msgid "Enable lens mode"
msgstr "பூத கண்ணாடி முறைமையை செயல்படுத்து"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
msgid ""
"Enables/disables display of crosshairs centered on the magnified mouse "
"sprite."
msgstr "குறுக்கு இழைகளை சொடுக்கியின் அடையாளத்தில் மையப்படுத்தி காட்டுகிறது/ மறைக்கிறது"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:9
msgid ""
"For centered mouse tracking, when the system pointer is at or near the edge "
"of the screen, the magnified contents continue to scroll such that the "
"screen edge moves into the magnified view."
msgstr ""
"மையப்படுத்திய சொடுக்கி தடம் தொடர்வதில், கணினியின் சுட்டி திரையின் விளிம்பில் அல்லது அதன் "
"அருகில் இர்ந்தால், பெரிதாக்கப்பட்ட உள்ளடக்கங்கள் உருண்டு திரையின் விளிம்பு பெரிதாக்கப்பட்ட "
"பார்வைக்கு வரும்."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
msgstr "குறுக்கு இழைகளின் நீளம்"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
msgid "Magnification factor"
msgstr "உருபெருக்க விகிதம்"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
msgid "Mouse Tracking Mode"
msgstr "சொடுக்கி தொடர்வு பாங்கு"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
msgid "Opacity of the crosshairs"
msgstr "குறுக்கிழைகள் இன் ஒளிபுகாதன்மை"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
msgid "Screen position"
msgstr "திரை நிலை"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr "மேல்மேசையின் விளிம்புகளுக்கு வெளீயே இருக்கும் அடக்கத்தை உருளை மூலம் காட்டு"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
msgstr "குறுக்கிழைகள் காட்டு அல்லது மறை"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
msgid "Show or hide the magnifier"
msgstr "உருப்பெருக்கியை காட்டு அல்லது மறை"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr "உருப்பெருக்கி மற்றும் அதன் அணுகல் வட்டாரங்களை காட்டு அல்லது மறை"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
msgid ""
"The color of the the vertical and horizontal lines that make up the "
"crosshairs."
msgstr "குறுக்கு இழைகளின் செங்குத்து , கிடைமட்ட கோடுகளின் நிறம்"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
msgid ""
"The magnified view either fills the entire screen, or occupies the top-half, "
"bottom-half, left-half, or right-half of the screen."
msgstr ""
"பெரிதாக்கப்பட்ட காட்சி முழுத்திரையயும் ஆக்ரமிக்கலாம் அல்லது மேல் பாதி, கீழ் பாதி, வலது பாதி, "
"இடது பாதி என இருக்கலாம்."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:21
msgid ""
"The power of the magnification. A value of 1.0 means no magnification. A "
"value of 2.0 doubles the size."
msgstr "பெரிதாக்கும் அளவு. 1.0 எனில் பெரிதாக்கம் இல்லை. மதிப்பு 2.0 எனில் இரண்டு மடங்கு."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
msgstr "குறுக்கிழைகளின் தடிமன்"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
msgid ""
"Whether the magnified view should be centered over the location of the "
"system mouse and move with it."
msgstr "பெரிதாக்கிய காட்சியின் மையம் சொடுக்கியின் இடத்தில் இருந்து கொண்டு அதனுடன் நகர வேண்டுமா/"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr "குறுக்கு இழைகளின் செங்குத்து , கிடைமட்ட கோடுகளின் அகலம்"
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "கடிகார வடிவம்"
@ -254,177 +371,159 @@ msgstr "_12 மணி வடிவமைப்பு"
msgid "_24 hour format"
msgstr "_24 மணி வடிவமைப்பு"
#. **** Applications ****
#: ../js/ui/appDisplay.js:384 ../js/ui/dash.js:776
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "பயன்பாடுகள்"
#: ../js/ui/appDisplay.js:416
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "விருப்பங்கள்"
#: ../js/ui/appDisplay.js:721
#: ../js/ui/appDisplay.js:538
msgid "New Window"
msgstr "புதிய சாளரம்"
#: ../js/ui/appDisplay.js:725
#: ../js/ui/appDisplay.js:542
msgid "Remove from Favorites"
msgstr "விருப்பத்தில் இருந்து நீக்கு"
#: ../js/ui/appDisplay.js:726
#: ../js/ui/appDisplay.js:543
msgid "Add to Favorites"
msgstr "விருப்பங்களுக்கு சேர்"
#: ../js/ui/appDisplay.js:1033
msgid "Drag here to add favorites"
msgstr "விருப்பங்களுக்கு சேர்க்க இங்கு இழுத்துவிடு"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s உங்கள் விருப்பங்களில் சேர்க்கப்பட்டது"
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s உங்கள் விருப்பங்களில் இருந்து நீக்கப்பட்டது"
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "தேடு"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "நீக்கு"
#: ../js/ui/dash.js:471
msgid "Searching..."
msgstr "தேடுகிறது..."
#: ../js/ui/dash.js:485
msgid "No matching results."
msgstr "பொருத்தமான விடைகள் இல்லை"
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:795 ../js/ui/placeDisplay.js:550
msgid "PLACES & DEVICES"
msgstr "PLACES & DEVICES"
#. **** Documents ****
#: ../js/ui/dash.js:802 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "RECENT ITEMS"
#: ../js/ui/lookingGlass.js:471
#: ../js/ui/lookingGlass.js:552
msgid "No extensions installed"
msgstr "நீட்சிகள் ஏதும் நிறுவப்படவில்லை"
#: ../js/ui/lookingGlass.js:508
#: ../js/ui/lookingGlass.js:589
msgid "Enabled"
msgstr "செயலாக்கப்பட்டது"
#: ../js/ui/lookingGlass.js:510
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "செயல்நீக்கப்பட்டது"
#: ../js/ui/lookingGlass.js:512
#: ../js/ui/lookingGlass.js:593
msgid "Error"
msgstr "பிழை"
#: ../js/ui/lookingGlass.js:514
#: ../js/ui/lookingGlass.js:595
msgid "Out of date"
msgstr "காலாவதியானது"
#: ../js/ui/lookingGlass.js:539
#: ../js/ui/lookingGlass.js:620
msgid "View Source"
msgstr "மூலத்தை பார்க்க"
#: ../js/ui/lookingGlass.js:545
#: ../js/ui/lookingGlass.js:626
msgid "Web Page"
msgstr "இணைய பக்கம்"
#: ../js/ui/overview.js:159
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "மறை"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:473
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "%s லிருந்து வெளியேறு"
#: ../js/ui/panel.js:498
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "விருப்பங்கள்"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:584
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S"
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %b %e, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:589
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:590
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:597
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:602
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:603
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:741
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "செயல்பாடுகள்"
#: ../js/ui/placeDisplay.js:107
#: ../js/ui/placeDisplay.js:111
#, c-format
msgid "Failed to unmount '%s'"
msgstr "'%s' ஐ இறக்க முடியவில்லை"
#: ../js/ui/placeDisplay.js:110
#: ../js/ui/placeDisplay.js:114
msgid "Retry"
msgstr "மறு முயற்சி"
#: ../js/ui/placeDisplay.js:155
#: ../js/ui/placeDisplay.js:159
msgid "Connect to..."
msgstr "இணைக்கவும்..."
#. Translators: the "ON" and "OFF" strings are used in the
#. toggle switches in the status area menus, and must be SHORT.
#. If you don't have suitable short words, consider initials,
#. "0"/"1", "⚪"/"⚫", etc.
#: ../js/ui/popupMenu.js:30 ../js/ui/popupMenu.js:40
msgid "ON"
msgstr "இயக்கத்தில்"
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "PLACES & DEVICES"
#: ../js/ui/popupMenu.js:31 ../js/ui/popupMenu.js:45
msgid "OFF"
msgstr "செயல் நீக்கு"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr "முறைமை-மாற்றி-யூஎஸ்"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
@ -435,106 +534,177 @@ msgstr "தயை செய்து ஒரு கட்டளையை உள
msgid "Execution of '%s' failed:"
msgstr "'%s' ஐ நிறைவேற்றுதல் தோல்வி அடைந்தது:"
#: ../js/ui/statusMenu.js:91
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "இருப்பவை"
#: ../js/ui/statusMenu.js:95
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "வேலையில்"
#: ../js/ui/statusMenu.js:99
msgid "Invisible"
msgstr "பார்க்கமுடியாதது"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "என் கணக்கு"
#: ../js/ui/statusMenu.js:106
msgid "Account Information..."
msgstr "கணக்கு தகவல்..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "கணினி அமைப்புகள்"
#: ../js/ui/statusMenu.js:110
msgid "System Preferences..."
msgstr "கணினி முன்னுரிமைகள்..."
#: ../js/ui/statusMenu.js:117
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "திரையைப் பூட்டுக."
#: ../js/ui/statusMenu.js:121
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "பயனர் மாற்று"
#: ../js/ui/statusMenu.js:126
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "வெளியேறு..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "இடைநிறுத்தம்..."
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "நிறுத்தவும்... "
#: ../js/ui/windowAttentionHandler.js:45
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "திரைபடிப்பான்"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr "திரை விசைப்பலகை"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr "காட்சி எச்சரிக்கைகள்"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr "ஒட்டு விசைகள்"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "மெது விசைகள்"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "எதிரொலிப்பு விசைகள்"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "சொடுக்கி விசைகள்"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr "உலகளாவிய அணுகல் அமைப்பு"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr "அதிக முறண்"
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "பெரிய உரை"
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "பெரிதாக்கு"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "உங்கள் கணினியில் தேடுக"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
msgstr "%s இன் துவக்கம் முடிந்துவிட்டது"
#: ../js/ui/windowAttentionHandler.js:47
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "'%s' தயாராக உள்ளது"
#: ../js/ui/workspacesView.js:230
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"பணிக்களத்தை சேர்க்க முடியாது; ஏனெனில் பணிக்களங்களின் உச்ச வரம்பு "
"எட்டப்பட்டுவிட்டது."
#: ../js/ui/workspacesView.js:244
msgid "Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "பணிக்களத்தை சேர்க்க முடியாது; ஏனெனில் பணிக்களங்களின் உச்ச வரம்பு எட்டப்பட்டுவிட்டது."
#: ../js/ui/workspacesView.js:247
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "முதல் பணிக்களத்தை நீக்க முடியாது"
#: ../src/shell-global.c:1105
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u வெளிப்பாடு"
msgstr[1] "%u வெளிப்பாடுகள்"
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u உள்ளீடு"
msgstr[1] "%u உள்ளீடுகள்"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "கணினி ஒலிகள்"
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "தெரியாத"
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "ஒரு நிமிடத்திற்கும் குறைவாக"
#: ../src/shell-global.c:1109
#: ../src/shell-global.c:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minutes ago"
msgstr[1] "%d நிமிடங்களுக்கு முன்"
#: ../src/shell-global.c:1114
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d மணிநேரத்துக்கு முன்"
msgstr[1] "%d மணிகள் முன்"
#: ../src/shell-global.c:1119
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d நாளைக்கு முன்"
msgstr[1] "%d நாட்களுக்கு முன்"
#: ../src/shell-global.c:1124
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d வாரம் முன்"
msgstr[1] "%d வாரங்கள் முன்"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "இல்ல அடைவு"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "கோப்பு அமைப்பு"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "தேடு"
@ -543,8 +713,44 @@ msgstr "தேடு"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "பணி இட மேல்பார்வை காட்சிப் பாங்கு."
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "மேல்பார்வையில் தேர்ந்தெடுத்த பணீட காட்சி பாங்கு. ஆதரவுள்ள மதிப்புகள் 'ஒன்று' மற்றும் "
#~ "'வலை'"
#~ msgid "Drag here to add favorites"
#~ msgstr "விருப்பங்களுக்கு சேர்க்க இங்கு இழுத்துவிடு"
#~ msgid "Find"
#~ msgstr "தேடு"
#~ msgid "Searching..."
#~ msgstr "தேடுகிறது..."
#~ msgid "No matching results."
#~ msgstr "பொருத்தமான விடைகள் இல்லை"
#~ msgid "ON"
#~ msgstr "இயக்கத்தில்"
#~ msgid "OFF"
#~ msgstr "செயல் நீக்கு"
#~ msgid "Invisible"
#~ msgstr "பார்க்கமுடியாதது"
#~ msgid "Account Information..."
#~ msgstr "கணக்கு தகவல்..."
#~ msgid "System Preferences..."
#~ msgstr "கணினி முன்னுரிமைகள்..."

549
po/th.po
View File

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-06-13 23:04+0000\n"
"PO-Revision-Date: 2010-06-14 20:22+0700\n"
"POT-Creation-Date: 2010-11-20 13:40+0000\n"
"PO-Revision-Date: 2010-11-23 10:04+0700\n"
"Last-Translator: Sira Nokyoongtong <gumaraa@gmail.com>\n"
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@ -19,11 +19,11 @@ msgstr ""
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr ""
msgstr "เชลล์ GNOME"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr ""
msgstr "การจัดการหน้าต่างและการเรียกใช้โปรแกรม"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
@ -33,6 +33,294 @@ msgstr "นาฬิกา"
msgid "Customize the panel clock"
msgstr "ปรับแต่งนาฬิกาบนพาเนล"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "รูปแบบนาฬิกากำหนดเอง"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording screencasts."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
"ส่วนขยายต่างๆ ของเชลล์ GNOME จะมี uuid ประจำตัว ค่านี้จะเก็บรายชื่อของส่วนขยายที่จะไม่เรียกใช้"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
msgstr "ประวัติคำสั่งของกล่องโต้ตอบเรียกโปรแกรม (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "รูปแบบชั่วโมง"
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
"ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" "
"ก็จะแสดงวันที่ในนาฬิกาควบคู่กับเวลาด้วย"
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr ""
"ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" ก็จะแสดงวินาทีในเวลาด้วย"
# See http://en.wikipedia.org/wiki/ISO_week_date
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "ถ้าเลือก จะแสดงวันที่แบบสัปดาห์ของ ISO ในปฏิทิน"
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where "
"the recorded video is recorded. It will normally have a unconnected source "
"pad; output from that pad will be written into the output file. However the "
"pipeline can also take care of its own output - this might be used to send "
"the output to an icecast server via shout2send or similar. When unset or set "
"to an empty value, the default pipeline will be used. This is currently "
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show date in clock"
msgstr "แสดงวันที่ในนาฬิกา"
# See http://en.wikipedia.org/wiki/ISO_week_date
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show the week date in the calendar"
msgstr "แสดงวันที่แบบสัปดาห์ในปฏิทิน"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Show time with seconds"
msgstr "แสดงเวลาพร้อมวินาที"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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 ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"ค่านี้กำหนดรูปแบบของเวลาในแอพเพล็ตนาฬิกาเมื่อกำหนดรูปแบบเป็น \"custom\" "
"คุณสามารถใช้รหัสการแปลงของ strftime() เพื่อระบุรูปแบบที่ต้องการได้ "
"ดูข้อมูลเพิ่มเติมได้จากคู่มือของ strftime()"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"ค่านี้กำหนดรูปแบบชั่วโมงที่จะใช้ในแอพเพล็ตนาฬิกา ค่าที่เป็นไปได้คือ\"12-hour\", \"24-hour\", "
"\"unix\" และ \"custom\" ถ้ากำหนดเป็น \"unix\" นาฬิกาจะแสดงเวลาเป็นวินาทีนับจาก 1970-"
"01-01 ถ้ากำหนดเป็น \"custom\" นาฬิกาจะแสดงตามรูปแบบที่กำหนดใน custom_format "
"สังเกตว่าถ้ากำหนดเป็น \"unix\" หรือ \"custom\" ค่า show_date และ show_seconds "
"ก็จะไม่มีผล"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "Uuids of extensions to disable"
msgstr "uuid ของส่วนขยายที่จะปิดใช้"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
msgid "Whether to collect stats about applications usage"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
msgid "Color of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid ""
"Determines the position of the magnified mouse image within the magnified "
"view and how it reacts to system mouse movement. The values are - none: no "
"mouse tracking; - centered: the mouse image is displayed at the center of "
"the zoom region (which also represents the point under the system mouse) and "
"the magnified contents are scrolled as the system mouse moves; - "
"proportional: the position of the magnified mouse in the zoom region is "
"proportionally the same as the position of the system mouse on screen; - "
"push: when the magnified mouse intersects a boundary of the zoom region, the "
"contents are scrolled into view."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
msgid ""
"Determines whether the crosshairs intersect the magnified mouse sprite, or "
"are clipped such that the ends of the horizontal and vertical lines surround "
"the mouse image."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
msgid "Enable lens mode"
msgstr "เปิดใช้โหมดแว่นขยาย"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
msgid ""
"Enables/disables display of crosshairs centered on the magnified mouse "
"sprite."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:9
msgid ""
"For centered mouse tracking, when the system pointer is at or near the edge "
"of the screen, the magnified contents continue to scroll such that the "
"screen edge moves into the magnified view."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
msgid "Magnification factor"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
msgid "Mouse Tracking Mode"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
msgid "Opacity of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
msgid "Screen position"
msgstr "ตำแหน่งของหน้าจอ"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
msgid "Show or hide the magnifier"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
msgid ""
"The color of the the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
msgid ""
"The magnified view either fills the entire screen, or occupies the top-half, "
"bottom-half, left-half, or right-half of the screen."
msgstr ""
"ช่องแสดงภาพขยายอาจจะใหญ่เต็มจอภาพ (full-screen) หรืออาจจะกินที่แค่ครึ่งบน (top-half) "
"ครึ่งล่าง (bottom-half) ครึ่งซ้าย (left-half) หรือครึ่งขวา (right-half)"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:21
msgid ""
"The power of the magnification. A value of 1.0 means no magnification. A "
"value of 2.0 doubles the size."
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
msgid ""
"Whether the magnified view should be centered over the location of the "
"system mouse and move with it."
msgstr "กำหนดว่าจะให้ภาพขยายหน้าจอวางตำแหน่งกึ่งกลางที่เมาส์และเคลื่อนย้ายไปตามเมาส์หรือไม่"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "รูปแบบนาฬิกา"
@ -62,31 +350,31 @@ msgid "_24 hour format"
msgstr "แบบ _24 ขั่วโมง"
#. **** Applications ****
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:872
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
msgid "APPLICATIONS"
msgstr "โปรแกรม"
#: ../js/ui/appDisplay.js:420
#: ../js/ui/appDisplay.js:348
msgid "PREFERENCES"
msgstr "ปรับแต่ง"
#: ../js/ui/appDisplay.js:726
#: ../js/ui/appDisplay.js:647
msgid "New Window"
msgstr "หน้าต่างใหม่"
#: ../js/ui/appDisplay.js:730
#: ../js/ui/appDisplay.js:651
msgid "Remove from Favorites"
msgstr "ลบออกจากรายการโปรด"
#: ../js/ui/appDisplay.js:731
#: ../js/ui/appDisplay.js:652
msgid "Add to Favorites"
msgstr "เพิ่มเข้าในรายการโปรด"
#: ../js/ui/appDisplay.js:1038
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "ลากมาที่นี่เพื่อเพิ่มเป็นรายการโปรด"
#: ../js/ui/appFavorites.js:89
#: ../js/ui/appFavorites.js:88
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s ถูกเพิ่มเข้าในรายการโปรดของคุณแล้ว"
@ -96,233 +384,313 @@ msgstr "%s ถูกเพิ่มเข้าในรายการโปร
msgid "%s has been removed from your favorites."
msgstr "%s ถูกลบออกจากรายการโปรดของคุณแล้ว"
#: ../js/ui/dash.js:204
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "หา"
#: ../js/ui/dash.js:527
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "กำลังค้นหา..."
#: ../js/ui/dash.js:541
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "ไม่มีผลลัพธ์ที่ตรงกัน"
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:891 ../js/ui/placeDisplay.js:551
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr ""
msgstr "ที่หลักๆ และอุปกรณ์"
#. **** Documents ****
#: ../js/ui/dash.js:898 ../js/ui/docDisplay.js:497
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr ""
msgstr "รายการล่าสุด"
#: ../js/ui/lookingGlass.js:475
#: ../js/ui/lookingGlass.js:552
msgid "No extensions installed"
msgstr "ไม่มีส่วนขยายติดตั้งอยู่"
#: ../js/ui/lookingGlass.js:512
#: ../js/ui/lookingGlass.js:589
msgid "Enabled"
msgstr ""
msgstr "เปิดใช้งาน"
#: ../js/ui/lookingGlass.js:514
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr ""
msgstr "ปิดใช้"
#: ../js/ui/lookingGlass.js:516
#: ../js/ui/lookingGlass.js:593
msgid "Error"
msgstr "ผิดพลาด"
#: ../js/ui/lookingGlass.js:518
#: ../js/ui/lookingGlass.js:595
msgid "Out of date"
msgstr ""
msgstr "ตกรุ่น"
#: ../js/ui/lookingGlass.js:543
#: ../js/ui/lookingGlass.js:620
msgid "View Source"
msgstr ""
msgstr "ดูซอร์ส"
#: ../js/ui/lookingGlass.js:549
#: ../js/ui/lookingGlass.js:626
msgid "Web Page"
msgstr "หน้าเว็บ"
#: ../js/ui/overview.js:165
#: ../js/ui/overview.js:160
msgid "Undo"
msgstr "เรียกคืน"
#: ../js/ui/panel.js:334
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "ออกจาก %s"
#: ../js/ui/panel.js:354
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "ปรับแต่ง"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:441
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr ""
msgstr "%a %d %b, %R:%S"
#: ../js/ui/panel.js:442
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr ""
msgstr "%a %d %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:446
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr ""
msgstr "%a %R:%S"
#: ../js/ui/panel.js:447
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr ""
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:454
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr ""
msgstr "%a %d %b, %l:%M:%S %p"
#: ../js/ui/panel.js:455
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr ""
msgstr "%a %d %b, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:459
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr ""
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:460
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr ""
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:562
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "กิจกรรม"
#: ../js/ui/placeDisplay.js:108
#: ../js/ui/placeDisplay.js:111
#, c-format
msgid "Failed to unmount '%s'"
msgstr "เลิกเมานท์ '%s' ไม่สำเร็จ"
#: ../js/ui/placeDisplay.js:111
#: ../js/ui/placeDisplay.js:114
msgid "Retry"
msgstr "ลองใหม่"
#: ../js/ui/placeDisplay.js:156
#: ../js/ui/placeDisplay.js:159
msgid "Connect to..."
msgstr "เชื่อมต่อไปยัง..."
#: ../js/ui/runDialog.js:235
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr ""
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
msgstr "โปรดป้อนคำสั่ง:"
#: ../js/ui/runDialog.js:380
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr ""
msgstr "คำสั่ง '%s' ทำงานล้มเหลว:"
#: ../js/ui/statusMenu.js:91
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr ""
#: ../js/ui/statusMenu.js:95
msgid "Busy"
msgstr ""
#: ../js/ui/statusMenu.js:99
msgid "Invisible"
msgstr ""
msgstr "อยู่"
#: ../js/ui/statusMenu.js:106
msgid "Account Information..."
msgstr "ข้อมูลบัญชี..."
msgid "Busy"
msgstr "ไม่ว่าง"
#: ../js/ui/statusMenu.js:110
msgid "System Preferences..."
msgstr "ปรับแต่งระบบ..."
#: ../js/ui/statusMenu.js:114
msgid "My Account..."
msgstr "บัญชีของฉัน..."
#: ../js/ui/statusMenu.js:117
#: ../js/ui/statusMenu.js:118
msgid "System Settings..."
msgstr "ตั้งค่าระบบ..."
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "ล็อคหน้าจอ"
#: ../js/ui/statusMenu.js:121
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "สลับผู้ใช้"
#: ../js/ui/statusMenu.js:126
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "ออกจากระบบ..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:141
msgid "Suspend"
msgstr "พักเครื่อง"
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "ปิดเครื่อง..."
#: ../js/ui/windowAttentionHandler.js:47
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "โปรแกรมอ่านหน้าจอ"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr "แป้นพิมพ์บนหน้าจอ"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr "แจ้งเหตุด้วยภาพ"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr "ค้างปุ่มกด"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "พิมพ์แบบช้า"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "ป้องกันการกดแป้นรัว"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "บังคับเมาส์ด้วยแป้น"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr "ตั้งค่าสิ่งอำนวยความสะดวก"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr "สีตัดกัน"
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "อักษรขนาดใหญ่"
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "ซูม"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
msgstr ""
msgstr "%s เปิดเสร็จแล้ว"
#: ../js/ui/windowAttentionHandler.js:49
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "'%s' พร้อมแล้ว"
#: ../js/ui/workspacesView.js:237
#: ../js/ui/workspacesView.js:229
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
#: ../js/ui/workspacesView.js:254
#: ../js/ui/workspacesView.js:246
msgid "Can't remove the first workspace."
msgstr "ไม่สามารถลบพื้นที่ทำงานแรกได้"
#: ../src/shell-global.c:1025
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
#. translators:
#. * The number of sound inputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1104
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "เสียงของระบบ"
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr ""
#: ../src/shell-global.c:1158
msgid "Less than a minute ago"
msgstr "ไม่ถึงหนึ่งนาทีก่อน"
#: ../src/shell-global.c:1029
#: ../src/shell-global.c:1162
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d นาทีก่อน"
#: ../src/shell-global.c:1034
#: ../src/shell-global.c:1167
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ชั่วโมงก่อน"
#: ../src/shell-global.c:1039
#: ../src/shell-global.c:1172
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d วันก่อน"
#: ../src/shell-global.c:1044
#: ../src/shell-global.c:1177
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d สัปดาห์ก่อน"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "โฟลเดอร์บ้าน"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "ระบบแฟ้ม"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ค้นหา"
@ -331,7 +699,10 @@ msgstr "ค้นหา"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr ""
msgstr "%1$s: %2$s"
#~ msgid "Account Information..."
#~ msgstr "ข้อมูลบัญชี..."

290
po/ug.po
View File

@ -1,17 +1,18 @@
# Uyghur translation for gnome-shell.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Gheyret Kenji<gheyret@yahoo.com>,2010.
# Sahran <sahran.ug@gmail.com>, 2010.
# Zeper <zeper@msn.com>, 2010.
#
# Uyghur translation for gnome-shell.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Gheyret Kenji<gheyret@yahoo.com>,2010.
# Sahran <sahran.ug@gmail.com>, 2010.
# Zeper <zeper@msn.com>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-11-11 00:43+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Gheyret Kenji<gheyret@yahoo.com>\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-11-25 14:32+0000\n"
"PO-Revision-Date: 2010-11-25 14:28+0600\n"
"Last-Translator: Sahran <sahran@live.com>\n"
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -20,7 +21,7 @@ msgstr ""
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "GNOME چاپان"
msgstr "GNOME Shell"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
@ -32,7 +33,7 @@ msgstr "سائەت"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "ئىختىيارىچە تاختا سائەت"
msgstr "تاختا سائەتنى ئۆزلەشتۈرىدۇ"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
@ -42,25 +43,32 @@ msgstr "ئىچكى سازلاش ۋە كۆزىتىش قورالىنى زىيار
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "ئىختىيارىي سائەت فورماتى"
msgstr "سائەتنىڭ ئىختىيارىي فورماتى"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق كىرىشىگە قۇلايلىق"
msgstr ""
"ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق "
"كىرىشىگە قۇلايلىق"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
msgstr "ھۆججەت كېڭەيتىلگەن ئاتى ئېكران كەسمىسى (screencasts) ساقلاشقا ئىشلىتىلىدۇ"
msgstr ""
"ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن "
"ئاتى "
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording screencasts."
msgstr "كاندۇك نىسبىتى ئېكران كەسمىسى (screencasts) خاتىرىلەشكە ئىشلىتىلىدۇ"
msgstr ""
"ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr "GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
msgstr ""
"GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا "
"يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
@ -74,13 +82,17 @@ msgstr "سائەت فورماتى"
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
msgstr ""
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
"كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ."
msgstr ""
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
"كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ. "
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
@ -88,11 +100,11 @@ msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپت
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr "ئامراق پروگراممىلارنىڭ ئۈستەل ئۈستى ھۆججەت ID تىزىملىكى"
msgstr "ئامراق قوللىنىشچان پروگراممىلارنىڭ ئۈستەل ئۈستى ھۆججەت ID تىزىملىكى"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "قىسقىچە بايان خىزمەت رايون كۆرۈنۈش ھالىتى"
msgstr "خىزمەت رايون كۆرۈنۈش ھالىتى ھەققىدە قىسقىچە بايان"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid ""
@ -105,6 +117,16 @@ msgid ""
"to an empty value, the default pipeline will be used. This is currently "
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
"ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان GStreamer ئاقما لىنىيىنى تەڭشەيدۇ. ئۇ "
"gst-launch گرامماتىكىسىغا بوي سۇنىدۇ. بۇ ئاقما لىنىيىدە ئۇلانمىغان sink pad "
"بولۇشى لازىم، خاتىرىلىنىدىغان سىن مۇشۇ جايدا خاتىرىلىنىدۇ. بۇ لىنىيىدە "
"ئادەتتە يەنە بىر ئۇلانمىغان مەنبە pad بولىدۇ؛ بۇ pad چىقارغان ئۇچۇرلار "
"ھۆججەتكە يېزىلىدۇ. ئەمما ئاقما لىنىيە ئۆزىنىڭ چىقىرىشىنى بىر تەرەپ "
"قىلالايدۇ، بۇنداق بولغاندا shout2send ئارقىلىق ياكى شۇنىڭغا ئوخشاش ئۇسۇلدا "
"چىقىرىشنى icecast مۇلازىمېتىرىغا يوللايدۇ. ئاقما لىنىيە تەڭشەلمىگەن ياكى بوش "
"قىممەتكە تەڭشەلگەندە كۆڭۈلدىكى ئاقما لىنىيە قوزغىتىلىدۇ. ئۇنىڭ نۆۋەتتىكى "
"قىممىتى 'videorate ! theoraenc ! oggmux' بولۇپ، فورماتى Ogg شەكلىدە "
"خاتىرىلىنىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show date in clock"
@ -112,7 +134,7 @@ msgstr "سائەت ئىچىدە چېسلا كۆرسەت"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show the week date in the calendar"
msgstr "يىلنامىدە ھەپتە كۆرسەت"
msgstr "يىلنامىدە ھەپتىنى كۆرسىتىدۇ"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Show time with seconds"
@ -129,23 +151,30 @@ 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 ""
"خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ "
"بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا "
"خاتىرىلەيدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr "GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى كاندۇك نىسبىتى"
msgstr ""
"GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى "
"كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
msgstr "ئېكران كەسمىسىنى كودلاشتا ئىشلىتىلىدىغان gstreamer ئاقما لىنىيىسى"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr "تاللانغان قىسقىچە مەزمۇن خىزمەت رايونى كۆرۈنۈشىدە قوللايدىغان قىممەت «يەككە» ۋە «سېتكا»"
msgstr ""
"قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە "
"بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
@ -153,7 +182,11 @@ msgid ""
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr "چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
msgstr ""
"چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار"
"(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي "
"ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق "
"قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid ""
@ -161,7 +194,11 @@ msgid ""
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr "format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() نىڭ قوللانمىسىدىن كۆرۈڭ."
msgstr ""
"format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا "
"تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات "
"بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() "
"نىڭ قوللانمىسىدىن كۆرۈڭ."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid ""
@ -171,11 +208,18 @@ msgid ""
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr "بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، \"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
msgstr ""
"بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى "
"بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، "
"\"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت "
"ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. "
"ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە "
"ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە "
"show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "Uuids of extensions to disable"
msgstr "كېڭەيتىلمىنىڭ Uuid چەكلەندى"
msgstr "چەكلىنىدىغان كېڭەيتىلمىنىڭ Uuid سى"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
msgid "Whether to collect stats about applications usage"
@ -183,17 +227,18 @@ msgstr "پروگراممىنىڭ ئىشلىتىلىشى ھەققىدىكى ست
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr ""
msgstr "نىشانلىغۇچنى ئوتتۇرىغا توغرىلا"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
msgid "Color of the crosshairs"
msgstr ""
msgstr "نىشانلىغۇچنىڭ رەڭگى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
"نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ ئۇزۇنلۇقى بەلگىلىنىدۇ."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid ""
@ -212,7 +257,7 @@ msgstr ""
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr ""
msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى تولۇق سۈزۈكتىن تولۇق تۇتۇققىچە بەلگىلىنىدۇ."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
msgid ""
@ -223,7 +268,7 @@ msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
msgid "Enable lens mode"
msgstr ""
msgstr "لېنزا ھالىتىنى قوزغات"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
msgid ""
@ -240,19 +285,19 @@ msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
msgstr ""
msgstr "نىشانلىغۇچنىڭ ئېگىزلىكى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
msgid "Magnification factor"
msgstr ""
msgstr "چوڭايتىش-كىچىكلىتىش نىسبىتى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
msgid "Mouse Tracking Mode"
msgstr ""
msgstr "چاشقىنەك ئىزلاش ھالىتى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
msgid "Opacity of the crosshairs"
msgstr ""
msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
msgid "Screen position"
@ -264,21 +309,21 @@ msgstr "دومىلىما چوڭايتقۇچ ئۈستەل ئۈستى گىرۋەك
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
msgstr ""
msgstr "نىشانلىغۇچنى كۆرسەت ياكى يوشۇر"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
msgid "Show or hide the magnifier"
msgstr ""
msgstr "لوپا ئەينەكنى كۆرسەت ياكى يوشۇر"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr ""
msgstr "لوپا ئەينەك ۋە ئۇنىڭ ھەممە چوڭايتىش دائىرىسىنى كۆرسەت ياكى يوشۇرىدۇ."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
msgid ""
"The color of the the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ رەڭگى."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
msgid ""
@ -290,11 +335,11 @@ msgstr ""
msgid ""
"The power of the magnification. A value of 1.0 means no magnification. A "
"value of 2.0 doubles the size."
msgstr ""
msgstr "چوڭايتىش كۈچى. 1.0 چوڭايتمايدۇ، 2.0 چوڭلۇقىنى ھەسسىلەيدۇ دېگەن مەنىدە."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
msgstr ""
msgstr "نىشانلىغۇچنىڭ قېلىنلىقى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
msgid ""
@ -304,7 +349,7 @@ msgstr ""
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ كەڭلىكى."
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
@ -316,11 +361,11 @@ msgstr "سائەت مايىللىقى"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "تاختا كۆرسەت"
msgstr "تاختا كۆرسىتىش"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "سېكۇنت كۆرسەت(_N)"
msgstr "سېكۇنتنى كۆرسەت(_N)"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
@ -357,12 +402,12 @@ msgstr "يىغقۇچقا قوش"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "بۇ جايغا سۆرەپ قىسقۇچقا قوش"
msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:88
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلىدۇ."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:107
#, c-format
@ -375,7 +420,7 @@ msgstr "ئىزدە"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "ئىزدەۋاتىدۇ"
msgstr "ئىزدەۋاتىدۇ..."
#: ../js/ui/dash.js:487
msgid "No matching results."
@ -384,7 +429,7 @@ msgstr "ماس كېلىدىغان نەتىجە يوق."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
@ -421,72 +466,72 @@ msgstr "مەنبەنى كۆرسەت"
#: ../js/ui/lookingGlass.js:626
msgid "Web Page"
msgstr "تور بەت"
msgstr "توربەت"
#: ../js/ui/overview.js:160
msgid "Undo"
msgstr "يېنىۋال"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "%s چېكىن"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "مايىللىق"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e، %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%a %b %e، %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e، %l:%M:%S %p"
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e, %l:%M %p"
msgstr "%a %b %e، %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%p%l:%M (%a)"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "ھەرىكەتچان"
msgstr "پائالىيەتلەر"
#: ../js/ui/placeDisplay.js:111
#, c-format
msgid "Failed to unmount '%s'"
msgstr "%s نىڭ ئېگەرنى يېشىش مەغلۇپ بولدى."
msgstr "«%s» نى ئېگەرسىزلەش مەغلۇپ بولدى"
#: ../js/ui/placeDisplay.js:114
msgid "Retry"
@ -494,7 +539,7 @@ msgstr "قايتا سىنا"
#: ../js/ui/placeDisplay.js:159
msgid "Connect to..."
msgstr "باغلانماق..."
msgstr "باغلىنىش…"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
@ -503,7 +548,7 @@ msgstr "باغلانماق..."
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr ""
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
@ -512,49 +557,47 @@ msgstr "بۇيرۇق كىرگۈزۈڭ:"
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' ئىجرا قىلالمىدى:"
msgstr "«%s» ئىجرا قىلىش مەغلۇپ بولدى:"
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "ئىشلىتىلىشچان"
msgstr "بار"
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "ئالدىراش"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "يوشۇرۇن"
#: ../js/ui/statusMenu.js:114
#, fuzzy
#| msgid "My Account..."
msgid "My Account"
msgstr "ھېساباتىم…"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr ""
#: ../js/ui/statusMenu.js:118
#, fuzzy
#| msgid "System Settings..."
msgid "System Settings"
msgstr "سىستېما تەڭشەكلىرى..."
#: ../js/ui/statusMenu.js:123
msgid "System Settings..."
msgstr "سىستېما تەڭشەكلىرى"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "ئېكراننى قۇلۇپلا"
msgstr "ئېكراننى قۇلۇپلاش"
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "ئىشلەتكۈچى ئالماشتۇرۇش"
#: ../js/ui/statusMenu.js:134
msgid "Switch User"
msgstr "ئىشلەتكۈچى ئالماشتۇر"
#: ../js/ui/statusMenu.js:139
msgid "Log Out..."
msgstr "تىزىمدىن چىق…"
msgstr "تىزىمدىن چىقىش…"
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "ۋاقىتلىق توختىتىش"
#: ../js/ui/statusMenu.js:141
#, fuzzy
#| msgid "Suspend"
msgid "Suspend..."
msgstr "توڭلات"
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr ""
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "تاقا…"
@ -572,33 +615,33 @@ msgstr "كۆرۈنمە ئاگاھلاندۇرۇش"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr "چاپلاش كۇنۇپكىسى"
msgstr "Sticky Keys"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "ئاستا كۇنۇپكا"
msgstr "Slow Keys"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "قاڭقىش كۇنۇپكىسى"
msgstr "Bounce Keys"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "چاشقىنەك كۇنۇپكا"
msgstr "Mouse Keys"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr "ھەممىباب زىيارەت تەڭشىكى"
msgstr "ئۇنىۋېرسال زىيارەت تەڭشىكى"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr "يۇقىرى ئاق-قارىلىقى"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "چوڭ تېكىست"
#: ../js/ui/status/accessibility.js:223
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "كېڭەيت تارايت"
@ -610,7 +653,7 @@ msgstr "%s باشلاشنى تاماملىدى"
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "'%s' تەييار بولدى"
msgstr "«%s» تەييار"
#: ../js/ui/workspacesView.js:229
msgid ""
@ -619,7 +662,7 @@ msgstr "يېڭى خىزمەت رايونى قوشالمايدۇ چۈنكى ئە
#: ../js/ui/workspacesView.js:246
msgid "Can't remove the first workspace."
msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋېتەلمەيدۇ."
msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋەتكىلى بولمايدۇ."
#. translators:
#. * The number of sound outputs on a particular device
@ -627,7 +670,7 @@ msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋېتەلمە
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u چىقار"
msgstr[0] "%u چىقىرىلما"
#. translators:
#. * The number of sound inputs on a particular device
@ -635,51 +678,55 @@ msgstr[0] "%u چىقار"
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] "%u كىرگۈز"
msgstr[0] "%u كىرگۈزۈلمە"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "سىستېما ئاۋازى"
#: ../src/shell-global.c:1219
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "نامەلۇم"
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "بىر مىنۇتتىنمۇ ئىلگىرى"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d مىنۇت ئىلگىرى"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d سائەت ئىلگىرى"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d كۈن ئىلگىرى"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d ھەپتە ئىلگىرى"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "باش مۇندەرىجە"
msgstr "ماكان مۇندەرىجە"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "ھۆججەت سىستېمىسى"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ئىزدە"
@ -688,7 +735,10 @@ msgstr "ئىزدە"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
msgstr "%1$s: %2$s "
#~ msgid "Invisible"
#~ msgstr "يوشۇرۇن"

View File

@ -6,19 +6,21 @@
# Aron Xu <aronxu@gnome.org>, 2010.
# Jessica Ban <bancage@gmail.com>, 2010.
# YunQiang Su <wzssyqa@gmail.com>, 2010.
# zhang ping <zhangping159@gmail.com>, 2010.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-10-30 17:51+0000\n"
"PO-Revision-Date: 2010-10-28 01:24+0800\n"
"Last-Translator: YunQiang Su <wzssyqa@gmail.com>\n"
"POT-Creation-Date: 2010-12-10 00:17+0000\n"
"PO-Revision-Date: 2010-12-12 15:45+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_CN\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../data/gnome-shell.desktop.in.in.h:1
@ -94,10 +96,6 @@ msgid "List of desktop file IDs for favorite applications"
msgstr "收藏夹中的应用程序的 desktop 文件 ID 的列表"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "工作区视图模式的总览"
#: ../data/org.gnome.shell.gschema.xml.in.h:14
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 "
@ -115,25 +113,25 @@ msgstr ""
"器。当管道未被设置或者设置为空值时,默认的管道将被启用。其值当前"
"为“videorate ! theoraenc ! oggmux”并记录为 Ogg Theora 格式。"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "显示日期"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "在日历中显示星期"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "显示秒"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "符合这些标示的应用程序将显示在收藏区中。"
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
@ -142,25 +140,17 @@ msgstr ""
"录制的屏幕录像的文件名将是根据当前时间得到的独特值,并使用这个扩展名。录制另"
"外一个不同容器格式的录像时,它应该被更改。"
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr "GNOME Shell 的屏幕录像程序录制的屏幕录像的帧率,以 帧/秒 为格式。"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "用于编码屏幕录像的 GStreamer 管线"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"总览中,选中的工作区的试图模式。支持的值有 \"single\"(单独) 和 \"grid\"(网"
"格)。"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -171,7 +161,7 @@ msgstr ""
"时,此数据将保持私密,您可能因为隐私原因想要禁用此项。请注意,这么做,并不会"
"移除已经保存的数据。"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
@ -182,7 +172,7 @@ msgstr ""
"以被 strftime() 理解的转义符获取特定的格式。请查看 strftime() 的文档获取更多"
"信息。"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -197,11 +187,11 @@ msgstr ""
"示时间。注意,如果设置为 \"unix\" 或 \"custom\"show_date 和 show_seconds 键"
"将被忽略。"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "要禁用的扩展的 uuid"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "是否收集应用程序的使用情况"
@ -366,62 +356,41 @@ msgstr "_12 时格式"
msgid "_24 hour format"
msgstr "_24 小时格式"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:215
msgid "APPLICATIONS"
msgstr "应用程序"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:245
msgid "PREFERENCES"
msgstr "首选项"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:542
msgid "New Window"
msgstr "新窗口"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:546
msgid "Remove from Favorites"
msgstr "从收藏夹中移除"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:547
msgid "Add to Favorites"
msgstr "添加到收藏夹"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "拖到这里加入收藏夹"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s 已经添加到了您的收藏夹。"
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s 已经从您的收藏夹移除。"
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "查找"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "移除"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "正在搜索..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "无匹配结果。"
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "位置和设备"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "最近的项目"
@ -455,63 +424,63 @@ msgstr "查看源"
msgid "Web Page"
msgstr "网页"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:112
msgid "Undo"
msgstr "撤销"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:470
#, c-format
msgid "Quit %s"
msgstr "退出 %s"
#: ../js/ui/panel.js:494
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "首选项"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:581
msgid "%a %b %e, %R:%S"
msgstr "%A %b %e, %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:582
msgid "%a %b %e, %R"
msgstr "%A %m月%d日 %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:586
msgid "%a %R:%S"
msgstr "%A %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:587
msgid "%a %R"
msgstr "%A %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:594
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%A %m月%d日 %p%I:%M:%S"
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:595
msgid "%a %b %e, %l:%M %p"
msgstr "%A %m月%d日 %p%I:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:599
msgid "%a %l:%M:%S %p"
msgstr "%A %p%I:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:600
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. 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".
#: ../js/ui/panel.js:744
#: ../js/ui/panel.js:745
msgid "Activities"
msgstr "活动"
@ -528,6 +497,10 @@ msgstr "重试"
msgid "Connect to..."
msgstr "连接到..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "位置和设备"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -554,44 +527,38 @@ msgstr "可用"
msgid "Busy"
msgstr "忙碌"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "隐身"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "我的帐户"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "我的帐户..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "系统设置"
#: ../js/ui/statusMenu.js:123
#, fuzzy
#| msgid "System Preferences..."
msgid "System Settings..."
msgstr "系统首选项..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "锁住屏幕"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "切换用户"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "退出..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "休眠"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "休眠..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "重启..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "关机..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "缩放"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "屏幕阅读器"
@ -628,13 +595,109 @@ msgstr "通用访问设置"
msgid "High Contrast"
msgstr "高对比度"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "大号文本"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "缩放"
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "哪些设备在用电..."
#: ../js/ui/status/power.js:90
msgid "Power Settings"
msgstr "电源设置"
#: ../js/ui/status/power.js:117
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "剩余 %d 小时"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d %s %d %s remaining"
msgstr "剩余 %d %s %d %s"
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "小时"
#: ../js/ui/status/power.js:122
msgid "minute"
msgid_plural "minutes"
msgstr[0] "分钟"
#: ../js/ui/status/power.js:125
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "剩余 %d 分钟"
#: ../js/ui/status/power.js:244
msgid "AC adapter"
msgstr "AC 适配器"
#: ../js/ui/status/power.js:246
msgid "Laptop battery"
msgstr "笔记本电池"
#: ../js/ui/status/power.js:248
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
msgid "Monitor"
msgstr "显示器"
#: ../js/ui/status/power.js:252
msgid "Mouse"
msgstr "鼠标"
#: ../js/ui/status/power.js:254
msgid "Keyboard"
msgstr "键盘"
#: ../js/ui/status/power.js:256
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:258
msgid "Cell phone"
msgstr "手机"
#: ../js/ui/status/power.js:260
msgid "Media player"
msgstr "媒体播放器"
#: ../js/ui/status/power.js:262
msgid "Tablet"
msgstr "触摸板"
#: ../js/ui/status/power.js:264
msgid "Computer"
msgstr "计算机"
#: ../js/ui/status/power.js:266 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "未知"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "音量"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "麦克风"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "声音设置"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "搜索您的计算机"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -646,12 +709,12 @@ msgstr "%s 已启动"
msgid "'%s' is ready"
msgstr "%s 已就绪"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "无法添加新工作区,因为已经达到了工作区数量限制。"
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "不能移除第一个工作区。"
@ -661,7 +724,7 @@ msgstr "不能移除第一个工作区。"
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
msgstr[0] "%u 个输出"
#. translators:
#. * The number of sound inputs on a particular device
@ -669,51 +732,51 @@ msgstr[0] ""
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
msgstr[0] "%u 个输入"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr ""
msgstr "系统声音"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "少于一分钟前"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d 分钟前"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d 小时前"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d 天前"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d 周前"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "主文件夹"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:104
#: ../src/shell-util.c:104
msgid "File System"
msgstr "文件系统"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "搜索"
@ -722,11 +785,39 @@ msgstr "搜索"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "工作区视图模式的总览"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "总览中,选中的工作区的试图模式。支持的值有 \"single\"(单独) 和 \"grid\"(网"
#~ "格)。"
#~ msgid "Drag here to add favorites"
#~ msgstr "拖到这里加入收藏夹"
#~ msgid "Find"
#~ msgstr "查找"
#~ msgid "Searching..."
#~ msgstr "正在搜索..."
#~ msgid "No matching results."
#~ msgstr "无匹配结果。"
#~ msgid "Invisible"
#~ msgstr "隐身"
#~ msgid "Restart..."
#~ msgstr "重启..."
#~ msgid "ON"
#~ msgstr "开"
@ -757,9 +848,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "搜索结果"
#~ msgid "Unknown"
#~ msgstr "未知"
#~ msgid "Can't lock screen: %s"
#~ msgstr "不能锁住屏幕:%s"

View File

@ -47,7 +47,7 @@ st-marshal.c: Makefile st/st-marshal.list
st-enum-types.h: stamp-st-enum-types.h Makefile
@true
stamp-st-enum-types.h: $(source_h) st/st-enum-types.h.in
stamp-st-enum-types.h: $(source_h) st/st-enum-types.h.in $(st_source_h)
$(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \
--template st/st-enum-types.h.in \

View File

@ -13,8 +13,6 @@ bin_SCRIPTS = gnome-shell gnome-shell-clock-preferences
gnome-shell: gnome-shell.in
$(AM_V_GEN) sed -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
-e "s|@datadir[@]|$(datadir)|" \
-e "s|@GJS_JS_DIR[@]|$(GJS_JS_DIR)|" \
-e "s|@GJS_JS_NATIVE_DIR[@]|$(GJS_JS_NATIVE_DIR)|" \
-e "s|@libexecdir[@]|$(libexecdir)|" \
-e "s|@libdir[@]|$(libdir)|" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
@ -220,10 +218,12 @@ libgnome_shell_la_LIBADD = \
-lm \
$(MUTTER_PLUGIN_LIBS) \
$(LIBGNOMEUI_LIBS) \
$(BLUETOOTH_LIBS) \
libst-1.0.la \
libgdmuser-1.0.la \
libtray.la \
libgvc.la
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
typelibdir = $(pkglibdir)

View File

@ -1199,6 +1199,8 @@ on_list_cached_users_finished (DBusGProxy *proxy,
return;
}
maybe_set_is_loaded (manager);
g_ptr_array_foreach (paths, (GFunc)add_new_user_for_object_path, manager);
g_ptr_array_foreach (paths, (GFunc)g_free, NULL);

View File

@ -18,7 +18,7 @@ uiFile="$uiDir/clock-preferences.ui"
export GJS_PATH="$jsDir"
export GSETTINGS_SCHEMA_DIR="$schemaDir"
@GJS_CONSOLE@ -c "const ClockPreferences = imports.prefs.clockPreferences;
@GJS_CONSOLE@ --js-version 1.8 -c "const ClockPreferences = imports.prefs.clockPreferences;
ClockPreferences.main({ progName: '$progName',
uiFile: '$uiFile',
localeDir: '$localeDir' });"

View File

@ -159,8 +159,8 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
"/desktop/gnome/shell/windows/attach_modal_dialogs");
meta_prefs_override_preference_location ("/apps/metacity/general/button_layout",
"/desktop/gnome/shell/windows/button_layout");
meta_prefs_override_preference_location ("/apps/metacity/general/side_by_side_tiling",
"/desktop/gnome/shell/windows/side_by_side_tiling");
meta_prefs_override_preference_location ("/apps/metacity/general/edge_tiling",
"/desktop/gnome/shell/windows/edge_tiling");
meta_prefs_override_preference_location ("/apps/metacity/general/theme",
"/desktop/gnome/shell/windows/theme");
}
@ -357,6 +357,10 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
"GL buffer swap complete event received (with timestamp of completion)",
"x");
#if HAVE_BLUETOOTH
g_irepository_prepend_search_path (BLUETOOTH_DIR);
#endif
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
shell_js = g_getenv("GNOME_SHELL_JS");
@ -364,7 +368,10 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
shell_js = JSDIR;
search_path = g_strsplit(shell_js, ":", -1);
shell_plugin->gjs_context = gjs_context_new_with_search_path(search_path);
shell_plugin->gjs_context = g_object_new (GJS_TYPE_CONTEXT,
"search-path", search_path,
"js-version", "1.8",
NULL);
g_strfreev(search_path);
/* Disable the gnome-volume-control debug */

View File

@ -220,7 +220,7 @@ def start_shell(perf_output=None):
# Set up environment
env = dict(os.environ)
env.update({'GNOME_SHELL_JS' : '@GJS_JS_DIR@:@GJS_JS_NATIVE_DIR@:' + js_dir,
env.update({'GNOME_SHELL_JS' : js_dir,
'PATH' : '@MUTTER_BIN_DIR@:' + os.environ.get('PATH', ''),
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share'),

View File

@ -106,7 +106,7 @@ shell_embedded_window_realize (GtkWidget *widget)
* modifying the GDK hierarchy.
*/
XReparentWindow (GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (widget)),
GDK_WINDOW_XWINDOW (gtk_widget_get_window (widget)),
gdk_x11_window_get_xid (gtk_widget_get_window (widget)),
window->priv->stage_xwindow,
window->priv->position.x, window->priv->position.y);
}

View File

@ -245,6 +245,34 @@ shell_generic_container_finalize (GObject *object)
G_OBJECT_CLASS (shell_generic_container_parent_class)->finalize (object);
}
/* Based on implementation from clutter-group.c */
static gboolean
shell_generic_container_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
GList *l, *children;
children = st_container_get_children_list (ST_CONTAINER (actor));
CLUTTER_ACTOR_CLASS (shell_generic_container_parent_class)->get_paint_volume (actor, volume);
for (l = children; l != NULL; l = l->next)
{
ClutterActor *child = l->data;
const ClutterPaintVolume *child_volume;
/* This gets the paint volume of the child transformed into the
* group's coordinate space... */
child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
if (!child_volume)
return FALSE;
clutter_paint_volume_union (volume, child_volume);
}
return TRUE;
}
static void
shell_generic_container_class_init (ShellGenericContainerClass *klass)
{
@ -257,6 +285,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
actor_class->get_preferred_width = shell_generic_container_get_preferred_width;
actor_class->get_preferred_height = shell_generic_container_get_preferred_height;
actor_class->allocate = shell_generic_container_allocate;
actor_class->get_paint_volume = shell_generic_container_get_paint_volume;
actor_class->paint = shell_generic_container_paint;
actor_class->pick = shell_generic_container_pick;

View File

@ -60,8 +60,6 @@ struct _ShellGlobal {
const char *userdatadir;
StFocusManager *focus_manager;
/* Displays the root window; see shell_global_create_root_pixmap_actor() */
ClutterActor *root_pixmap;
GdkWindow *stage_window;
gint last_change_screen_width, last_change_screen_height;
@ -220,7 +218,6 @@ shell_global_init (ShellGlobal *global)
g_signal_connect (global->grab_notifier, "grab-notify", G_CALLBACK (grab_notify), global);
global->gtk_grab_active = FALSE;
global->root_pixmap = NULL;
global->stage_window = NULL;
global->input_mode = SHELL_STAGE_INPUT_MODE_NORMAL;
@ -497,6 +494,9 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
name = "dnd-none";
break;
case SHELL_CURSOR_POINTING_HAND:
name = "hand";
break;
default:
g_return_if_reached ();
}
@ -516,6 +516,8 @@ shell_global_set_cursor (ShellGlobal *global,
case SHELL_CURSOR_DND_COPY:
cursor_type = GDK_PLUS;
break;
case SHELL_CURSOR_POINTING_HAND:
cursor_type = GDK_HAND2;
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
cursor_type = GDK_X_CURSOR;
break;
@ -528,7 +530,8 @@ shell_global_set_cursor (ShellGlobal *global,
{
ClutterStage *stage = CLUTTER_STAGE (meta_plugin_get_stage (global->plugin));
global->stage_window = gdk_window_foreign_new (clutter_x11_get_stage_window (stage));
global->stage_window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (),
clutter_x11_get_stage_window (stage));
}
gdk_window_set_cursor (global->stage_window, cursor);
@ -651,11 +654,6 @@ update_screen_size (gpointer data)
global->last_change_screen_width = width;
global->last_change_screen_height = height;
/* update size of background actor to fix tiled backgrounds */
if (global->root_pixmap)
clutter_actor_set_size (CLUTTER_ACTOR (global->root_pixmap),
width, height);
return FALSE;
}

View File

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

View File

@ -39,7 +39,7 @@ shell_gtk_embed_on_window_realize (GtkWidget *widget,
* screen.
*/
clutter_x11_texture_pixmap_set_window (CLUTTER_X11_TEXTURE_PIXMAP (embed),
GDK_WINDOW_XWINDOW (gtk_widget_get_window (widget)),
gdk_x11_window_get_xid (gtk_widget_get_window (widget)),
FALSE);
}

View File

@ -198,6 +198,7 @@ shell_tray_manager_manage_stage (ShellTrayManager *manager,
{
Window stage_xwindow;
GdkWindow *stage_window;
GdkDisplay *display;
GdkScreen *screen;
g_return_if_fail (manager->priv->stage == NULL);
@ -212,13 +213,15 @@ shell_tray_manager_manage_stage (ShellTrayManager *manager,
* in in some way. (The Clutter/Mutter combo is currently incapable
* of multi-screen operation, so alternatively we could just assume
* that clutter_x11_get_default_screen() gives us the right
* screen.)
* screen.) We assume, in any case, that we are using the default
* GDK display.
*/
stage_window = gdk_window_lookup (stage_xwindow);
display = gdk_display_get_default();
stage_window = gdk_x11_window_lookup_for_display (display, stage_xwindow);
if (stage_window)
g_object_ref (stage_window);
else
stage_window = gdk_window_foreign_new (stage_xwindow);
stage_window = gdk_x11_window_foreign_new_for_display (display, stage_xwindow);
screen = gdk_window_get_screen (stage_window);

View File

@ -876,29 +876,39 @@ st_box_layout_apply_transform (ClutterActor *a,
cogl_matrix_translate (m, (int) -x, (int) -y, 0);
}
/* If we are translated, then we need to translate back before chaining
* up or the background and borders will be drawn in the wrong place */
static void
get_border_paint_offsets (StBoxLayout *self,
double *x,
double *y)
{
StBoxLayoutPrivate *priv = self->priv;
if (priv->hadjustment)
*x = st_adjustment_get_value (priv->hadjustment);
else
*x = 0;
if (priv->vadjustment)
*y = st_adjustment_get_value (priv->vadjustment);
else
*y = 0;
}
static void
st_box_layout_paint (ClutterActor *actor)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
StBoxLayout *self = ST_BOX_LAYOUT (actor);
StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
GList *l, *children;
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
if (priv->hadjustment)
x = st_adjustment_get_value (priv->hadjustment);
else
x = 0;
if (priv->vadjustment)
y = st_adjustment_get_value (priv->vadjustment);
else
y = 0;
/* If we are translated, then we need to translate back before chaining
* up or the background and borders will be drawn in the wrong place */
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_push_matrix ();
@ -950,23 +960,15 @@ static void
st_box_layout_pick (ClutterActor *actor,
const ClutterColor *color)
{
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
StBoxLayout *self = ST_BOX_LAYOUT (actor);
StBoxLayoutPrivate *priv = self->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
GList *l, *children;
gdouble x, y;
ClutterActorBox allocation_box;
ClutterActorBox content_box;
if (priv->hadjustment)
x = st_adjustment_get_value (priv->hadjustment);
else
x = 0;
if (priv->vadjustment)
y = st_adjustment_get_value (priv->vadjustment);
else
y = 0;
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
cogl_push_matrix ();
@ -1011,6 +1013,34 @@ st_box_layout_pick (ClutterActor *actor,
cogl_clip_pop ();
}
static gboolean
st_box_layout_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
StBoxLayout *self = ST_BOX_LAYOUT (actor);
gdouble x, y;
CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume);
/* When scrolled, st_box_layout_apply_transform() includes the scroll offset
* and affects paint volumes. This is right for our children, but our paint volume
* is determined by our allocation and borders and doesn't scroll, so we need
* to reverse-compensate here, the same as we do when painting.
*/
get_border_paint_offsets (self, &x, &y);
if (x != 0 || y != 0)
{
ClutterVertex origin;
clutter_paint_volume_get_origin (volume, &origin);
origin.x += x;
origin.y += y;
clutter_paint_volume_set_origin (volume, &origin);
}
return TRUE;
}
static void
st_box_layout_style_changed (StWidget *self)
{
@ -1047,6 +1077,7 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
actor_class->apply_transform = st_box_layout_apply_transform;
actor_class->paint = st_box_layout_paint;
actor_class->get_paint_volume = st_box_layout_get_paint_volume;
actor_class->pick = st_box_layout_pick;
widget_class->style_changed = st_box_layout_style_changed;

View File

@ -3,6 +3,7 @@
* st-group.c: A fixed layout container based on ClutterGroup
*
* Copyright 2010 Florian Müllner
* Copyright 2010 Intel Corporation
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
@ -230,7 +231,33 @@ st_group_hide_all (ClutterActor *actor)
NULL);
}
/* Based on implementation from clutter-group.c */
static gboolean
st_group_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
{
GList *l, *children;
children = st_container_get_children_list (ST_CONTAINER (actor));
CLUTTER_ACTOR_CLASS (st_group_parent_class)->get_paint_volume (actor, volume);
for (l = children; l != NULL; l = l->next)
{
ClutterActor *child = l->data;
const ClutterPaintVolume *child_volume;
/* This gets the paint volume of the child transformed into the
* group's coordinate space... */
child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
if (!child_volume)
return FALSE;
clutter_paint_volume_union (volume, child_volume);
}
return TRUE;
}
static void
@ -242,6 +269,7 @@ st_group_class_init (StGroupClass *klass)
actor_class->get_preferred_height = st_group_get_preferred_height;
actor_class->allocate = st_group_allocate;
actor_class->paint = st_group_paint;
actor_class->get_paint_volume = st_group_get_paint_volume;
actor_class->pick = st_group_pick;
actor_class->show_all = st_group_show_all;
actor_class->hide_all = st_group_hide_all;

View File

@ -49,6 +49,8 @@ G_DEFINE_TYPE (StIcon, st_icon, ST_TYPE_WIDGET)
struct _StIconPrivate
{
ClutterActor *icon_texture;
ClutterActor *pending_texture;
guint opacity_handler_id;
GIcon *gicon;
gchar *icon_name;
@ -56,6 +58,10 @@ struct _StIconPrivate
gint prop_icon_size; /* icon size set as property */
gint theme_icon_size; /* icon size from theme node */
gint icon_size; /* icon size we are using */
CoglHandle shadow_material;
float shadow_width;
float shadow_height;
};
static void st_icon_update (StIcon *icon);
@ -139,12 +145,25 @@ st_icon_dispose (GObject *gobject)
priv->icon_texture = NULL;
}
if (priv->pending_texture)
{
clutter_actor_destroy (priv->pending_texture);
g_object_unref (priv->pending_texture);
priv->pending_texture = NULL;
}
if (priv->gicon)
{
g_object_unref (priv->gicon);
priv->gicon = NULL;
}
if (priv->shadow_material)
{
cogl_handle_unref (priv->shadow_material);
priv->shadow_material = COGL_INVALID_HANDLE;
}
G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject);
}
@ -227,29 +246,30 @@ st_icon_paint (ClutterActor *actor)
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->paint (actor);
if (priv->icon_texture)
clutter_actor_paint (priv->icon_texture);
}
{
if (priv->shadow_material)
{
StThemeNode *node = st_widget_get_theme_node (ST_WIDGET (actor));
StShadow *shadow_spec = st_theme_node_get_shadow (node);
ClutterActorBox allocation;
float width, height;
static void
st_icon_map (ClutterActor *actor)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->map (actor);
allocation.x1 = (width - priv->shadow_width) / 2;
allocation.y1 = (height - priv->shadow_height) / 2;
allocation.x2 = allocation.x1 + priv->shadow_width;
allocation.y2 = allocation.y1 + priv->shadow_height;
if (priv->icon_texture)
clutter_actor_map (priv->icon_texture);
}
_st_paint_shadow_with_opacity (shadow_spec,
priv->shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->icon_texture));
}
static void
st_icon_unmap (ClutterActor *actor)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->unmap (actor);
if (priv->icon_texture)
clutter_actor_unmap (priv->icon_texture);
clutter_actor_paint (priv->icon_texture);
}
}
static void
@ -283,8 +303,6 @@ st_icon_class_init (StIconClass *klass)
actor_class->get_preferred_width = st_icon_get_preferred_width;
actor_class->allocate = st_icon_allocate;
actor_class->paint = st_icon_paint;
actor_class->map = st_icon_map;
actor_class->unmap = st_icon_unmap;
widget_class->style_changed = st_icon_style_changed;
@ -322,10 +340,90 @@ st_icon_init (StIcon *self)
{
self->priv = ST_ICON_GET_PRIVATE (self);
self->priv->gicon = NULL;
self->priv->icon_size = DEFAULT_ICON_SIZE;
self->priv->prop_icon_size = -1;
self->priv->icon_type = DEFAULT_ICON_TYPE;
self->priv->shadow_material = COGL_INVALID_HANDLE;
self->priv->shadow_width = -1;
self->priv->shadow_height = -1;
}
static void
st_icon_update_shadow_material (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (icon));
StShadow *shadow_spec = st_theme_node_get_shadow (theme_node);
if (priv->shadow_material)
{
cogl_handle_unref (priv->shadow_material);
priv->shadow_material = COGL_INVALID_HANDLE;
}
if (shadow_spec)
{
CoglHandle material;
gint width, height;
clutter_texture_get_base_size (CLUTTER_TEXTURE (priv->icon_texture),
&width, &height);
material = _st_create_shadow_material_from_actor (shadow_spec,
priv->icon_texture);
priv->shadow_material = material;
priv->shadow_width = width;
priv->shadow_height = height;
}
}
static void
on_pixbuf_changed (ClutterTexture *texture,
StIcon *icon)
{
st_icon_update_shadow_material (icon);
}
static void
st_icon_finish_update (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
if (priv->icon_texture)
{
clutter_actor_destroy (priv->icon_texture);
priv->icon_texture = NULL;
}
if (priv->pending_texture)
{
priv->icon_texture = priv->pending_texture;
priv->pending_texture = NULL;
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
/* Remove the temporary ref we added */
g_object_unref (priv->icon_texture);
st_icon_update_shadow_material (icon);
/* "pixbuf-change" is actually a misnomer for "texture-changed" */
g_signal_connect (priv->icon_texture, "pixbuf-change",
G_CALLBACK (on_pixbuf_changed), icon);
}
}
static void
opacity_changed_cb (GObject *object,
GParamSpec *pspec,
gpointer user_data)
{
StIcon *icon = user_data;
StIconPrivate *priv = icon->priv;
g_signal_handler_disconnect (priv->pending_texture, priv->opacity_handler_id);
priv->opacity_handler_id = 0;
st_icon_finish_update (icon);
}
static void
@ -335,14 +433,14 @@ st_icon_update (StIcon *icon)
StThemeNode *theme_node;
StTextureCache *cache;
/* Get rid of the old one */
if (priv->icon_texture)
if (priv->pending_texture)
{
clutter_actor_destroy (priv->icon_texture);
priv->icon_texture = NULL;
clutter_actor_destroy (priv->pending_texture);
g_object_unref (priv->pending_texture);
priv->pending_texture = NULL;
priv->opacity_handler_id = 0;
}
/* Try to lookup the new one */
theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
if (theme_node == NULL)
return;
@ -350,23 +448,42 @@ st_icon_update (StIcon *icon)
cache = st_texture_cache_get_default ();
if (priv->gicon)
{
priv->icon_texture = st_texture_cache_load_gicon (cache,
(priv->icon_type != ST_ICON_APPLICATION &&
priv->icon_type != ST_ICON_DOCUMENT) ?
theme_node : NULL,
priv->gicon,
priv->icon_size);
priv->pending_texture = st_texture_cache_load_gicon (cache,
(priv->icon_type != ST_ICON_APPLICATION &&
priv->icon_type != ST_ICON_DOCUMENT) ?
theme_node : NULL,
priv->gicon,
priv->icon_size);
}
else if (priv->icon_name)
{
priv->icon_texture = st_texture_cache_load_icon_name (cache,
theme_node,
priv->icon_name,
priv->icon_type,
priv->icon_size);
priv->pending_texture = st_texture_cache_load_icon_name (cache,
theme_node,
priv->icon_name,
priv->icon_type,
priv->icon_size);
}
if (priv->pending_texture)
{
g_object_ref_sink (priv->pending_texture);
if (clutter_actor_get_opacity (priv->pending_texture) != 0 || priv->icon_texture == NULL)
{
/* This icon is ready for showing, or nothing else is already showing */
st_icon_finish_update (icon);
}
else
{
/* Will be shown when fully loaded */
priv->opacity_handler_id = g_signal_connect (priv->pending_texture, "notify::opacity", G_CALLBACK (opacity_changed_cb), icon);
}
}
else if (priv->icon_texture)
{
clutter_actor_destroy (priv->icon_texture);
priv->icon_texture = NULL;
}
if (priv->icon_texture)
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
}
static gboolean

View File

@ -61,6 +61,7 @@
#include <glib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdkx.h>
#include <X11/extensions/XKB.h>
#include "st-im-text.h"
@ -181,6 +182,13 @@ st_im_text_paint (ClutterActor *actor)
update_im_cursor_location (self);
}
static gboolean
st_im_text_get_paint_volume (ClutterActor *self,
ClutterPaintVolume *volume)
{
return clutter_paint_volume_set_from_allocation (volume, self);
}
/* Returns a new reference to window */
static GdkWindow *
window_for_actor (ClutterActor *actor)
@ -193,11 +201,11 @@ window_for_actor (ClutterActor *actor)
stage = clutter_actor_get_stage (actor);
xwindow = clutter_x11_get_stage_window ((ClutterStage *)stage);
window = gdk_window_lookup_for_display (display, xwindow);
window = gdk_x11_window_lookup_for_display (display, xwindow);
if (window)
g_object_ref (window);
else
window = gdk_window_foreign_new_for_display (display, xwindow);
window = gdk_x11_window_foreign_new_for_display (display, xwindow);
return window;
}
@ -440,6 +448,7 @@ st_im_text_class_init (StIMTextClass *klass)
object_class->dispose = st_im_text_dispose;
actor_class->paint = st_im_text_paint;
actor_class->get_paint_volume = st_im_text_get_paint_volume;
actor_class->realize = st_im_text_realize;
actor_class->unrealize = st_im_text_unrealize;

View File

@ -1183,9 +1183,7 @@ on_sliced_image_loaded (GObject *source_object,
{
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
clutter_actor_hide (actor);
clutter_container_add_actor (CLUTTER_CONTAINER (data->group), actor);
g_object_unref (list->data);
}
}
@ -1198,6 +1196,17 @@ on_data_destroy (gpointer data)
g_free (d);
}
static void
free_glist_unref_gobjects (gpointer p)
{
GList *list = p;
GList *iter;
for (iter = list; iter; iter = iter->next)
g_object_unref (iter->data);
g_list_free (list);
}
static void
load_sliced_image (GSimpleAsyncResult *result,
GObject *object,
@ -1223,17 +1232,14 @@ load_sliced_image (GSimpleAsyncResult *result,
for (x = 0; x < width; x += data->grid_height)
{
GdkPixbuf *pixbuf = gdk_pixbuf_new_subpixbuf (pix, x, y, data->grid_width, data->grid_height);
if (!pixbuf)
{
g_simple_async_result_set_error (result, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
"Has failed thumbnail");
break;
}
g_assert (pixbuf != NULL);
res = g_list_append (res, pixbuf);
}
}
if (res)
g_simple_async_result_set_op_res_gpointer (result, res, (GDestroyNotify)g_list_free);
/* We don't need the original pixbuf anymore, though the subpixbufs
will hold a reference. */
g_object_unref (pix);
g_simple_async_result_set_op_res_gpointer (result, res, free_glist_unref_gobjects);
}
/**

View File

@ -49,6 +49,22 @@ typedef struct {
guint border_width_2;
} StCornerSpec;
static void
elliptical_arc (cairo_t *cr,
double x_center,
double y_center,
double x_radius,
double y_radius,
double angle1,
double angle2)
{
cairo_save (cr);
cairo_translate (cr, x_center, y_center);
cairo_scale (cr, x_radius, y_radius);
cairo_arc (cr, 0, 0, 1.0, angle1, angle2);
cairo_restore (cr);
}
static CoglHandle
create_corner_material (StCornerSpec *corner)
{
@ -73,13 +89,11 @@ create_corner_material (StCornerSpec *corner)
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_scale (cr, size, size);
/* TODO support nonuniform border widths */
if (corner->border_width_1 < corner->radius)
if (max_border_width <= corner->radius)
{
double internal_radius = 0.5 * (1.0 - (double) corner->border_width_1 / corner->radius);
double x_radius, y_radius;
if (corner->border_width_1 != 0)
if (max_border_width != 0)
{
cairo_set_source_rgba (cr,
corner->border_color_1.red / 255.,
@ -96,14 +110,41 @@ create_corner_material (StCornerSpec *corner)
corner->color.green / 255.,
corner->color.blue / 255.,
corner->color.alpha / 255.);
cairo_arc (cr, 0.5, 0.5, internal_radius, 0, 2 * M_PI);
x_radius = 0.5 * (1.0 - (double) corner->border_width_2 / corner->radius);
y_radius = 0.5 * (1.0 - (double) corner->border_width_1 / corner->radius);
/* TOPRIGHT */
elliptical_arc (cr,
0.5, 0.5,
x_radius, y_radius,
3 * M_PI / 2, 2 * M_PI);
/* BOTTOMRIGHT */
elliptical_arc (cr,
0.5, 0.5,
x_radius, y_radius,
0, M_PI / 2);
/* TOPLEFT */
elliptical_arc (cr,
0.5, 0.5,
x_radius, y_radius,
M_PI, 3 * M_PI / 2);
/* BOTTOMLEFT */
elliptical_arc (cr,
0.5, 0.5,
x_radius, y_radius,
M_PI / 2, M_PI);
cairo_fill (cr);
}
else
{
double radius;
radius = (gdouble)corner->radius / corner->border_width_1;
radius = (gdouble)corner->radius / max_border_width;
cairo_set_source_rgba (cr,
corner->border_color_1.red / 255.,
@ -216,6 +257,41 @@ over (const ClutterColor *source,
unpremultiply (result);
}
static void
st_theme_node_get_corner_border_widths (StThemeNode *node,
StCorner corner_id,
guint *border_width_1,
guint *border_width_2)
{
switch (corner_id)
{
case ST_CORNER_TOPLEFT:
if (border_width_1)
*border_width_1 = node->border_width[ST_SIDE_TOP];
if (border_width_2)
*border_width_2 = node->border_width[ST_SIDE_LEFT];
break;
case ST_CORNER_TOPRIGHT:
if (border_width_1)
*border_width_1 = node->border_width[ST_SIDE_TOP];
if (border_width_2)
*border_width_2 = node->border_width[ST_SIDE_RIGHT];
break;
case ST_CORNER_BOTTOMRIGHT:
if (border_width_1)
*border_width_1 = node->border_width[ST_SIDE_BOTTOM];
if (border_width_2)
*border_width_2 = node->border_width[ST_SIDE_RIGHT];
break;
case ST_CORNER_BOTTOMLEFT:
if (border_width_1)
*border_width_1 = node->border_width[ST_SIDE_BOTTOM];
if (border_width_2)
*border_width_2 = node->border_width[ST_SIDE_LEFT];
break;
}
}
static CoglHandle
st_theme_node_lookup_corner (StThemeNode *node,
StCorner corner_id)
@ -233,30 +309,25 @@ st_theme_node_lookup_corner (StThemeNode *node,
corner.radius = node->border_radius[corner_id];
corner.color = node->background_color;
st_theme_node_get_corner_border_widths (node, corner_id,
&corner.border_width_1,
&corner.border_width_2);
switch (corner_id)
{
case ST_CORNER_TOPLEFT:
corner.border_width_1 = node->border_width[ST_SIDE_TOP];
corner.border_width_2 = node->border_width[ST_SIDE_LEFT];
over (&node->border_color[ST_SIDE_TOP], &corner.color, &corner.border_color_1);
over (&node->border_color[ST_SIDE_LEFT], &corner.color, &corner.border_color_2);
break;
case ST_CORNER_TOPRIGHT:
corner.border_width_1 = node->border_width[ST_SIDE_TOP];
corner.border_width_2 = node->border_width[ST_SIDE_RIGHT];
over (&node->border_color[ST_SIDE_TOP], &corner.color, &corner.border_color_1);
over (&node->border_color[ST_SIDE_RIGHT], &corner.color, &corner.border_color_2);
break;
case ST_CORNER_BOTTOMRIGHT:
corner.border_width_1 = node->border_width[ST_SIDE_BOTTOM];
corner.border_width_2 = node->border_width[ST_SIDE_RIGHT];
over (&node->border_color[ST_SIDE_BOTTOM], &corner.color, &corner.border_color_1);
over (&node->border_color[ST_SIDE_RIGHT], &corner.color, &corner.border_color_2);
break;
case ST_CORNER_BOTTOMLEFT:
corner.border_width_1 = node->border_width[ST_SIDE_BOTTOM];
corner.border_width_2 = node->border_width[ST_SIDE_LEFT];
over (&node->border_color[ST_SIDE_BOTTOM], &corner.color, &corner.border_color_1);
over (&node->border_color[ST_SIDE_LEFT], &corner.color, &corner.border_color_2);
break;
@ -346,28 +417,14 @@ get_background_position (StThemeNode *self,
}
/* Use of this function marks code which doesn't support
* non-uniform widths and/or colors.
* non-uniform colors.
*/
static gboolean
get_arbitrary_border (StThemeNode *node,
int *width,
ClutterColor *color)
static void
get_arbitrary_border_color (StThemeNode *node,
ClutterColor *color)
{
int w;
w = st_theme_node_get_border_width (node, ST_SIDE_TOP);
if (w > 0)
{
if (width)
*width = w;
if (color)
st_theme_node_get_border_color (node, ST_SIDE_TOP, color);
return TRUE;
}
if (width)
*width = 0;
return FALSE;
if (color)
st_theme_node_get_border_color (node, ST_SIDE_TOP, color);
}
static CoglHandle
@ -378,9 +435,8 @@ st_theme_node_render_gradient (StThemeNode *node)
cairo_t *cr;
cairo_surface_t *surface;
cairo_pattern_t *pattern;
gboolean round_border = FALSE;
ClutterColor border_color;
int border_width;
int border_width[4];
guint rowstride;
guchar *data;
@ -393,14 +449,14 @@ st_theme_node_render_gradient (StThemeNode *node)
rowstride);
cr = cairo_create (surface);
/* TODO - support non-uniform border colors and widths */
get_arbitrary_border (node, &border_width, &border_color);
/* TODO - support non-uniform border colors */
get_arbitrary_border_color (node, &border_color);
for (i = 0; i < 4; i++)
{
border_width[i] = st_theme_node_get_border_width (node, i);
radius[i] = st_theme_node_get_border_radius (node, i);
if (radius[i] > 0)
round_border = TRUE;
}
if (node->background_gradient_type == ST_GRADIENT_VERTICAL)
@ -427,43 +483,45 @@ st_theme_node_render_gradient (StThemeNode *node)
node->background_gradient_end.blue / 255.,
node->background_gradient_end.alpha / 255.);
if (round_border)
{
if (radius[ST_CORNER_TOPLEFT] > 0)
cairo_arc (cr,
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT], M_PI, 3 * M_PI / 2);
else
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, node->alloc_width - radius[ST_CORNER_TOPRIGHT], 0);
if (radius[ST_CORNER_TOPRIGHT] > 0)
cairo_arc (cr,
node->alloc_width - radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT], 3 * M_PI / 2, 2 * M_PI);
cairo_line_to (cr, node->alloc_width, node->alloc_height - radius[ST_CORNER_BOTTOMRIGHT]);
if (radius[ST_CORNER_BOTTOMRIGHT])
cairo_arc (cr,
node->alloc_width - radius[ST_CORNER_BOTTOMRIGHT],
node->alloc_height - radius[ST_CORNER_BOTTOMRIGHT],
radius[ST_CORNER_BOTTOMRIGHT], 0, M_PI / 2);
cairo_line_to (cr, radius[ST_CORNER_BOTTOMLEFT], node->alloc_height);
if (radius[ST_CORNER_BOTTOMLEFT])
cairo_arc (cr,
radius[ST_CORNER_BOTTOMLEFT],
node->alloc_height - radius[ST_CORNER_BOTTOMLEFT],
radius[ST_CORNER_BOTTOMLEFT], M_PI / 2, M_PI);
cairo_close_path (cr);
}
/* Create a path for the background's outline first */
if (radius[ST_CORNER_TOPLEFT] > 0)
cairo_arc (cr,
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT], M_PI, 3 * M_PI / 2);
else
cairo_rectangle (cr, 0, 0, node->alloc_width, node->alloc_height);
cairo_move_to (cr, 0, 0);
cairo_line_to (cr, node->alloc_width - radius[ST_CORNER_TOPRIGHT], 0);
if (radius[ST_CORNER_TOPRIGHT] > 0)
cairo_arc (cr,
node->alloc_width - radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT], 3 * M_PI / 2, 2 * M_PI);
cairo_line_to (cr, node->alloc_width, node->alloc_height - radius[ST_CORNER_BOTTOMRIGHT]);
if (radius[ST_CORNER_BOTTOMRIGHT] > 0)
cairo_arc (cr,
node->alloc_width - radius[ST_CORNER_BOTTOMRIGHT],
node->alloc_height - radius[ST_CORNER_BOTTOMRIGHT],
radius[ST_CORNER_BOTTOMRIGHT], 0, M_PI / 2);
cairo_line_to (cr, radius[ST_CORNER_BOTTOMLEFT], node->alloc_height);
if (radius[ST_CORNER_BOTTOMLEFT] > 0)
cairo_arc (cr,
radius[ST_CORNER_BOTTOMLEFT],
node->alloc_height - radius[ST_CORNER_BOTTOMLEFT],
radius[ST_CORNER_BOTTOMLEFT], M_PI / 2, M_PI);
cairo_close_path (cr);
if (border_width > 0)
/* If we have a border, we fill the outline with the border
* color and create the inline shape for the background gradient;
* otherwise the outline shape is filled with the background
* gradient directly
*/
if (border_width[ST_SIDE_TOP] > 0 ||
border_width[ST_SIDE_RIGHT] > 0 ||
border_width[ST_SIDE_BOTTOM] > 0 ||
border_width[ST_SIDE_LEFT] > 0)
{
cairo_path_t *path;
path = cairo_copy_path (cr);
cairo_set_source_rgba (cr,
border_color.red / 255.,
border_color.green / 255.,
@ -471,12 +529,71 @@ st_theme_node_render_gradient (StThemeNode *node)
border_color.alpha / 255.);
cairo_fill (cr);
cairo_translate (cr, border_width, border_width);
cairo_scale (cr,
(gdouble)(node->alloc_width - 2 * border_width) / node->alloc_width,
(gdouble)(node->alloc_height - 2 * border_width) / node->alloc_height);
cairo_append_path (cr, path);
cairo_path_destroy (path);
if (radius[ST_CORNER_TOPLEFT] > MAX(border_width[ST_SIDE_TOP],
border_width[ST_SIDE_LEFT]))
elliptical_arc (cr,
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT],
radius[ST_CORNER_TOPLEFT] - border_width[ST_SIDE_LEFT],
radius[ST_CORNER_TOPLEFT] - border_width[ST_SIDE_TOP],
M_PI, 3 * M_PI / 2);
else
cairo_move_to (cr,
border_width[ST_SIDE_LEFT],
border_width[ST_SIDE_TOP]);
cairo_line_to (cr,
node->alloc_width - MAX(radius[ST_CORNER_TOPRIGHT], border_width[ST_SIDE_RIGHT]),
border_width[ST_SIDE_TOP]);
if (radius[ST_CORNER_TOPRIGHT] > MAX(border_width[ST_SIDE_TOP],
border_width[ST_SIDE_RIGHT]))
elliptical_arc (cr,
node->alloc_width - radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT],
radius[ST_CORNER_TOPRIGHT] - border_width[ST_SIDE_RIGHT],
radius[ST_CORNER_TOPRIGHT] - border_width[ST_SIDE_TOP],
3 * M_PI / 2, 2 * M_PI);
else
cairo_line_to (cr,
node->alloc_width - border_width[ST_SIDE_RIGHT],
border_width[ST_SIDE_TOP]);
cairo_line_to (cr,
node->alloc_width - border_width[ST_SIDE_RIGHT],
node->alloc_height - MAX(radius[ST_CORNER_BOTTOMRIGHT], border_width[ST_SIDE_BOTTOM]));
if (radius[ST_CORNER_BOTTOMRIGHT] > MAX(border_width[ST_SIDE_BOTTOM],
border_width[ST_SIDE_RIGHT]))
elliptical_arc (cr,
node->alloc_width - radius[ST_CORNER_BOTTOMRIGHT],
node->alloc_height - radius[ST_CORNER_BOTTOMRIGHT],
radius[ST_CORNER_BOTTOMRIGHT] - border_width[ST_SIDE_RIGHT],
radius[ST_CORNER_BOTTOMRIGHT] - border_width[ST_SIDE_BOTTOM],
0, M_PI / 2);
else
cairo_line_to (cr,
node->alloc_width - border_width[ST_SIDE_RIGHT],
node->alloc_height - border_width[ST_SIDE_BOTTOM]);
cairo_line_to (cr,
MAX(radius[ST_CORNER_BOTTOMLEFT], border_width[ST_SIDE_LEFT]),
node->alloc_height - border_width[ST_SIDE_BOTTOM]);
if (radius[ST_CORNER_BOTTOMLEFT] > MAX(border_width[ST_SIDE_BOTTOM],
border_width[ST_SIDE_LEFT]))
elliptical_arc (cr,
radius[ST_CORNER_BOTTOMLEFT],
node->alloc_height - radius[ST_CORNER_BOTTOMLEFT],
radius[ST_CORNER_BOTTOMLEFT] - border_width[ST_SIDE_LEFT],
radius[ST_CORNER_BOTTOMLEFT] - border_width[ST_SIDE_BOTTOM],
M_PI / 2, M_PI);
else
cairo_line_to (cr,
border_width[ST_SIDE_LEFT],
node->alloc_height - border_width[ST_SIDE_BOTTOM]);
cairo_close_path (cr);
}
cairo_set_source (cr, pattern);
@ -676,27 +793,40 @@ st_theme_node_paint_borders (StThemeNode *node,
{
float width, height;
int border_width;
int border_width[4];
int max_border_radius = 0;
int max_width_radius[4];
int corner_id;
int corner_id, side_id;
ClutterColor border_color;
guint8 alpha;
width = box->x2 - box->x1;
height = box->y2 - box->y1;
get_arbitrary_border (node, &border_width, &border_color);
/* TODO - support non-uniform border colors */
get_arbitrary_border_color (node, &border_color);
for (side_id = 0; side_id < 4; side_id++)
border_width[side_id] = st_theme_node_get_border_width(node, side_id);
for (corner_id = 0; corner_id < 4; corner_id++)
{
guint border_width_1, border_width_2;
st_theme_node_get_corner_border_widths (node, corner_id,
&border_width_1, &border_width_2);
if (node->border_radius[corner_id] > max_border_radius)
max_border_radius = node->border_radius[corner_id];
max_width_radius[corner_id] = MAX(border_width,
max_width_radius[corner_id] = MAX(MAX(border_width_1, border_width_2),
node->border_radius[corner_id]);
}
/* borders */
if (border_width > 0)
if (border_width[ST_SIDE_TOP] > 0 ||
border_width[ST_SIDE_RIGHT] > 0 ||
border_width[ST_SIDE_BOTTOM] > 0 ||
border_width[ST_SIDE_LEFT] > 0)
{
ClutterColor effective_border;
gboolean skip_corner_1, skip_corner_2;
@ -719,18 +849,19 @@ st_theme_node_paint_borders (StThemeNode *node,
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : 0;
y1 = 0;
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_TOPRIGHT] : width;
y2 = border_width;
y2 = border_width[ST_SIDE_TOP];
cogl_rectangle (x1, y1, x2, y2);
/* EAST */
skip_corner_1 = node->border_radius[ST_CORNER_TOPRIGHT] > 0;
skip_corner_2 = node->border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
x1 = width - border_width;
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT] : border_width;
x1 = width - border_width[ST_SIDE_RIGHT];
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT]
: border_width[ST_SIDE_TOP];
x2 = width;
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMRIGHT]
: height - border_width;
: height - border_width[ST_SIDE_BOTTOM];
cogl_rectangle (x1, y1, x2, y2);
/* SOUTH */
@ -738,7 +869,7 @@ st_theme_node_paint_borders (StThemeNode *node,
skip_corner_2 = node->border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_BOTTOMLEFT] : 0;
y1 = height - border_width;
y1 = height - border_width[ST_SIDE_BOTTOM];
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_BOTTOMRIGHT]
: width;
y2 = height;
@ -749,10 +880,11 @@ st_theme_node_paint_borders (StThemeNode *node,
skip_corner_2 = node->border_radius[ST_CORNER_BOTTOMLEFT] > 0;
x1 = 0;
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : border_width;
x2 = border_width;
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT]
: border_width[ST_SIDE_TOP];
x2 = border_width[ST_SIDE_LEFT];
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMLEFT]
: height - border_width;
: height - border_width[ST_SIDE_BOTTOM];
cogl_rectangle (x1, y1, x2, y2);
}
}
@ -823,82 +955,99 @@ st_theme_node_paint_borders (StThemeNode *node,
switch (corner_id)
{
case ST_CORNER_TOPLEFT:
verts[0] = border_width;
verts[1] = max_width_radius[ST_CORNER_TOPLEFT];
verts[0] = border_width[ST_SIDE_LEFT];
verts[1] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_TOP]);
verts[2] = max_border_radius;
verts[3] = max_border_radius;
if (n_rects == 2)
{
verts[4] = max_width_radius[ST_CORNER_TOPLEFT];
verts[5] = border_width;
verts[4] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_LEFT]);
verts[5] = border_width[ST_SIDE_TOP];
verts[6] = max_border_radius;
verts[7] = max_width_radius[ST_CORNER_TOPLEFT];
verts[7] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_TOP]);
}
break;
case ST_CORNER_TOPRIGHT:
verts[0] = width - max_border_radius;
verts[1] = max_width_radius[ST_CORNER_TOPRIGHT];
verts[2] = width - border_width;
verts[1] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_TOP]);
verts[2] = width - border_width[ST_SIDE_RIGHT];
verts[3] = max_border_radius;
if (n_rects == 2)
{
verts[4] = width - max_border_radius;
verts[5] = border_width;
verts[6] = width - max_width_radius[ST_CORNER_TOPRIGHT];
verts[7] = max_width_radius[ST_CORNER_TOPRIGHT];
verts[5] = border_width[ST_SIDE_TOP];
verts[6] = width - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_RIGHT]);
verts[7] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_TOP]);
}
break;
case ST_CORNER_BOTTOMRIGHT:
verts[0] = width - max_border_radius;
verts[1] = height - max_border_radius;
verts[2] = width - border_width;
verts[3] = height - max_width_radius[ST_CORNER_BOTTOMRIGHT];
verts[2] = width - border_width[ST_SIDE_RIGHT];
verts[3] = height - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_BOTTOM]);
if (n_rects == 2)
{
verts[4] = width - max_border_radius;
verts[5] = height - max_width_radius[ST_CORNER_BOTTOMRIGHT];
verts[6] = width - max_width_radius[ST_CORNER_BOTTOMRIGHT];
verts[7] = height - border_width;
verts[5] = height - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_BOTTOM]);
verts[6] = width - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_RIGHT]);
verts[7] = height - border_width[ST_SIDE_BOTTOM];
}
break;
case ST_CORNER_BOTTOMLEFT:
verts[0] = border_width;
verts[0] = border_width[ST_SIDE_LEFT];
verts[1] = height - max_border_radius;
verts[2] = max_border_radius;
verts[3] = height - max_width_radius[ST_CORNER_BOTTOMLEFT];
verts[3] = height - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_BOTTOM]);
if (n_rects == 2)
{
verts[4] = max_width_radius[ST_CORNER_BOTTOMLEFT];
verts[5] = height - max_width_radius[ST_CORNER_BOTTOMLEFT];
verts[4] = MAX(node->border_radius[corner_id],
border_width[ST_SIDE_LEFT]);
verts[5] = height - MAX(node->border_radius[corner_id],
border_width[ST_SIDE_BOTTOM]);
verts[6] = max_border_radius;
verts[7] = height - border_width;
verts[7] = height - border_width[ST_SIDE_BOTTOM];
}
break;
}
cogl_rectangles (verts, n_rects);
}
if (max_border_radius > border_width)
{
/* Once we've drawn the borders and corners, if the corners are bigger
* the the border width, the remaining area is shaped like
*
* ########
* ##########
* ##########
* ########
*
* We draw it in 3 pieces - first the top and bottom, then the main
* rectangle
*/
cogl_rectangle (max_border_radius, border_width,
width - max_border_radius, max_border_radius);
cogl_rectangle (max_border_radius, height - max_border_radius,
width - max_border_radius, height - border_width);
}
/* Once we've drawn the borders and corners, if the corners are bigger
* then the border width, the remaining area is shaped like
*
* ########
* ##########
* ##########
* ########
*
* We draw it in at most 3 pieces - first the top and bottom if
* necessary, then the main rectangle
*/
if (max_border_radius > border_width[ST_SIDE_TOP])
cogl_rectangle (MAX(max_border_radius, border_width[ST_SIDE_LEFT]),
border_width[ST_SIDE_TOP],
width - MAX(max_border_radius, border_width[ST_SIDE_RIGHT]),
max_border_radius);
if (max_border_radius > border_width[ST_SIDE_BOTTOM])
cogl_rectangle (MAX(max_border_radius, border_width[ST_SIDE_LEFT]),
height - max_border_radius,
width - MAX(max_border_radius, border_width[ST_SIDE_RIGHT]),
height - border_width[ST_SIDE_BOTTOM]);
cogl_rectangle (border_width, MAX(border_width, max_border_radius),
width - border_width, height - MAX(border_width, max_border_radius));
cogl_rectangle (border_width[ST_SIDE_LEFT],
MAX(border_width[ST_SIDE_TOP], max_border_radius),
width - border_width[ST_SIDE_RIGHT],
height - MAX(border_width[ST_SIDE_BOTTOM], max_border_radius));
}
}
@ -1078,8 +1227,6 @@ st_theme_node_paint (StThemeNode *node,
* zero width or a border image is being used.
*
* Deviations from the above as implemented here:
* - Nonuniform border widths combined with a non-zero border radius result
* in the border radius being ignored
* - The combination of border image and a non-zero border radius is
* not supported; the background color will be drawn with square
* corners.

View File

@ -718,7 +718,7 @@ get_length_from_term (StThemeNode *node,
if (term->type != TERM_NUMBER)
{
g_warning ("Ignoring length property that isn't a number");
return FALSE;
return VALUE_NOT_FOUND;
}
num = term->content.num;
@ -859,7 +859,7 @@ get_length_from_term_int (StThemeNode *node,
GetFromTermResult result;
result = get_length_from_term (node, term, use_parent_font, &value);
if (result != VALUE_NOT_FOUND)
if (result == VALUE_FOUND)
*length = (int) (0.5 + value);
return result;
}
@ -1053,7 +1053,7 @@ do_border_property (StThemeNode *node,
StSide side = (StSide)-1;
ClutterColor color;
gboolean color_set = FALSE;
int width;
int width = 0; /* suppress warning */
gboolean width_set = FALSE;
int j;
@ -1098,7 +1098,8 @@ do_border_property (StThemeNode *node,
const char *ident = term->content.str->stryng->str;
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
{
width = 0.;
width = 0;
width_set = TRUE;
continue;
}
else if (strcmp (ident, "solid") == 0)
@ -1185,7 +1186,7 @@ do_outline_property (StThemeNode *node,
const char *property_name = decl->property->stryng->str + 7; /* Skip 'outline' */
ClutterColor color;
gboolean color_set = FALSE;
int width;
int width = 0; /* suppress warning */
gboolean width_set = FALSE;
if (strcmp (property_name, "") == 0)
@ -1202,7 +1203,8 @@ do_outline_property (StThemeNode *node,
const char *ident = term->content.str->stryng->str;
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
{
width = 0.;
width = 0;
width_set = TRUE;
continue;
}
else if (strcmp (ident, "solid") == 0)
@ -1615,9 +1617,16 @@ _st_theme_node_ensure_background (StThemeNode *node)
}
else if (term->type == TERM_URI)
{
CRStyleSheet *base_stylesheet;
if (decl->parent_statement != NULL)
base_stylesheet = decl->parent_statement->parent_sheet;
else
base_stylesheet = NULL;
node->background_image = _st_theme_resolve_url (node->theme,
decl->parent_statement->parent_sheet,
term->content.str->stryng->str);
base_stylesheet,
term->content.str->stryng->str);
}
}
}
@ -1667,9 +1676,16 @@ _st_theme_node_ensure_background (StThemeNode *node)
if (decl->value->type == TERM_URI)
{
CRStyleSheet *base_stylesheet;
if (decl->parent_statement != NULL)
base_stylesheet = decl->parent_statement->parent_sheet;
else
base_stylesheet = NULL;
g_free (node->background_image);
node->background_image = _st_theme_resolve_url (node->theme,
decl->parent_statement->parent_sheet,
base_stylesheet,
decl->value->content.str->stryng->str);
}
else if (term_is_inherit (decl->value))
@ -2234,17 +2250,19 @@ font_variant_from_term (CRTerm *term,
const PangoFontDescription *
st_theme_node_get_font (StThemeNode *node)
{
PangoStyle font_style;
/* Initialized despite _set flags to suppress compiler warnings */
PangoStyle font_style = PANGO_STYLE_NORMAL;
gboolean font_style_set = FALSE;
PangoVariant variant;
PangoVariant variant = PANGO_VARIANT_NORMAL;
gboolean variant_set = FALSE;
PangoWeight weight;
gboolean weight_absolute;
PangoWeight weight = PANGO_WEIGHT_NORMAL;
gboolean weight_absolute = TRUE;
gboolean weight_set = FALSE;
double parent_size;
double size = 0.; /* Suppress warning */
double size = 0.;
gboolean size_set = FALSE;
char *family = NULL;
double parent_size;
int i;
if (node->font_desc)
@ -2451,6 +2469,7 @@ st_theme_node_get_border_image (StThemeNode *node)
if (strcmp (decl->property->stryng->str, "border-image") == 0)
{
CRTerm *term = decl->value;
CRStyleSheet *base_stylesheet;
int borders[4];
int n_borders = 0;
int i;
@ -2525,7 +2544,12 @@ st_theme_node_get_border_image (StThemeNode *node)
break;
}
filename = _st_theme_resolve_url (node->theme, decl->parent_statement->parent_sheet, url);
if (decl->parent_statement != NULL)
base_stylesheet = decl->parent_statement->parent_sheet;
else
base_stylesheet = NULL;
filename = _st_theme_resolve_url (node->theme, base_stylesheet, url);
if (filename == NULL)
goto next_property;

View File

@ -7,6 +7,7 @@
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2009 Abderrahim Kitouni
* Copyright 2009, 2010 Florian Müllner
* Copyright 2010 Adel Gadllah
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU Lesser General Public License,
@ -668,6 +669,31 @@ st_widget_hide (ClutterActor *actor)
CLUTTER_ACTOR_CLASS (st_widget_parent_class)->hide (actor);
}
static gboolean
st_widget_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume)
{
ClutterActorBox paint_box, alloc_box;
StThemeNode *theme_node;
ClutterVertex origin;
/* Setting the paint volume does not make sense when we don't have any allocation */
if (!clutter_actor_has_allocation (self))
return FALSE;
theme_node = st_widget_get_theme_node (ST_WIDGET(self));
clutter_actor_get_allocation_box (self, &alloc_box);
st_theme_node_get_paint_box (theme_node, &alloc_box, &paint_box);
origin.x = paint_box.x1 - alloc_box.x1;
origin.y = paint_box.y1 - alloc_box.y1;
origin.z = 0.0f;
clutter_paint_volume_set_origin (volume, &origin);
clutter_paint_volume_set_width (volume, paint_box.x2 - paint_box.x1);
clutter_paint_volume_set_height (volume, paint_box.y2 - paint_box.y1);
return TRUE;
}
static void
@ -688,6 +714,7 @@ st_widget_class_init (StWidgetClass *klass)
actor_class->get_preferred_height = st_widget_get_preferred_height;
actor_class->allocate = st_widget_allocate;
actor_class->paint = st_widget_paint;
actor_class->get_paint_volume = st_widget_get_paint_volume;
actor_class->parent_set = st_widget_parent_set;
actor_class->map = st_widget_map;
actor_class->unmap = st_widget_unmap;

View File

@ -420,7 +420,7 @@ na_tray_child_force_redraw (NaTrayChild *child)
gtk_widget_get_allocation (widget, &allocation);
xev.xexpose.type = Expose;
xev.xexpose.window = GDK_WINDOW_XWINDOW (plug_window);
xev.xexpose.window = gdk_x11_window_get_xid (plug_window);
xev.xexpose.x = 0;
xev.xexpose.y = 0;
xev.xexpose.width = allocation.width;

View File

@ -27,7 +27,6 @@
#include "na-tray-manager.h"
#include "gtk-compat.h"
#include <gdkconfig.h>
#include <glib/gi18n-lib.h>
#if defined (GDK_WINDOWING_X11)
#include <gdk/gdkx.h>
@ -601,7 +600,7 @@ na_tray_manager_set_orientation_property (NaTrayManager *manager)
SYSTEM_TRAY_ORIENTATION_VERT;
XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
GDK_WINDOW_XWINDOW (window),
gdk_x11_window_get_xid (window),
orientation_atom,
XA_CARDINAL, 32,
PropModeReplace,
@ -646,7 +645,7 @@ na_tray_manager_set_visual_property (NaTrayManager *manager)
data[0] = XVisualIDFromVisual (xvisual);
XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
GDK_WINDOW_XWINDOW (window),
gdk_x11_window_get_xid (window),
visual_atom,
XA_VISUALID, 32,
PropModeReplace,
@ -724,7 +723,7 @@ na_tray_manager_manage_screen_x11 (NaTrayManager *manager,
xev.data.l[0] = timestamp;
xev.data.l[1] = gdk_x11_atom_to_xatom_for_display (display,
manager->selection_atom);
xev.data.l[2] = GDK_WINDOW_XWINDOW (window);
xev.data.l[2] = gdk_x11_window_get_xid (window);
xev.data.l[3] = 0; /* manager specific data */
xev.data.l[4] = 0; /* manager specific data */

View File

@ -4,6 +4,7 @@ EXTRA_DIST = run-test.sh.in
TEST_JS = \
interactive/borders.js \
interactive/border-radius.js \
interactive/border-width.js \
interactive/box-layout.js \
interactive/calendar.js \
interactive/css-fonts.js \
@ -24,8 +25,6 @@ EXTRA_DIST += $(TEST_MISC)
run-test.sh: run-test.sh.in
$(AM_V_GEN) sed \
-e "s|@GJS_JS_DIR[@]|$(GJS_JS_DIR)|" \
-e "s|@GJS_JS_NATIVE_DIR[@]|$(GJS_JS_NATIVE_DIR)|" \
-e "s|@MUTTER_LIB_DIR[@]|$(MUTTER_LIB_DIR)|" \
-e "s|@srcdir[@]|$(srcdir)|" \
$< > $@ && chmod a+x $@

View File

@ -10,15 +10,18 @@ let stage = Clutter.Stage.get_default();
stage.width = 640;
stage.height = 480;
let vbox = new St.BoxLayout({ vertical: true,
width: stage.width,
let vbox = new St.BoxLayout({ width: stage.width,
height: stage.height,
style: 'padding: 10px;'
+ 'spacing: 20px;'
+ 'background: #ffee88;' });
style: 'background: #ffee88;' });
stage.add_actor(vbox);
let scroll = new St.ScrollView();
scroll.add_actor(vbox);
stage.add_actor(scroll);
vbox.add(scroll, { expand: true });
let box = new St.BoxLayout({ vertical: true,
style: 'padding: 10px;'
+ 'spacing: 20px;' });
scroll.add_actor(box);
function addTestCase(radii, useGradient) {
let background;
@ -29,11 +32,11 @@ function addTestCase(radii, useGradient) {
else
background = 'background: white;';
vbox.add(new St.Label({ text: "border-radius: " + radii + ";",
style: 'border: 1px solid black; '
+ 'border-radius: ' + radii + ';'
+ 'padding: 5px;' + background }),
{ x_fill: false });
box.add(new St.Label({ text: "border-radius: " + radii + ";",
style: 'border: 1px solid black; '
+ 'border-radius: ' + radii + ';'
+ 'padding: 5px;' + background }),
{ x_fill: false });
}
// uniform backgrounds

View File

@ -0,0 +1,60 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
const UI = imports.testcommon.ui;
UI.init();
let stage = Clutter.Stage.get_default();
stage.width = 640;
stage.height = 480;
let vbox = new St.BoxLayout({ width: stage.width,
height: stage.height,
style: 'padding: 10px; background: #ffee88;'
});
stage.add_actor(vbox);
let scroll = new St.ScrollView();
vbox.add(scroll, { expand: true });
let box = new St.BoxLayout({ vertical: true,
style: 'spacing: 20px;' });
scroll.add_actor(box);
function addTestCase(borders, useGradient) {
let background;
if (useGradient)
background = 'background-gradient-direction: vertical;'
+ 'background-gradient-start: white;'
+ 'background-gradient-end: gray;';
else
background = 'background: white;';
let border_style = "border-top: " + borders[St.Side.TOP] + " solid black;\n" +
"border-right: " + borders[St.Side.RIGHT] + " solid black;\n" +
"border-bottom: " + borders[St.Side.BOTTOM] + " solid black;\n" +
"border-left: " + borders[St.Side.LEFT] + " solid black;";
box.add(new St.Label({ text: border_style,
style: border_style
+ 'border-radius: 0px 5px 15px 25px;'
+ 'padding: 5px;' + background }),
{ x_fill: false });
}
// uniform backgrounds
addTestCase([" 0px", " 5px", "10px", "15px"], false);
addTestCase([" 5px", "10px", "15px", " 0px"], false);
addTestCase(["10px", "15px", " 0px", " 5px"], false);
addTestCase(["15px", " 0px", " 5px", "10px"], false);
// gradient backgrounds
addTestCase([" 0px", " 5px", "10px", "15px"], true);
addTestCase([" 5px", "10px", "15px", " 0px"], true);
addTestCase(["10px", "15px", " 0px", " 5px"], true);
addTestCase(["15px", " 0px", " 5px", "10px"], true);
stage.show();
Clutter.main();
stage.destroy();

View File

@ -10,63 +10,66 @@ let stage = Clutter.Stage.get_default();
stage.width = 640;
stage.height = 480;
let vbox = new St.BoxLayout({ vertical: true,
width: stage.width,
let vbox = new St.BoxLayout({ width: stage.width,
height: stage.height,
style: 'padding: 10px;'
+ 'spacing: 20px;'
+ 'background: #ffee88;' });
style: 'background: #ffee88;' });
stage.add_actor(vbox);
let scroll = new St.ScrollView();
scroll.add_actor(vbox);
stage.add_actor(scroll);
vbox.add(scroll, { expand: true });
vbox.add(new St.Label({ text: "Hello World",
style: 'border: 1px solid black; '
+ 'padding: 5px;' }));
let box = new St.BoxLayout({ vertical: true,
style: 'padding: 10px;'
+ 'spacing: 20px;' });
scroll.add_actor(box);
vbox.add(new St.Label({ text: "Hello Round World",
style: 'border: 3px solid green; '
+ 'border-radius: 8px; '
+ 'padding: 5px;' }));
box.add(new St.Label({ text: "Hello World",
style: 'border: 1px solid black; '
+ 'padding: 5px;' }));
vbox.add(new St.Label({ text: "Hello Background",
style: 'border: 3px solid green; '
+ 'border-radius: 8px; '
+ 'background: white; '
+ 'padding: 5px;' }));
box.add(new St.Label({ text: "Hello Round World",
style: 'border: 3px solid green; '
+ 'border-radius: 8px; '
+ 'padding: 5px;' }));
vbox.add(new St.Label({ text: "Hello Translucent Black Border",
style: 'border: 3px solid rgba(0, 0, 0, 0.4); '
+ 'background: white; ' }));
vbox.add(new St.Label({ text: "Hello Translucent Background",
style: 'background: rgba(255, 255, 255, 0.3);' }));
box.add(new St.Label({ text: "Hello Background",
style: 'border: 3px solid green; '
+ 'border-radius: 8px; '
+ 'background: white; '
+ 'padding: 5px;' }));
vbox.add(new St.Label({ text: "Border, Padding, Content: 20px" }));
box.add(new St.Label({ text: "Hello Translucent Black Border",
style: 'border: 3px solid rgba(0, 0, 0, 0.4); '
+ 'background: white; ' }));
box.add(new St.Label({ text: "Hello Translucent Background",
style: 'background: rgba(255, 255, 255, 0.3);' }));
box.add(new St.Label({ text: "Border, Padding, Content: 20px" }));
let b1 = new St.BoxLayout({ vertical: true,
style: 'border: 20px solid black; '
+ 'background: white; '
+ 'padding: 20px;' });
vbox.add(b1);
box.add(b1);
b1.add(new St.BoxLayout({ width: 20, height: 20,
style: 'background: black' }));
vbox.add(new St.Label({ text: "Translucent big blue border, with rounding",
style: 'border: 20px solid rgba(0, 0, 255, 0.2); '
+ 'border-radius: 10px; '
+ 'background: white; '
+ 'padding: 10px;' }));
box.add(new St.Label({ text: "Translucent big blue border, with rounding",
style: 'border: 20px solid rgba(0, 0, 255, 0.2); '
+ 'border-radius: 10px; '
+ 'background: white; '
+ 'padding: 10px;' }));
vbox.add(new St.Label({ text: "Transparent border",
style: 'border: 20px solid transparent; '
+ 'background: white; '
+ 'padding: 10px;' }));
box.add(new St.Label({ text: "Transparent border",
style: 'border: 20px solid transparent; '
+ 'background: white; '
+ 'padding: 10px;' }));
vbox.add(new St.Label({ text: "Border Image",
style_class: "border-image",
style: "padding: 10px;" }));
box.add(new St.Label({ text: "Border Image",
style_class: "border-image",
style: "padding: 10px;" }));
stage.show();
Clutter.main();

View File

@ -31,17 +31,13 @@ srcdir=$builddir/@srcdir@
srcdir=`cd $srcdir && pwd`
GI_TYPELIB_PATH="@MUTTER_LIB_DIR@/mutter:$builddir/../src"
GJS_PATH="$srcdir:$srcdir/../js"
GJS_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
GNOME_SHELL_TESTSDIR="$srcdir/"
export GI_TYPELIB_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD
run_js_test_args=
for i in $srcdir $srcdir/../js @GJS_JS_DIR@ @GJS_JS_NATIVE_DIR@ ; do
run_js_test_args="$run_js_test_args -I $i"
done
export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD
for test in $tests ; do
$debug $builddir/../src/run-js-test $run_js_test_args $test || exit $?
$debug $builddir/../src/run-js-test $test || exit $?
done

View File

@ -62,7 +62,7 @@ fi
# libxklavier, libxml2, ORBit2, pam, python, readline,
# spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification,
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
# libgcrypt, libtasn1
# libgcrypt, libtasn1, libgnome-keyring
#
# Non-devel packages needed by gnome-shell and its deps:
# glxinfo, gstreamer-plugins-base, gstreamer-plugins-good,
@ -82,7 +82,7 @@ if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
xulrunner-dev xserver-xephyr gnome-terminal libcroco3-dev
libgstreamer0.10-dev gstreamer0.10-plugins-base gstreamer0.10-plugins-good
libltdl-dev libvorbis-dev libxklavier-dev
libltdl-dev libvorbis-dev libxklavier-dev libgnome-keyring-dev libupower-glib-dev
"
if apt-cache show autopoint > /dev/null 2> /dev/null; then
@ -120,6 +120,7 @@ if test "x$system" = xFedora ; then
startup-notification-devel xorg-x11-server-Xephyr gnome-terminal zenity
icon-naming-utils upower-devel libtool-ltdl-devel libvorbis-devel
libxklavier-devel libgcrypt-devel libtasn1-devel libtasn1-tools
libgnome-keyring-devel
"
if expr $version \>= 14 > /dev/null ; then

View File

@ -25,10 +25,10 @@
<branch repo="git.gnome.org" module="glib"/>
</autotools>
<tarball id="vala" version="0.9.7" autogenargs="--enable-vapigen">
<source href="http://ftp.gnome.org/pub/GNOME/sources/vala/0.9/vala-0.9.7.tar.bz2"
hash="sha256:4a09219fc1abb960c17b4f7704332a4dd1edc21216520a3e5deeaac44cc6b4a7"
md5sum="3062fe00c0f5b8f40cd2a94ff9bbe2da" size="2394250"/>
<tarball id="vala" version="0.11.2" autogenargs="--enable-vapigen">
<source href="http://ftp.gnome.org/pub/GNOME/sources/vala/0.11/vala-0.11.2.tar.bz2"
hash="sha256:489b60a49a03c8915b513a722ca08986c18ae0dc6489cce6bbb8415670612046"
md5sum="ef0b6dc4a5fe4caa57e0d029bb9ea8dd" size="2839460"/>
<dependencies>
<dep package="glib"/>
</dependencies>
@ -150,6 +150,7 @@
<dep package="clutter"/>
<dep package="gconf"/>
<dep package="gtk3"/>
<dep package="libcanberra"/>
</dependencies>
</autotools>
@ -191,35 +192,6 @@
</dependencies>
</autotools>
<autotools id="gnome-keyring">
<branch repo="git.gnome.org" module="gnome-keyring"/>
<dependencies>
<dep package="glib"/>
</dependencies>
</autotools>
<autotools id="libnotify">
<branch repo="git.gnome.org" module="libnotify"/>
<dependencies>
<dep package="gtk3"/>
</dependencies>
</autotools>
<autotools id="libgnomekbd">
<branch repo="git.gnome.org" module="libgnomekbd"/>
<dependencies>
<dep package="gtk3"/>
</dependencies>
</autotools>
<autotools id="gnome-settings-daemon">
<branch repo="git.gnome.org" module="gnome-settings-daemon"/>
<dependencies>
<dep package="libnotify"/>
<dep package="gnome-desktop-3"/>
</dependencies>
</autotools>
<autotools id="gnome-control-center">
<branch repo="git.gnome.org" module="gnome-control-center"/>
<dependencies>
@ -238,7 +210,6 @@
<dep package="gconf"/>
<dep package="cairo"/>
<dep package="libnotify"/>
<dep package="gnome-keyring"/>
<dep package="libcanberra"/>
<dep package="gnome-control-center"/>
</dependencies>
@ -259,6 +230,7 @@
<dep package="gnome-icon-theme-symbolic"/>
<dep package="libcanberra"/>
<dep package="gnome-settings-daemon"/>
<dep package="gnome-bluetooth"/>
</dependencies>
</autotools>
@ -280,6 +252,15 @@
</dependencies>
</metamodule>
<autotools id="gnome-bluetooth" autogenargs="--disable-nautilus-sendto">
<branch repo="git.gnome.org" module="gnome-bluetooth" />
<dependencies>
<dep package="gobject-introspection"/>
<dep package="gnome-control-center"/>
<dep package="libnotify"/>
</dependencies>
</autotools>
<tarball id="polkit" version="0.99">
<source href="http://hal.freedesktop.org/releases/polkit-0.99.tar.gz"
hash="sha256:f612c7c26ec822f67751420057a4ae113fc50ab51070758faacf2ad30bb3583f"