Compare commits

...

119 Commits

Author SHA1 Message Date
Owen W. Taylor
eb2ee3f259 Bump version to 2.91.3 2010-11-29 17:58:04 -05:00
Florian Müllner
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
Florian Müllner
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
Dan Winship
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
William Jon McCann
c9b178b193 Touch up padding again this time with the correct box 2010-11-29 14:03:07 -05:00
Marina Zhurakhinskaya
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
William Jon McCann
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
Fran Diéguez
063fc8e29c Updated Galician translations 2010-11-29 17:33:20 +01:00
Owen W. Taylor
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
Owen W. Taylor
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
Adel Gadllah
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
Dan Winship
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
1a77acfda6 Fake workspaces tab
https://bugzilla.gnome.org/show_bug.cgi?id=634948
2010-11-29 16:35:53 +01:00
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Florian Müllner
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
Fran Diéguez
dc24252e82 Updated Galician translations 2010-11-27 01:43:13 +01:00
Gheyret T.Kenji
2167be053d Added UG translation 2010-11-26 14:28:16 +01:00
Giovanni Campagna
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
Florian Müllner
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
Nick Glynn
6e902f5fec Add development packages needed to build on Ubuntu 2010-11-25 01:18:06 +01:00
Florian Müllner
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
Dan Winship
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
Maxim Ermilov
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
Maxim Ermilov
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
Sira Nokyoongtong
3d468c26b0 Updated Thai translation. 2010-11-23 10:26:22 +07:00
Adel Gadllah
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
Giovanni Campagna
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
Owen W. Taylor
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
Owen W. Taylor
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
Kjartan Maraas
71685a3b48 Fix this up 2010-11-20 14:40:40 +01:00
Kjartan Maraas
c0b9ce16a7 Updated Norwegian bokmål translation 2010-11-20 14:40:33 +01:00
Gheyret T.Kenji
d1407d0026 Added UG translation 2010-11-20 11:47:22 +01:00
Giovanni Campagna
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
Giovanni Campagna
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
Giovanni Campagna
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
Bastien Nocera
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
Dan Winship
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
Dan Winship
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
Bastien Nocera
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
Florian Müllner
be6e189b49 dnd: Hide drag actor from pick
Instead of hiding the drag actor temporarily to determine the actor
beneath it, make it invisible to picks while dragging using the new
shell_util_set_hidden_from_pick().

https://bugzilla.gnome.org/show_bug.cgi?id=634560
2010-11-18 20:27:55 +01:00
Florian Müllner
1c8955b34a shell-util: Add helper to hide actors from pick
At times it is desireable to hide actors from being picked even
with a mode of CLUTTER_PICK_ALL.

Currently we use a pattern of
    clutter_actor_hide();
    clutter_stage_get_actor_at_pos();
    clutter_actor_show();
in these cases, which gets hideous if the actor we want to exclude
from the pick is located in another module.

A more elegant solution is to connect a handler to the ::pick signal,
which stops further emission.

Credit for the idea goes to Owen Taylor.

https://bugzilla.gnome.org/show_bug.cgi?id=634560
2010-11-18 20:27:55 +01:00
Owen W. Taylor
e5a802bf99 Use the new "background actor" functionality in Mutter
The code to draw the root background has now been moved into Mutter,
with added smarts to not draw obscured portions. Remove the old
version of the code and clone the Mutter background actor to draw
the background in the overview.

https://bugzilla.gnome.org/show_bug.cgi?id=634836
2010-11-18 14:03:37 -05:00
Owen W. Taylor
55f290bc96 Disable clearing the color buffer
Since we always cover the stage, we don't need to clear it to a
constant color before painting the scene.

https://bugzilla.gnome.org/show_bug.cgi?id=634769
2010-11-18 14:03:37 -05:00
Owen W. Taylor
909f2e670a ShellTrayManager: fix icon actor memory management
We weren't actually referencing the ShellTrayIcon actors at all
on creation, but would unreference them when they were removed,
causing crashes.

When we reference the actors, use g_object_ref_sink() so that
memory management is consistent whether or not the actors are
subsequently added to a parent actor.

Thanks for Jon McCann for help in tracking this down.

https://bugzilla.gnome.org/show_bug.cgi?id=635141
2010-11-18 13:52:35 -05:00
Adel Gadllah
fa44289dd0 [PowerIcon] Fix percent label to be in sync with the description 2010-11-17 22:58:00 +01:00
Florian Müllner
deb7e7317e power-status: Remove tooltip
Status icons should not have tooltips according to the design.
2010-11-17 20:38:02 +01:00
Dan Winship
5f1a2e3cec gnome-shell-build-setup.sh: add more deps for gnome-keyring 2010-11-17 09:44:46 -05:00
Giovanni Campagna
8b3f05b6e3 Status area: introduce battery & power indicator
Add an indicator for battery charge and power indication in the
system status area, using the newly exported DBus API from
gnome-power-manager.

https://bugzilla.gnome.org/show_bug.cgi?id=622451
2010-11-17 14:52:39 +01:00
Giovanni Campagna
21ac225981 StIcon: add support for GIcon
Add a "gicon" property so that a GIcon can be used instead of an
icon name, while still getting icon recoloring from the theme.
Also include a compatibility wrapper in libshell until GJS has
support for interface static methods.

https://bugzilla.gnome.org/show_bug.cgi?id=622451
2010-11-16 22:11:27 +01:00
Giovanni Campagna
0c5d87d79b PopupMenu: allow insertion of items at any point
Add a "position" argument to addMenuItem, and pass it to the
underlying box layout. If undefined or null, it adds at the end.
2010-11-16 20:42:53 +01:00
Dan Winship
c224e019fe telepathyClient: add a missing "new" 2010-11-16 14:08:52 -05:00
Giovanni Campagna
aa91491730 StTooltip: Rework to use StLabel
Replaces the internal ClutterText with StLabel, so full CSS
styling is supported.

https://bugzilla.gnome.org/show_bug.cgi?id=622450
2010-11-16 19:22:01 +01:00
Florian Müllner
7bc77a23b4 build: Add libnotify to module set
libnotify is required by gnome-settings-daemon.
2010-11-16 15:33:56 +01:00
Owen W. Taylor
b8a5d3fd9b Handle new name for gnome-volume-control-applet
gnome-volume-control-applet was renamed to gnome-sound-applet when
moved to the control-center module, so we need to check for both names
when identifying the legacy status icon.
2010-11-15 18:45:36 -05:00
Owen W. Taylor
8734a59cd7 Handle icon theme changes
Connect to the "changed" signal on the default icon theme, and
when it triggers:

 - Evict all cached looked up icons from the StTextureCache
 - Fake a style change on all StThemeContext; this will result
   in StIcon looking up icons again.

https://bugzilla.gnome.org/show_bug.cgi?id=633866
2010-11-15 18:45:36 -05:00
Colin Walters
e90504953f gnome-shell: When creating an extension, print where we created it
This makes it easier to find.
2010-11-15 18:43:15 -05:00
Lucian Adrian Grijincu
d67aa39bb1 Updated Romanian translation 2010-11-15 23:36:41 +02:00
Lucian Adrian Grijincu
1dc559740f Updated Romanian translation 2010-11-15 22:22:14 +02:00
Daniel Șerbănescu
a3e3d61d58 Updated Romanian translation 2010-11-15 22:22:03 +02:00
Jasper St. Pierre
f6e9ae35fd gnome-shell-build-setup.sh: Conditionally check for autopoint on Debian/Ubuntu.
autopoint was split out into its own package in Debian lenny and thus Ubuntu 10.10

https://bugzilla.gnome.org/show_bug.cgi?id=632824
2010-11-15 08:49:06 -05:00
Owen Taylor
3c33cf425e gnome-shell-build-setup.sh: add libxklavier-devel & expat-devel to deps
Add to deps for Fedora and Debian:

 expat: needed by polkit
 libxklavier-devel: need by libgnomekbd

Based on a patch by Kiyoshi Aman <kiyoshi.aman@gmail.com>.

https://bugzilla.gnome.org/show_bug.cgi?id=634865
2010-11-14 19:31:21 -05:00
Giovanni Campagna
141b4ffe87 StFocusManager: don't unref removed groups
It is not referencing them when adding, and also it is connecting
to the "destroy" signal, emitted on dispose, so there is no risk
of storing finalized objects.

https://bugzilla.gnome.org/show_bug.cgi?id=634781
2010-11-14 20:51:27 +01:00
Gheyret T.Kenji
35d8780186 Added UG translation 2010-11-14 00:05:37 +01:00
Gheyret T.Kenji
d11ea7d6cd Added UG translation 2010-11-13 22:26:32 +01:00
Owen W. Taylor
3138b20b11 Skip drawing transparent borders and backgrounds
We were always drawing the border and background of each
StThemeNode, even if they were transparent. The simple
optimization of checking the alpha provides a significant
performance boost (in a quick test, it increased the
overviewFpsSubsequent metric in the core performance test
from 28fps to 35fps).

https://bugzilla.gnome.org/show_bug.cgi?id=634752
2010-11-13 10:12:40 -05:00
William Jon McCann
c3fb3a98b8 Remove invisible status from menu
It was decided at GNOME Summit that we would remove the invisible
setting until we have a better story for how it works with chat
and other sharing/messaging applications.  We'd also need to
figure out how it relates to busy.
2010-11-13 09:30:16 -05:00
William Jon McCann
32cc136563 Remove Restart option from session menu
The action is far less common than powering off.  It is mostly
used for performing system updates so the update tool should
offer the option directly.  Also, currently the Shut Down option
dialog offers Restart anyway.  We would like to keep the number
of entries in this menu as limited (close to 7) as we can.
2010-11-13 08:43:45 -05:00
William Jon McCann
63e89482fe Use Settings and not Preferences for sound menu
To match the tool that it launches.
2010-11-13 08:43:45 -05:00
Rico Tzschichholz
e8917e2d6f Fix build of run-js-test
https://bugzilla.gnome.org/show_bug.cgi?id=634736

Signed-off-by: Adel Gadllah <adel.gadllah@gmail.com>
2010-11-13 10:26:48 +01:00
Dan Winship
a2f4e196a1 Icon test case fixes
put a border around the "16px icon in 48px icon widget" test, to
verify that the icon is being centered correctly

add spacing and fix alignment for general prettiness

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 22:28:22 -05:00
Owen W. Taylor
dc1e23501c Remove _for_theme() variant of st_texture_cache_load_icon_name()
Now that we're using St.Icon in the Javascript, there is no reason
to have separate st_texture_cache_load_icon_name() and
st_texture_cache_load_icon_name_for_theme(), instead just add
the StThemeNode argument to st_texture_cache_load_icon_name().

https://bugzilla.gnome.org/show_bug.cgi?id=633866
2010-11-12 17:36:26 -05:00
Owen W. Taylor
0e3431ac47 Use St.Icon for named icons
Switch from St.TextureCache.load_named_icon() to using St.Icon for named
icons. Along with the advantage of getting colorization right for symbolic
icons, this allows moving some icon sizes into the CSS.

In the CSS, the system status icon size is changed to be 1em (=16px for the
default font size), at the request of the artists. See bug 613448.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:26 -05:00
Owen W. Taylor
af7ba00e97 StIcon: pass in the StThemeNode to get colorized symbolic icons
Use st_texture_cache_load_icon_name_for_theme() so that we get the
right colors for symbolic icons. The code refactoring to achieve this
also avoids constantly starting a new icon load each time we set
a property on initialization ... the icon is loaded only after we
have a #StThemeNode assigned.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:26 -05:00
Owen W. Taylor
8d6ab6fe84 Add st_widget_peek_theme_node()
Sometimes it's useful to get the theme node if there is one and do
nothing and wait for the ::style-changed signal if there is no theme
node. Add st_widget_peek_theme_node() that just gets the current
theme node if available. The caller must handle a %NULL return.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:26 -05:00
Owen W. Taylor
4917c79d09 StTextureCache: support loading a named icon with colors from a theme node
Add st_texture_cache_load_icon_name_for_theme() which, when loading a
symbolic icon, gets a #StIconColors from the theme node and uses that
to colorize the icon.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:26 -05:00
Owen W. Taylor
04da2a61db Add StIconColors object, compute in StThemeNode
A new StIconColors object is used to efficiently track the colors
we need to colorize a symbolic icon.
st_theme_node_compute_icon_colors() is added to compute the
StIconColors for a theme node. (Refcounting of StIconColors means
that we'll typically share the colors object of the parent node.)

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:26 -05:00
Owen W. Taylor
3ca86b2197 StIcon: Center the icon rather than scaling it up
Scaling up icons from the loaded size to a larger size is uniformly
ugly and results in a long series of "fuzzy icon" bugs. It's better
to just load at the specified size and center. (Centering can be
overridden by packing not-fill in the parent container.)

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
35400238aa StIcon: Always request a square icon size
We don't want the layout to change when we say, change from
battery-full to battery-full-charging, so we should request a square
based on the icon size unconditionally and not try to adapt to the
size of the texture we loaded. This also means that our layout is
independent of the loaded texure which, if we switch away from
using a ClutterActor child will allow us not queue a relayout when
the icon finishes loading.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
439d7f036f Port StIcon from MX framework to St framework
Make StIcon compile and work in St.

Changes:

 * ::icon-type and st_icon_set_icon_type are added to allow
   specifying SYMBOLIC/FULLCOLOR for an icon.
 * Ability to set the icon name from the theme is removed; it
   wouldn't easily fit into our framework and two levels of
   abstraction between code and image doesn't seem that useful.
 * size CSS property is renamed from x-st-icon-size to icon-size
   to correspond to what we are doing elsewhere.
 * CSS and property based icon sizing are cleanly layered - if
   you set the icon-size property, the CSS size is ignored.
 * Add a simple JS test of StIcon.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
aed6375a2d Move StIconType to st-types.h from st-texture-cache.h
StIconType will be used by a new StIcon class, so move it to the
header file of common enumerations. Including st-types.h which had
the St single-include check revealed that st-texture-cache.h didn't
have that check and several places were including that directly.
Fix that up.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
a9a8b1ec6a StIcon: Remove content-image capability
The ability to set a "content image" on an icon relies on the ability
to have custom theme properties of a "border image" (9-slice) type.
We don't have this, and the capability of a bordered image specified
by the theme can be achieved more naturally with standard CSS facilities.

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
b0e713b775 StIcon: use g_strcmp0()
Simplify a check for an unchanged string with g_strcmp0().

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
32fc25a3ac StIcon: Adopt copyright notice to standard
- Replace FSF address with URL
- Remove explicit Authors: list

https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
839492f15b Import MxIcon as StIcon
https://bugzilla.gnome.org/show_bug.cgi?id=633865
2010-11-12 17:36:25 -05:00
Owen W. Taylor
c98103ffc8 Add run-js-test executable to run tests
ST makes use of GTK+ for input methods and for icon themes; therefore
we have need to initialize GTK+ in order to test these parts of Clutter.

Instead of LD_PRELOADING our module, use a separately compiled executable
that links to the UI components in GNOME Shell, initializes Clutter and
GTK+ and hooks them together.

Getting all the symbols from St and the GUI components exported for
use via GJS requires a bit of contortion: we need to actually link the
St convenience library into a shared library and link the executable
to that since there is no way with libtool to take a convenience library
and put all its symbols into an executable --whole-archive style.

https://bugzilla.gnome.org/show_bug.cgi?id=633657
2010-11-12 17:36:20 -05:00
Owen W. Taylor
86f3a637f1 st_texture_cache_load_from_raw: Don't pointlessly include size in cache key
The texture is independent of the size that the user passed in; so there
is no obvious reason to include the texture in the cache key.

https://bugzilla.gnome.org/show_bug.cgi?id=633595
2010-11-12 17:34:16 -05:00
Florian Müllner
e381f0f492 build-setup: Add missing build-dependency
polkit requires pam-devel to build. Add the package to the list
of dependencies in the setup script.
2010-11-12 21:35:07 +01:00
Owen W. Taylor
ce72aaf008 Fix up copyright and license notices for St
* Make sure all source files have a LGPL copyright header, and standardize
  non-standard variations of the header to a common form.

* Check and update all copyright notices.

* Remove 'Written By:' lines. They are universally incomplete and
  typically indicate only who started a particular file.

https://bugzilla.gnome.org/show_bug.cgi?id=634550
2010-11-12 15:23:28 -05:00
Giovanni Campagna
d79cae07a4 Depend on master gnome-settings-daemon
The new Universal Access menu uses GSettings schema from master
g-s-d. Ensure that these are installed, or we crash.

https://bugzilla.gnome.org/show_bug.cgi?id=634693
2010-11-12 20:26:20 +01:00
Florian Müllner
b2495a0e25 a11y-status: Fix left over GConf usage
Commit f0c6e96e82 updated the "Large Text" action to use a GSettings
key, but left some code accessing the setting via GConf.

https://bugzilla.gnome.org/show_bug.cgi?id=634693
2010-11-12 19:43:52 +01:00
Giovanni Campagna
f0c6e96e82 Status area: update accessibility menu
gnome-settings-daemon has moved to GSettings for most settings, we
should adapt as well. The only remaining GConf key is for metacity
(visual bell).

https://bugzilla.gnome.org/show_bug.cgi?id=634693
2010-11-12 18:44:52 +01:00
Giovanni Campagna
ac1b814851 Revert "Transition the ShellApp state when ready."
This reverts commit c171ea12df.
2010-11-12 18:41:54 +01:00
Giovanni Campagna
614bcd8016 Update volume indicator labels
It turns out 'Output' and 'Input' are too technical for the novice
user. Use 'Volume' and 'Microphone' instead.

https://bugzilla.gnome.org/show_bug.cgi?id=634329
2010-11-12 17:47:19 +01:00
Giovanni Campagna
c171ea12df Transition the ShellApp state when ready.
shell_app_state_transition emits a signal, so invoke it only when
ready, or signal handlers will see an object which is in an invalid
state.

https://bugzilla.gnome.org/show_bug.cgi?id=632501
2010-11-12 17:43:05 +01:00
Owen W. Taylor
b856e2990b StScrollView: null out the right variable in dispose
We weren't properly nulling out the vadjustment variable in dispose()
which meant in the case of explicit-destroy followed some time later
by garbage collection and disposing the actor again we would crash.
2010-11-11 08:41:07 -05:00
Owen W. Taylor
e4cf3f144d Mark gsettings-desktop-schemas as a dependency of gnome-desktop-3
gsettings-desktop-schemas is required by, so needs to be built before
gnome-desktop-3.

https://bugzilla.gnome.org/show_bug.cgi?id=634552
2010-11-11 08:41:06 -05:00
Owen W. Taylor
f25e6916bd Remove unused StSubtexture 2010-11-10 22:00:11 -05:00
Florian Müllner
ad624d546f st-texture-cache: Fix include
The file gnome-desktop-thumbnail.h was moved from libgnomeui to
libgnome-desktop.

https://bugzilla.gnome.org/show_bug.cgi?id=634555
2010-11-11 01:42:30 +01:00
Maxim Ermilov
6df21fd5ff never fall back to the window title as application name
https://bugzilla.gnome.org/show_bug.cgi?id=624935
2010-11-10 01:32:55 +03:00
Owen W. Taylor
392999bc43 Make opening and closing LookingGlass slow-down independent
Waiting for LookingGlass to close after calling St.set_slow_down_factor()
is annoying so divide the time for opening and closing by the slow-down
factor.
2010-11-09 14:39:36 -05:00
133 changed files with 7801 additions and 5059 deletions

1
.gitignore vendored
View File

@@ -46,6 +46,7 @@ src/Makefile.in
src/gnomeshell-taskpanel
src/gnome-shell
src/gnome-shell-clock-preferences
src/run-js-test
src/test-recorder
src/test-recorder.ogg
src/test-theme

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.3],[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,7 +57,7 @@ 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
@@ -93,6 +93,8 @@ 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)
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`
@@ -101,11 +103,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)

View File

@@ -25,6 +25,7 @@ dist_theme_DATA = \
theme/close-window.svg \
theme/close.svg \
theme/corner-ripple.png \
theme/dash-placeholder.svg \
theme/dialog-error.svg \
theme/gnome-shell.css \
theme/mosaic-view-active.svg \
@@ -32,6 +33,7 @@ dist_theme_DATA = \
theme/move-window-on-new.svg \
theme/process-working.png \
theme/remove-workspace.svg \
theme/running-indicator.svg \
theme/scroll-button-down-hover.png \
theme/scroll-button-down.png \
theme/scroll-button-up-hover.png \

View File

@@ -41,18 +41,6 @@
<default>[]</default>
<_summary>History for command (Alt-F2) dialog</_summary>
</key>
<key name="workspaces-view" type="s">
<default>'single'</default>
<_summary>Overview workspace view mode</_summary>
<_description>
The selected workspace view mode in the overview.
Supported values are "single" and "grid".
</_description>
<choices>
<choice value="single"/>
<choice value="grid"/>
</choices>
</key>
<child name="clock" schema="org.gnome.shell.clock"/>
<child name="calendar" schema="org.gnome.shell.calendar"/>
<child name="recorder" schema="org.gnome.shell.recorder"/>

View File

@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="76"
height="27"
id="svg11252"
version="1.1">
<defs
id="defs11254">
<radialGradient
xlink:href="#linearGradient39563-4-2"
id="radialGradient68155-2-3"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1,0,0,0.3486842,0,317.8421)"
cx="49"
cy="488"
fx="49"
fy="488"
r="38" />
<linearGradient
id="linearGradient39563-4-2">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop39565-1-4" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop39567-7-9" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient39573-6-1"
id="radialGradient68157-0-8"
gradientUnits="userSpaceOnUse"
cx="50.5"
cy="487.5"
fx="50.5"
fy="487.5"
r="10.5" />
<linearGradient
id="linearGradient39573-6-1">
<stop
style="stop-color:#ffffff;stop-opacity:1;"
offset="0"
id="stop39575-5-6" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop39577-1-2" />
</linearGradient>
</defs>
<g
id="layer1"
transform="translate(-337,-518.86218)">
<g
id="g99967"
style="display:inline"
transform="translate(326,44.862171)">
<rect
style="opacity:0.49375;color:#000000;fill:url(#radialGradient68155-2-3);fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect99969"
width="76"
height="2"
x="11"
y="487"
rx="0"
ry="0" />
<path
style="opacity:0.43125;color:#000000;fill:url(#radialGradient68157-0-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="path99971"
d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
transform="matrix(1.2857143,0,0,1.2857143,-14.428572,-139.28571)" />
<path
transform="matrix(0.43589747,0,0,0.43589747,28.487179,275)"
d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
id="path99973"
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -92,12 +92,15 @@ StScrollBar StButton#vhandle:hover
background-color: #292929;
}
StTooltip {
border: 1px solid rgba(79,111,173,0.9);
StTooltip StLabel {
border: 1px solid rgba(79,111,173,1);
border-radius: 5px;
padding: 4px;
background-color: rgba(79,111,173,0.9);
color: #ffffff;
font-size: 0.8em;
font-weight: normal;
text-align: center;
}
/* PopupMenu */
@@ -153,6 +156,14 @@ StTooltip {
-slider-handle-radius: 0.5em;
}
.popup-device-menu-item {
spacing: .5em;
}
.popup-menu-icon {
icon-size: 1em;
}
/* Switches (to be used in menus) */
.toggle-switch {
width: 4.5em;
@@ -240,92 +251,62 @@ StTooltip {
spacing: 8px;
}
.system-status-icon {
icon-size: 1em;
}
/* Overview */
.overview {
background-color: #111;
#overview {
spacing: 12px;
background-color: rgba(0,0,0,0.6);
}
.info-bar {
color: #fff;
font-size: 14px;
spacing: 20px;
}
.info-bar-link-button {
background-color: #2d2d2d;
padding: 2px 14px;
border-radius: 10px;
border: 1px solid #181818;
}
.info-bar-link-button:hover {
border: 1px solid #666666;
}
.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 {
height: 48px;
}
.workspaces-bar {
spacing: 5px;
.workspace-indicator-panel {
spacing: 8px;
}
.workspace-indicator {
width: 24px;
height: 16px;
background: rgba(155,155,155,0.8);
border-spacing: 16px;
background: rgba(255,255,255,0.2);
}
.workspace-indicator.active {
background: rgba(255,255,255,0.8);
}
.workspace-controls {
width: 48px;
font-size: 32px;
font-weight: bold;
color: #ffffff;
border: 2px solid rgba(128, 128, 128, 0.4);
border-right: 0px;
border-radius: 9px 0px 0px 9px;
}
.add-workspace {
background-color: rgba(128, 128, 128, 0.4);
}
.add-workspace:hover {
background-color: rgba(128, 128, 128, 0.6);
}
.remove-workspace {
height: 48px;
}
.remove-workspace:hover {
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);
@@ -343,161 +324,125 @@ StTooltip {
-shell-close-overlap: 16px;
}
.single-view-controls {
padding: 0px 15px;
}
.workspace-controls {
width: 24px;
height: 16px;
}
.workspace-controls.add {
background-image: url("add-workspace.svg");
}
.workspace-controls.remove {
background-image: url("remove-workspace.svg");
}
.workspace-controls.switch-single {
background-image: url("single-view.svg");
}
.workspace-controls.switch-mosaic {
background-image: url("mosaic-view.svg");
}
.workspace-controls.switch-single:checked {
background-image: url("single-view-active.svg");
}
.workspace-controls.switch-mosaic:checked {
background-image: url("mosaic-view-active.svg");
}
#SwitchScroll {
height: 14px;
}
#SwitchScroll #hhandle {
border-radius: 7px;
}
/* Dash */
#dash {
color: #5f5f5f;
font-size: 12px;
padding: 0px 14px;
padding: 6px 0px;
background-color: rgba(0, 0, 0, 0.5);
border: 2px solid rgba(128, 128, 128, 0.4);
border-left: 0px;
border-radius: 0px 9px 9px 0px;
}
#dashSections {
spacing: 12px;
#dash:empty {
height: 100px;
width: 60px;
}
.dash-placeholder {
background-image: url("dash-placeholder.svg");
height: 27px;
}
#viewSelector {
spacing: 16px;
}
#viewSelectorTabBar {
padding: 16px;
}
#searchArea {
padding: 0px 24px;
}
#searchEntry {
padding: 4px;
border-radius: 4px;
color: #a8a8a8;
border: 1px solid #565656;
background-color: #404040;
caret-color: #fff;
padding: 4px 8px;
border-radius: 12px;
color: rgb(128, 128, 128);
border: 2px solid rgba(128, 128, 128, 0.4);
background-gradient-start: rgba(0, 0, 0, 0.2);
background-gradient-end: rgba(128, 128, 128, 0.2);
background-gradient-direction: vertical;
caret-color: rgb(128, 128, 128);
caret-size: 1px;
height: 16px;
width: 250px;
transition-duration: 300;
}
#searchEntry:focus {
color: #545454;
border: 1px solid #3a3a3a;
background-color: #e8e8e8;
caret-color: #545454;
border: 2px solid #ffffff;
background-gradient-start: rgba(0, 0, 0, 0.2);
background-gradient-end: #ffffff;
background-gradient-direction: vertical;
color: rgb(64, 64, 64);
font-weight: bold;
-st-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
transition-duration: 0;
}
#searchEntry:hover {
color: #a8a8a8;
border: 1px solid #4d4d4d;
background-color: #e8e8e8;
border: 2px solid #e8e8e8;
caret-color: #545454;
transition-duration: 500;
}
.dash-section {
.view-tab-title {
color: #888a85;
font-weight: bold;
padding: 0px 12px;
}
.view-tab-title:selected {
color: white;
}
.view-tab-boxpointer {
-arrow-border-radius: 9px;
-arrow-background-color: rgba(0,0,0,0.5);
-arrow-border-width: 2px;
-arrow-border-color: rgba(255,255,255,0.5);
-arrow-base: 30px;
-arrow-rise: 15px;
}
#searchResults {
padding: 20px 10px 10px 10px;
}
#searchResultsContent {
padding: 0 10px;
spacing: 8px;
}
.section-header {
}
.section-header-inner {
.search-statustext,
.search-section-header {
padding: 4px 12px;
spacing: 4px;
color: #6f6f6f;
}
.section-text-content {
padding: 4px 0px;
}
.dash-section-content {
color: #ffffff;
spacing: 8px;
}
.more-link {
}
.more-link-expander {
background-image: url("section-more.svg");
width: 9px;
height: 9px;
}
.more-link-expander.open {
background-image: url("section-more-open.svg");
width: 9px;
height: 9px;
}
.dash-pane {
.search-section {
background-color: rgba(128, 128, 128, .1);
border: 1px solid rgba(50, 50, 50, .4);
border-radius: 10px;
background-color: #111111;
border: 2px solid #868686;
}
.search-section-results {
color: #ffffff;
padding: 30px 10px 10px 20px;
border-radius: 10px;
border: 1px solid rgba(50, 50, 50, .4);
padding: 6px;
}
#dashAppSearchResults {
padding: 8px 0px;
}
.dash-search-statustext,
.dash-search-section-header {
padding: 4px 0px;
.search-section-list-results {
spacing: 4px;
}
.dash-search-section-results {
color: #ffffff;
}
.dash-search-section-list-results {
spacing: 4px;
}
.dash-search-result-content {
padding: 3px;
}
.dash-search-result-content:selected {
padding: 2px;
border: 1px solid #5c5c5c;
border-radius: 2px;
background-color: #1e1e1e;
}
.dash-results-container {
.results-container {
spacing: 4px;
}
@@ -544,67 +489,66 @@ StTooltip {
}
.icon-grid {
spacing: 6px;
spacing: 36px;
-shell-grid-item-size: 70px;
}
.all-app {
border-radius: 10px;
background-color: #111111;
border: 2px solid #868686;
color: #ffffff;
padding: 16px 250px 10px 16px;
}
.app-section-divider-container {
padding-top: 10px;
padding-bottom: 10px;
padding-top: 36px;
padding-bottom: 36px;
}
.app-section-divider {
height: 2px;
background-image: url("separator-white.png");
}
.all-app-controls-panel {
height: 30px;
#dash > .app-well-app {
padding: 6px 12px;
}
.all-app-scroll-view {
padding-right: 10px;
padding-left: 10px;
padding-bottom: 10px;
.remove-favorite-icon {
color: #a0a0a0;
}
.app-well-app {
border: 1px solid #181818;
.remove-favorite-icon:hover {
color: white;
-st-shadow: black 0px 2px 2px;
}
.app-well-app > .overview-icon,
.remove-favorite > .overview-icon,
.search-result-content > .overview-icon {
border-radius: 4px;
padding: 4px;
width: 70px;
height: 70px;
font-size: 10px;
color: white;
transition-duration: 100;
text-align: center;
}
.app-well-app.running {
background-gradient-direction: vertical;
background-gradient-start: #3d3d3d;
background-gradient-end: #181818;
.app-well-app.running > .overview-icon {
text-shadow: black 0px 2px 2px;
background-image: url("running-indicator.svg");
}
.app-well-app.selected {
border: 1px solid #666666;
.app-well-app:selected > .overview-icon,
.search-result-content:selected > .overview-icon {
background: rgba(255,255,255,0.33);
}
.app-well-app:hover {
border: 1px solid #666666;
background-gradient-direction: vertical;
background-gradient-start: rgba(61,61,61,0.8);
background-gradient-end: rgba(24,24,24,0.2);
.app-well-app:hover > .overview-icon,
.remove-favorite:hover > .overview-icon,
.search-result-content:hover > .overview-icon {
background: rgba(255,255,255,0.33);
text-shadow: black 0px 2px 2px;
transition-duration: 100;
}
.app-well-app:active {
.app-well-app:active > .overview-icon {
background-color: #1e1e1e;
border: 1px solid #5f5f5f;
}
@@ -832,6 +776,10 @@ StTooltip {
color: #cccccc;
}
.url-highlighter {
link-color: #ccccff;
}
/* Message Tray */
#message-tray {
background-gradient-direction: vertical;
@@ -878,6 +826,10 @@ StTooltip {
height: 1em;
}
#notification-scrollview > StScrollBar {
padding-left: 6px;
}
#notification-body {
spacing: 5px;
}
@@ -916,6 +868,10 @@ StTooltip {
background: rgba(128,128,128,0.7);
}
.notification-icon-button > StIcon {
icon-size: 36px;
}
.chat-received {
background-gradient-direction: horizontal;
background-gradient-start: rgba(255, 255, 255, 0.2);
@@ -934,6 +890,13 @@ StTooltip {
border-radius: 4px;
}
.chat-meta-message {
padding-left: 4px;
border-radius: 4px;
font-size: 14px;
color: #bbbbbb;
}
.chat-response {
padding: 4px;
border-radius: 4px;
@@ -942,7 +905,6 @@ StTooltip {
background-color: #404040;
caret-color: #ffffff;
caret-size: 1px;
height: 18px;
}
.chat-response:focus {

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="74.01342"
height="74.006706"
id="svg7355"
version="1.1">
<defs
id="defs7357">
<radialGradient
xlink:href="#linearGradient36429"
id="radialGradient7461"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.0525552,0,0,1.0525552,-2.5162753,-9.0000838)"
cx="47.878681"
cy="171.25"
fx="47.878681"
fy="171.25"
r="37" />
<linearGradient
id="linearGradient36429">
<stop
id="stop36431"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop36433"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
xlink:href="#linearGradient36471"
id="radialGradient7463"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
cx="49.067139"
cy="242.50381"
fx="49.067139"
fy="242.50381"
r="37.00671" />
<linearGradient
id="linearGradient36471">
<stop
id="stop36473"
offset="0"
style="stop-color:#ffffff;stop-opacity:1;" />
<stop
id="stop36475"
offset="1"
style="stop-color:#ffffff;stop-opacity:0;" />
</linearGradient>
<radialGradient
r="37.00671"
fy="242.50381"
fx="49.067139"
cy="242.50381"
cx="49.067139"
gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
gradientUnits="userSpaceOnUse"
id="radialGradient7488"
xlink:href="#linearGradient36471" />
</defs>
<g
id="layer1"
transform="translate(-266.21629,-168.11809)">
<g
style="display:inline"
id="g30864"
transform="translate(255.223,70.118091)">
<rect
ry="3.5996203"
rx="3.5996203"
y="98"
x="11"
height="74"
width="74"
id="rect14000"
style="opacity:0.371875;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
<path
id="rect34520"
d="m 84.506708,167.95508 c 6e-6,1.96759 -1.584022,3.55162 -3.551629,3.55163 l -65.910146,0 c -1.967608,-1e-5 -3.551648,-1.58402 -3.551643,-3.55164"
style="opacity:0.2;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@@ -8,6 +8,7 @@ nobase_dist_js_DATA = \
misc/gnomeSession.js \
misc/params.js \
misc/telepathy.js \
misc/utils.js \
perf/core.js \
prefs/clockPreferences.js \
ui/altTab.js \
@@ -39,13 +40,16 @@ nobase_dist_js_DATA = \
ui/runDialog.js \
ui/scripting.js \
ui/search.js \
ui/searchDisplay.js \
ui/shellDBus.js \
ui/statusIconDispatcher.js \
ui/statusMenu.js \
ui/status/accessibility.js \
ui/status/power.js \
ui/status/volume.js \
ui/telepathyClient.js \
ui/tweener.js \
ui/viewSelector.js \
ui/windowAttentionHandler.js \
ui/windowManager.js \
ui/workspace.js \

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

@@ -21,8 +21,6 @@ const Tweener = imports.ui.tweener;
const Workspace = imports.ui.workspace;
const Params = imports.misc.params;
const WELL_MAX_COLUMNS = 16;
const WELL_MAX_SEARCH_ROWS = 1;
const MENU_POPUP_TIMEOUT = 600;
function AlphabeticalView() {
@@ -32,7 +30,7 @@ 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 });
},
@@ -148,22 +146,14 @@ AllAppDisplay.prototype = {
Main.queueDeferredWork(this._workId);
}));
let bin = new St.BoxLayout({ style_class: 'all-app-controls-panel',
reactive: true });
this.actor = new St.BoxLayout({ style_class: 'all-app', vertical: true });
this.actor.hide();
let view = new St.ScrollView({ x_fill: true,
y_fill: false,
style_class: 'all-app-scroll-view',
vshadows: true });
this._scrollView = view;
this.actor.add(bin);
this.actor.add(view, { expand: true, y_fill: false, y_align: St.Align.START });
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._appView.connect('launching', Lang.bind(this, this.close));
this._appView.connect('drag-begin', Lang.bind(this, this.close));
this._scrollView.add_actor(this._appView.actor);
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
@@ -177,101 +167,10 @@ AllAppDisplay.prototype = {
});
this._appView.refresh(apps);
},
toggle: function() {
if (this.actor.visible) {
Tweener.addTween(this.actor,
{ opacity: 0,
time: Overview.PANE_FADE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.actor.hide();
this.emit('open-state-changed',
this.actor.visible);
})
});
} else {
this.actor.show();
this.emit('open-state-changed', this.actor.visible);
this.actor.opacity = 0;
Tweener.addTween(this.actor,
{ opacity: 255,
time: Overview.PANE_FADE_TIME,
transition: 'easeOutQuad'
});
}
},
close: function() {
if (!this.actor.visible)
return;
this.toggle();
}
};
Signals.addSignalMethods(AllAppDisplay.prototype);
function AppSearchResultDisplay(provider) {
this._init(provider);
}
AppSearchResultDisplay.prototype = {
__proto__: Search.SearchResultDisplay.prototype,
_init: function (provider) {
Search.SearchResultDisplay.prototype._init.call(this, provider);
this._grid = new IconGrid.IconGrid({ rowLimit: WELL_MAX_SEARCH_ROWS });
this.actor = new St.Bin({ name: 'dashAppSearchResults',
x_align: St.Align.START });
this.actor.set_child(this._grid.actor);
},
renderResults: function(results, terms) {
let appSys = Shell.AppSystem.get_default();
let maxItems = WELL_MAX_SEARCH_ROWS * WELL_MAX_COLUMNS;
for (let i = 0; i < results.length && i < maxItems; i++) {
let result = results[i];
let app = appSys.get_app(result);
let display = new AppWellIcon(app);
this._grid.addItem(display.actor);
}
},
clear: function () {
this._grid.removeAll();
this.selectionIndex = -1;
},
getVisibleResultCount: function() {
return this._grid.visibleItemsCount();
},
selectIndex: function (index) {
let nVisible = this.getVisibleResultCount();
if (this.selectionIndex >= 0) {
let prevActor = this._grid.getItemAtIndex(this.selectionIndex);
prevActor._delegate.setSelected(false);
}
this.selectionIndex = -1;
if (index >= nVisible)
return false;
else if (index < 0)
return false;
let targetActor = this._grid.getItemAtIndex(index);
targetActor._delegate.setSelected(true);
this.selectionIndex = index;
return true;
},
activateSelected: function() {
if (this.selectionIndex < 0)
return;
let targetActor = this._grid.getItemAtIndex(this.selectionIndex);
this.provider.activateResult(targetActor._delegate.app.get_id());
}
};
function BaseAppSearchProvider() {
this._init();
@@ -324,12 +223,10 @@ AppSearchProvider.prototype = {
return this._appSys.subsearch(false, previousResults, terms);
},
createResultContainerActor: function () {
return new AppSearchResultDisplay(this);
},
createResultActor: function (resultMeta, terms) {
return new AppIcon(resultMeta.id);
let app = this._appSys.get_app(resultMeta['id']);
let icon = new AppWellIcon(app);
return icon.actor;
},
expandSearch: function(terms) {
@@ -375,7 +272,9 @@ AppIcon.prototype = {
let label = this.app.get_name();
IconGrid.BaseIcon.prototype._init.call(this, label);
IconGrid.BaseIcon.prototype._init.call(this,
label,
{ setSizeManually: true });
},
createIcon: function(iconSize) {
@@ -396,8 +295,8 @@ AppWellIcon.prototype = {
y_fill: true });
this.actor._delegate = this;
this._icon = new AppIcon(app);
this.actor.set_child(this._icon.actor);
this.icon = new AppIcon(app);
this.actor.set_child(this.icon.actor);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
@@ -526,14 +425,6 @@ AppWellIcon.prototype = {
}
},
setSelected: function (isSelected) {
this._selected = isSelected;
if (this._selected)
this.actor.add_style_class_name('selected');
else
this.actor.remove_style_class_name('selected');
},
_onMenuPoppedUp: function() {
if (this._getRunning()) {
Main.overview.getWorkspacesForWindow(null).setApplicationWindowSelection(this.app.get_id());
@@ -581,13 +472,13 @@ AppWellIcon.prototype = {
},
getDragActor: function() {
return this.app.create_icon_texture(this._icon.iconSize);
return this.app.create_icon_texture(this.icon.iconSize);
},
// Returns the original actor that should align with the actor
// we show as the item is being dragged.
getDragActorSource: function() {
return this._icon.icon;
return this.icon.icon;
}
};
Signals.addSignalMethods(AppWellIcon.prototype);
@@ -756,135 +647,3 @@ AppIconMenu.prototype = {
}
};
Signals.addSignalMethods(AppIconMenu.prototype);
function AppWell() {
this._init();
}
AppWell.prototype = {
_init : function() {
this._placeholderText = null;
this._menus = [];
this._menuDisplays = [];
this._favorites = [];
this._grid = new IconGrid.IconGrid();
this.actor = this._grid.actor;
this.actor._delegate = this;
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
this._tracker = Shell.WindowTracker.get_default();
this._appSystem = Shell.AppSystem.get_default();
this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
this._tracker.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
},
_appIdListToHash: function(apps) {
let ids = {};
for (let i = 0; i < apps.length; i++)
ids[apps[i].get_id()] = apps[i];
return ids;
},
_queueRedisplay: function () {
Main.queueDeferredWork(this._workId);
},
_redisplay: function () {
this._grid.removeAll();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
/* hardcode here pending some design about how exactly desktop contexts behave */
let contextId = '';
let running = this._tracker.get_running_apps(contextId);
let runningIds = this._appIdListToHash(running);
let nFavorites = 0;
for (let id in favorites) {
let app = favorites[id];
let display = new AppWellIcon(app);
this._grid.addItem(display.actor);
nFavorites++;
}
for (let i = 0; i < running.length; i++) {
let app = running[i];
if (app.get_id() in favorites)
continue;
let display = new AppWellIcon(app);
this._grid.addItem(display.actor);
}
if (this._placeholderText) {
this._placeholderText.destroy();
this._placeholderText = null;
}
if (running.length == 0 && nFavorites == 0) {
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
this.actor.add_actor(this._placeholderText);
}
},
handleDragOver : function(source, actor, x, y, time) {
let app = null;
if (source instanceof AppWellIcon)
app = this._appSystem.get_app(source.getId());
else if (source instanceof Workspace.WindowClone)
app = this._tracker.get_window_app(source.metaWindow);
// Don't allow favoriting of transient apps
if (app == null || app.is_transient())
return DND.DragMotionResult.NO_DROP;
let id = app.get_id();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
let srcIsFavorite = (id in favorites);
if (srcIsFavorite)
return DND.DragMotionResult.NO_DROP;
return DND.DragMotionResult.COPY_DROP;
},
// Draggable target interface
acceptDrop : function(source, actor, x, y, time) {
let app = null;
if (source instanceof AppWellIcon) {
app = this._appSystem.get_app(source.getId());
} else if (source instanceof Workspace.WindowClone) {
app = this._tracker.get_window_app(source.metaWindow);
}
// Don't allow favoriting of transient apps
if (app == null || app.is_transient()) {
return false;
}
let id = app.get_id();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
let srcIsFavorite = (id in favorites);
if (srcIsFavorite) {
return false;
} else {
Mainloop.idle_add(Lang.bind(this, function () {
AppFavorites.getAppFavorites().addFavorite(id);
return false;
}));
}
return true;
}
};
Signals.addSignalMethods(AppWell.prototype);

View File

@@ -63,7 +63,7 @@ AppFavorites.prototype = {
return appId in this._favorites;
},
_addFavorite: function(appId) {
_addFavorite: function(appId, pos) {
if (appId in this._favorites)
return false;
@@ -73,23 +73,35 @@ AppFavorites.prototype = {
return false;
let ids = this._getIds();
ids.push(appId);
if (pos == -1)
ids.push(appId);
else
ids.splice(pos, 0, appId);
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
this._favorites[appId] = app;
return true;
},
addFavorite: function(appId) {
if (!this._addFavorite(appId))
addFavoriteAtPos: function(appId, pos) {
if (!this._addFavorite(appId, pos))
return;
let app = Shell.AppSystem.get_default().get_app(appId);
Main.overview.infoBar.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
Main.overview.shellInfo.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
this._removeFavorite(appId);
}));
},
addFavorite: function(appId) {
this.addFavoriteAtPos(appId, -1);
},
moveFavoriteToPos: function(appId, pos) {
this._removeFavorite(appId);
this._addFavorite(appId, pos);
},
_removeFavorite: function(appId) {
if (!appId in this._favorites)
return false;
@@ -100,13 +112,16 @@ AppFavorites.prototype = {
},
removeFavorite: function(appId) {
let ids = this._getIds();
let pos = ids.indexOf(appId);
let app = this._favorites[appId];
if (!this._removeFavorite(appId))
return;
Main.overview.infoBar.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
Main.overview.shellInfo.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
Lang.bind(this, function () {
this._addFavorite(appId);
this._addFavorite(appId, pos);
}));
}
};

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;

File diff suppressed because it is too large Load Diff

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;
@@ -267,6 +275,7 @@ _Draggable.prototype = {
this._dragActor.reparent(this.actor.get_stage());
this._dragActor.raise_top();
Shell.util_set_hidden_from_pick(this._dragActor, true);
this._dragOrigOpacity = this._dragActor.opacity;
if (this._dragActorOpacity != undefined)
@@ -332,12 +341,8 @@ _Draggable.prototype = {
this._dragActor.set_position(stageX + this._dragOffsetX,
stageY + this._dragOffsetY);
// Because we want to find out what other actor is located at the current position of this._dragActor,
// we have to temporarily hide this._dragActor.
this._dragActor.hide();
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
stageX, stageY);
this._dragActor.show();
// We call observers only once per motion with the innermost
// target actor. If necessary, the observer can walk the
@@ -377,20 +382,16 @@ _Draggable.prototype = {
}
target = target.get_parent();
}
global.set_cursor(Shell.Cursor.IN_DRAG);
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
}
return true;
},
_dragActorDropped: function(event) {
// Find a drop target. Because we want to find out what other actor is located at
// the current position of this._dragActor, we have to temporarily hide this._dragActor.
this._dragActor.hide();
let [dropX, dropY] = event.get_coords();
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
dropX, dropY);
this._dragActor.show();
// We call observers only once per motion with the innermost
// target actor. If necessary, the observer can walk the
@@ -447,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;
}
@@ -474,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',
@@ -487,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;
@@ -522,6 +543,8 @@ _Draggable.prototype = {
},
_dragComplete: function() {
Shell.util_set_hidden_from_pick(this._dragActor, false);
this._dragActor = undefined;
currentDraggable = null;
this._ungrabEvents();

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

@@ -678,9 +678,8 @@ LookingGlass.prototype = {
let toolbar = new St.BoxLayout({ name: 'Toolbar' });
this.actor.add_actor(toolbar);
let inspectIcon = St.TextureCache.get_default().load_icon_name('gtk-color-picker',
St.IconType.SYMBOLIC,
24);
let inspectIcon = new St.Icon({ icon_name: 'gtk-color-picker',
icon_size: 24 });
toolbar.add_actor(inspectIcon);
inspectIcon.reactive = true;
inspectIcon.connect('button-press-event', Lang.bind(this, function () {
@@ -940,7 +939,9 @@ LookingGlass.prototype = {
global.stage.set_key_focus(this._entry);
Tweener.addTween(this.actor, { time: 0.5,
// 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(),
transition: 'easeOutQuad',
y: this._targetY
});
@@ -967,7 +968,7 @@ LookingGlass.prototype = {
Main.popModal(this.actor);
Tweener.addTween(this.actor, { time: 0.5,
Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
transition: 'easeOutQuad',
y: this._hiddenY,
onComplete: Lang.bind(this, function () {

View File

@@ -97,10 +97,11 @@ function start() {
Shell.WindowTracker.get_default();
Shell.AppUsage.get_default();
// The background color really only matters if there is no desktop
// window (say, nautilus) running. We set it mostly so things look good
// when we are running inside Xephyr.
// The stage is always covered so Clutter doesn't need to clear it; however
// the color is used as the default contents for the Mutter root background
// actor so set it anyways.
global.stage.color = DEFAULT_BACKGROUND_COLOR;
global.stage.no_clear_hint = true;
let themeContext = St.ThemeContext.get_for_stage (global.stage);
let stylesheetPath = global.datadir + '/theme/gnome-shell.css';
@@ -161,10 +162,6 @@ function start() {
}
});
background = global.create_root_pixmap_actor();
global.stage.add_actor(background);
background.lower_bottom();
global.gdk_screen.connect('monitors-changed', _relayout);
ExtensionSystem.init();
@@ -240,8 +237,6 @@ function _relayout() {
panel.actor.set_size(primary.width, Panel.PANEL_HEIGHT);
overview.relayout();
background.set_size(global.screen_width, global.screen_height);
// To avoid updating the position and size of the workspaces
// in the overview, we just hide the overview. The positions
// will be updated when it is next shown. We do the same for

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;
@@ -22,8 +25,6 @@ const SUMMARY_TIMEOUT = 1;
const HIDE_TIMEOUT = 0.2;
const LONGER_HIDE_TIMEOUT = 0.6;
const BUTTON_ICON_SIZE = 36;
const MAX_SOURCE_TITLE_WIDTH = 180;
// We delay hiding of the tray if the mouse is within MOUSE_LEFT_ACTOR_THRESHOLD
@@ -37,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
@@ -75,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
@@ -89,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
@@ -105,6 +230,7 @@ Notification.prototype = {
this._useActionIcons = false;
this._customContent = false;
this._bannerBodyText = null;
this._bannerBodyMarkup = false;
this._titleFitsInBannerMode = true;
this._spacing = 0;
@@ -150,7 +276,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);
@@ -177,6 +304,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;
@@ -207,7 +337,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
@@ -215,9 +345,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
@@ -225,7 +357,7 @@ Notification.prototype = {
this._addBannerBody();
if (params.body)
this.addBody(params.body);
this.addBody(params.body, params.bodyMarkup);
this._updated();
},
@@ -233,7 +365,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',
@@ -250,34 +382,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);
}
},
@@ -349,7 +477,7 @@ Notification.prototype = {
if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(id)) {
button.add_style_class_name('notification-icon-button');
button.child = St.TextureCache.get_default().load_icon_name(id, St.IconType.SYMBOLIC, BUTTON_ICON_SIZE);
button.child = new St.Icon({ icon_name: id });
} else {
button.add_style_class_name('notification-button');
button.label = label;

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>' }
]
};
@@ -150,7 +150,9 @@ NotificationDaemon.prototype = {
let uri = GLib.filename_to_uri(icon, null);
return textureCache.load_uri_async(uri, size, size);
} else
return textureCache.load_icon_name(icon, St.IconType.FULLCOLOR, size);
return new St.Icon({ icon_name: icon,
icon_type: St.IconType.FULLCOLOR,
icon_size: size });
} else if (hints.icon_data) {
let [width, height, rowStride, hasAlpha,
bitsPerSample, nChannels, data] = hints.icon_data;
@@ -167,7 +169,9 @@ NotificationDaemon.prototype = {
stockIcon = 'gtk-dialog-error';
break;
}
return textureCache.load_icon_name(stockIcon, St.IconType.FULLCOLOR, size);
return new St.Icon({ icon_name: stockIcon,
icon_type: St.IconType.FULLCOLOR,
icon_size: size });
}
},
@@ -201,8 +205,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++) {
@@ -277,7 +279,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) {
@@ -290,6 +294,7 @@ NotificationDaemon.prototype = {
notification.connect('action-invoked', Lang.bind(this, this._actionInvoked, source, id));
} else {
notification.update(summary, body, { icon: iconActor,
bannerMarkup: true,
clear: true });
}

View File

@@ -1,6 +1,7 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Meta = imports.gi.Meta;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
const Lang = imports.lang;
@@ -8,104 +9,60 @@ const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const AppDisplay = imports.ui.appDisplay;
const Dash = imports.ui.dash;
const DocDisplay = imports.ui.docDisplay;
const GenericDisplay = imports.ui.genericDisplay;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Panel = imports.ui.panel;
const Dash = imports.ui.dash;
const PlaceDisplay = imports.ui.placeDisplay;
const Tweener = imports.ui.tweener;
const ViewSelector = imports.ui.viewSelector;
const WorkspacesView = imports.ui.workspacesView;
// Time for initial animation going into Overview mode
const ANIMATION_TIME = 0.25;
// Time for pane menus to fade in/out
const PANE_FADE_TIME = 0.1;
// We split the screen vertically between the dash and the view selector.
const DASH_SPLIT_FRACTION = 0.1;
// We divide the screen into a grid of rows and columns, which we use
// to help us position the Overview components, such as the side panel
// that lists applications and documents, the workspaces display, and
// the button for adding additional workspaces.
// In the regular mode, the side panel takes up one column on the left,
// and the workspaces display takes up the remaining columns.
// In the expanded side panel display mode, the side panel takes up two
// columns, and the workspaces display slides all the way to the right,
// being visible only in the last quarter of the right-most column.
// In the future, this mode will have more components, such as a display
// of documents which were recently opened with a given application, which
// will take up the remaining sections of the display.
const SHELL_INFO_HIDE_TIMEOUT = 10;
const WIDE_SCREEN_CUT_OFF_RATIO = 1.4;
// A common netbook resolution is 1024x600, which trips the widescreen
// ratio. However that leaves way too few pixels for the dash. So
// just treat this as a regular screen.
const WIDE_SCREEN_MINIMUM_HEIGHT = 768;
const COLUMNS_REGULAR_SCREEN = 4;
const ROWS_REGULAR_SCREEN = 8;
const COLUMNS_WIDE_SCREEN = 5;
const ROWS_WIDE_SCREEN = 10;
const DEFAULT_PADDING = 4;
// Padding around workspace grid / Spacing between Dash and Workspaces
const WORKSPACE_GRID_PADDING = 12;
const COLUMNS_FOR_WORKSPACES_REGULAR_SCREEN = 3;
const ROWS_FOR_WORKSPACES_REGULAR_SCREEN = 6;
const COLUMNS_FOR_WORKSPACES_WIDE_SCREEN = 4;
const ROWS_FOR_WORKSPACES_WIDE_SCREEN = 8;
// A multi-state; PENDING is used during animations
const STATE_ACTIVE = true;
const STATE_PENDING_INACTIVE = false;
const STATE_INACTIVE = false;
const SHADOW_COLOR = new Clutter.Color();
SHADOW_COLOR.from_pixel(0x00000033);
const TRANSPARENT_COLOR = new Clutter.Color();
TRANSPARENT_COLOR.from_pixel(0x00000000);
const SHADOW_WIDTH = 6;
const NUMBER_OF_SECTIONS_IN_SEARCH = 2;
const INFO_BAR_HIDE_TIMEOUT = 10;
let wideScreen = false;
let displayGridColumnWidth = null;
let displayGridRowHeight = null;
function InfoBar() {
function Source() {
this._init();
}
InfoBar.prototype = {
Source.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function() {
this.actor = new St.Bin({ style_class: 'info-bar-panel',
x_fill: true,
y_fill: false });
this._label = new St.Label();
this._undo = new St.Button({ style_class: 'info-bar-link-button' });
MessageTray.Source.prototype._init.call(this,
"System Information");
this._setSummaryIcon(this.createNotificationIcon());
},
let bin = new St.Bin({ x_fill: false,
y_fill: false,
x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this.actor.set_child(bin);
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'info',
icon_type: St.IconType.FULLCOLOR,
icon_size: this.ICON_SIZE });
},
let box = new St.BoxLayout({ style_class: 'info-bar' });
bin.set_child(box);
_notificationClicked: function() {
this.destroy();
}
}
function ShellInfo() {
this._init();
}
ShellInfo.prototype = {
_init: function() {
this._source = null;
this._timeoutId = 0;
box.add(this._label, {'y-fill' : false, 'y-align' : St.Align.MIDDLE});
box.add(this._undo);
this.actor.set_opacity(0);
this._undoCallback = null;
this._undo.connect('clicked', Lang.bind(this, this._onUndoClicked));
},
_onUndoClicked: function() {
@@ -114,27 +71,16 @@ InfoBar.prototype = {
if (this._undoCallback)
this._undoCallback();
this.actor.set_opacity(0);
this._undoCallback = null;
},
_hideDone: function() {
this._undoCallback = null;
},
_hide: function() {
Tweener.addTween(this.actor,
{ opacity: 0,
transition: 'easeOutQuad',
time: ANIMATION_TIME,
onComplete: this._hideDone,
onCompleteScope: this
});
if (this._source)
this._source.destroy();
},
_onTimeout: function() {
this._timeoutId = 0;
this._hide();
if (this._source)
this._source.destroy();
return false;
},
@@ -142,28 +88,33 @@ InfoBar.prototype = {
if (this._timeoutId)
Mainloop.source_remove(this._timeoutId);
this._timeout = false;
this._timeoutId = Mainloop.timeout_add_seconds(SHELL_INFO_HIDE_TIMEOUT,
Lang.bind(this, this._onTimeout));
this._label.text = text;
if (this._source == null) {
this._source = new Source();
this._source.connect('destroy', Lang.bind(this,
function() {
this._source = null;
}));
Main.messageTray.add(this._source);
}
Tweener.addTween(this.actor,
{ opacity: 255,
transition: 'easeOutQuad',
time: ANIMATION_TIME
});
this._timeoutId = Mainloop.timeout_add_seconds(INFO_BAR_HIDE_TIMEOUT, Lang.bind(this, this._onTimeout));
if (undoLabel)
this._undo.label = undoLabel;
let notification = this._source.notification;
if (notification == null)
notification = new MessageTray.Notification(this._source, text, null);
else
this._undo.label = _("Undo");
notification.update(text, null, { clear: true });
this._undoCallback = undoCallback;
if (undoCallback)
this._undo.show();
else
this._undo.hide();
if (undoCallback) {
notification.addButton('system-undo',
undoLabel ? undoLabel : _("Undo"));
notification.connect('action-invoked',
Lang.bind(this, this._onUndoClicked));
}
this._source.notify(notification);
}
};
@@ -173,30 +124,37 @@ function Overview() {
Overview.prototype = {
_init : function() {
this._group = new St.Group({ style_class: 'overview' });
// 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' });
this._group._delegate = this;
this._group.connect('destroy', Lang.bind(this,
function() {
if (this._lightbox) {
this._lightbox.destroy();
this._lightbox = null;
this._group.connect('style-changed',
Lang.bind(this, function() {
let node = this._group.get_theme_node();
let spacing = node.get_length('spacing');
if (spacing != this._spacing) {
this._spacing = spacing;
this.relayout();
}
}));
this.infoBar = new InfoBar();
this._group.add_actor(this.infoBar.actor);
this.shellInfo = new ShellInfo();
this._workspacesManager = null;
this._lightbox = null;
this._workspacesDisplay = null;
this.visible = false;
this.animationInProgress = false;
this._hideInProgress = false;
this._recalculateGridSizes();
this._activeDisplayPane = null;
// During transitions, we raise this to the top to avoid having the overview
// area be reactive; it causes too many issues such as double clicks on
// Dash elements, or mouseover handlers in the workspaces.
@@ -205,196 +163,86 @@ Overview.prototype = {
this._group.add_actor(this._coverPane);
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
// Similar to the cover pane but used for dialogs ("panes"); see the comments
// in addPane below.
this._transparentBackground = new Clutter.Rectangle({ opacity: 0,
reactive: true });
this._group.add_actor(this._transparentBackground);
// Background color for the Overview
this._backOver = new St.Label();
this._group.add_actor(this._backOver);
this._group.hide();
global.overlay_group.add_actor(this._group);
this.viewSelector = new ViewSelector.ViewSelector();
this._group.add_actor(this.viewSelector.actor);
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this.viewSelector.addViewTab("Windows", this._workspacesDisplay.actor);
let appView = new AppDisplay.AllAppDisplay();
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());
// TODO - recalculate everything when desktop size changes
this._dash = new Dash.Dash();
this._group.add_actor(this._dash.actor);
// Container to hold popup pane chrome.
this._paneContainer = new St.BoxLayout({ style_class: 'overview-pane' });
// Note here we explicitly don't set the paneContainer to be reactive yet; that's done
// inside the notify::visible handler on panes.
this._paneContainer.connect('button-release-event', Lang.bind(this, function(background) {
this._activeDisplayPane.close();
return true;
}));
this._group.add_actor(this._paneContainer);
this._transparentBackground.lower_bottom();
this._paneContainer.hide();
this._dash.actor.add_constraint(this.viewSelector.constrainY);
this._dash.actor.add_constraint(this.viewSelector.constrainHeight);
this._coverPane.lower_bottom();
this.workspaces = null;
},
_onViewChanged: function() {
if (!this.visible)
return;
_getDesktopClone: function() {
let windows = global.get_window_actors().filter(function(w) {
return w.meta_window.get_window_type() == Meta.WindowType.DESKTOP;
});
if (windows.length == 0)
return null;
this.workspaces = this._workspacesManager.workspacesView;
// Show new workspacesView
this._group.add_actor(this.workspaces.actor);
this._workspacesBar.raise(this.workspaces.actor);
this._dash.actor.raise(this.workspaces.actor);
},
_recalculateGridSizes: function () {
let primary = global.get_primary_monitor();
wideScreen = (primary.width/primary.height > WIDE_SCREEN_CUT_OFF_RATIO) &&
(primary.height >= WIDE_SCREEN_MINIMUM_HEIGHT);
// We divide the screen into an imaginary grid which helps us determine the layout of
// different visual components.
if (wideScreen) {
displayGridColumnWidth = Math.floor(primary.width / COLUMNS_WIDE_SCREEN);
displayGridRowHeight = Math.floor(primary.height / ROWS_WIDE_SCREEN);
} else {
displayGridColumnWidth = Math.floor(primary.width / COLUMNS_REGULAR_SCREEN);
displayGridRowHeight = Math.floor(primary.height / ROWS_REGULAR_SCREEN);
}
let clone = new Clutter.Clone({ source: windows[0].get_texture() });
clone.source.connect('destroy', Lang.bind(this, function() {
clone.destroy();
}));
return clone;
},
relayout: function () {
let primary = global.get_primary_monitor();
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
this._recalculateGridSizes();
let contentY = Panel.PANEL_HEIGHT;
let contentHeight = primary.height - contentY - Main.messageTray.actor.height;
this._group.set_position(primary.x, primary.y);
this._group.set_size(primary.width, primary.height);
let contentY = Panel.PANEL_HEIGHT;
let contentHeight = primary.height - contentY;
this._coverPane.set_position(0, contentY);
this._coverPane.set_size(primary.width, contentHeight);
let workspaceColumnsUsed = wideScreen ? COLUMNS_FOR_WORKSPACES_WIDE_SCREEN : COLUMNS_FOR_WORKSPACES_REGULAR_SCREEN;
let workspaceRowsUsed = wideScreen ? ROWS_FOR_WORKSPACES_WIDE_SCREEN : ROWS_FOR_WORKSPACES_REGULAR_SCREEN;
this._workspacesWidth = displayGridColumnWidth * workspaceColumnsUsed
- WORKSPACE_GRID_PADDING * 2;
// We scale the vertical padding by (primary.height / primary.width)
// so that the workspace preserves its aspect ratio.
this._workspacesHeight = Math.floor(displayGridRowHeight * workspaceRowsUsed
- WORKSPACE_GRID_PADDING * (primary.height / primary.width) * 2);
let viewWidth = (1.0 - DASH_SPLIT_FRACTION) * primary.width - this._spacing;
let viewHeight = contentHeight - 2 * this._spacing;
let viewY = contentY + this._spacing;
let viewX = rtl ? 0
: Math.floor(DASH_SPLIT_FRACTION * primary.width) + this._spacing;
// Set the dash's x position - y is handled by a constraint
let dashX;
if (rtl) {
this._workspacesX = WORKSPACE_GRID_PADDING;
this._dash.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
dashX = primary.width;
} else {
this._workspacesX = displayGridColumnWidth + WORKSPACE_GRID_PADDING;
dashX = 0;
}
this._workspacesY = Math.floor(displayGridRowHeight + WORKSPACE_GRID_PADDING * (primary.height / primary.width));
this._dash.actor.set_x(dashX);
if (rtl) {
this._dash.actor.set_position(primary.width - displayGridColumnWidth, contentY);
} else {
this._dash.actor.set_position(0, contentY);
}
this._dash.actor.set_size(displayGridColumnWidth, contentHeight);
this._dash.searchArea.height = this._workspacesY - contentY;
this._dash.sectionArea.height = this._workspacesHeight;
this._dash.searchResults.actor.height = this._workspacesHeight;
this.infoBar.actor.set_position(displayGridColumnWidth, Panel.PANEL_HEIGHT);
this.infoBar.actor.set_size(primary.width - displayGridColumnWidth, this._workspacesY - Panel.PANEL_HEIGHT);
this.infoBar.actor.raise_top();
// place the 'Add Workspace' button in the bottom row of the grid
this._workspacesBarX = this._workspacesX;
this._workspacesBarWidth = this._workspacesWidth;
this._workspacesBarY = primary.height - displayGridRowHeight;
// The parent (this._group) is positioned at the top left of the primary monitor
// while this._backOver occupies the entire screen.
this._backOver.set_position(- primary.x, - primary.y);
this._backOver.set_size(global.screen_width, global.screen_height);
this._paneContainer.set_position(this._dash.actor.x + this._dash.actor.width + DEFAULT_PADDING,
this._workspacesY);
// Dynamic width
this._paneContainer.height = this._workspacesHeight;
if (rtl) {
this._paneContainer.connect('notify::width', Lang.bind(this, function (paneContainer) {
paneContainer.x = this._dash.actor.x - (DEFAULT_PADDING + paneContainer.width);
}));
}
this._transparentBackground.set_position(primary.x, primary.y);
this._transparentBackground.set_size(primary.width, primary.height);
},
addPane: function (pane, align) {
pane.actor.height = .9 * this._workspacesHeight;
this._paneContainer.add(pane.actor, { expand: true,
y_fill: false,
y_align: align });
// When a pane is displayed, we raise the transparent background to the top
// and connect to button-release-event on it, then raise the pane above that.
// The idea here is that clicking anywhere outside the pane should close it.
// When the active pane is closed, undo the effect.
let backgroundEventId = null;
pane.connect('open-state-changed', Lang.bind(this, function (pane, isOpen) {
if (isOpen) {
this._activeDisplayPane = pane;
this._transparentBackground.raise_top();
this._paneContainer.raise_top();
this._paneContainer.show();
this._paneReady = false;
if (backgroundEventId != null)
this._transparentBackground.disconnect(backgroundEventId);
backgroundEventId = this._transparentBackground.connect('captured-event', Lang.bind(this, function (actor, event) {
if (event.get_source() != this._transparentBackground)
return false;
if (event.type() == Clutter.EventType.BUTTON_PRESS)
this._paneReady = true;
if (event.type() == Clutter.EventType.BUTTON_RELEASE
&& this._paneReady)
this._activeDisplayPane.close();
return true;
}));
if (!this._lightbox)
this._lightbox = new Lightbox.Lightbox(this._group,
{ fadeTime: PANE_FADE_TIME });
this._lightbox.show();
this._lightbox.highlight(this._paneContainer);
} else if (pane == this._activeDisplayPane) {
this._activeDisplayPane = null;
if (backgroundEventId != null) {
this._transparentBackground.disconnect(backgroundEventId);
backgroundEventId = null;
}
this._transparentBackground.lower_bottom();
this._paneContainer.hide();
this._lightbox.hide();
}
}));
this.viewSelector.actor.set_position(viewX, viewY);
this.viewSelector.actor.set_size(viewWidth, viewHeight);
},
//// Public methods ////
beginItemDrag: function(source) {
// Close any active panes if @source is a GenericDisplayItem.
// This allows the user to place the item on any workspace.
if (source instanceof GenericDisplay.GenericDisplayItem)
if (this._activeDisplayPane != null)
this._activeDisplayPane.close();
this.emit('item-drag-begin');
},
@@ -402,6 +250,14 @@ Overview.prototype = {
this.emit('item-drag-end');
},
beginWindowDrag: function(source) {
this.emit('window-drag-begin');
},
endWindowDrag: function(source) {
this.emit('window-drag-end');
},
// Returns the scale the Overview has when we just start zooming out
// to overview mode. That is, when just the active workspace is showing.
getZoomedInScale : function() {
@@ -419,49 +275,23 @@ Overview.prototype = {
// Returns the current scale of the Overview.
getScale : function() {
return this._group.scaleX;
return this.workspaces.actor.scaleX;
},
// Returns the current position of the Overview.
getPosition : function() {
return [this._group.x, this._group.y];
return [this.workspaces.actor.x, this.workspaces.actor.y];
},
show : function() {
if (this.visible)
return;
if (!Main.pushModal(this._dash.actor))
if (!Main.pushModal(this.viewSelector.actor))
return;
this.visible = true;
this.animationInProgress = true;
this._dash.show();
/* TODO: make this stuff dynamic */
this._workspacesManager =
new WorkspacesView.WorkspacesManager(this._workspacesWidth,
this._workspacesHeight,
this._workspacesX,
this._workspacesY);
this._workspacesManager.connect('view-changed',
Lang.bind(this, this._onViewChanged));
this.workspaces = this._workspacesManager.workspacesView;
this._group.add_actor(this.workspaces.actor);
// The workspaces actor is as big as the screen, so we have to raise the dash above it
// for drag and drop to work. In the future we should fix the workspaces to not
// be as big as the screen.
this._dash.actor.raise(this.workspaces.actor);
this._workspacesBar = this._workspacesManager.controlsBar.actor;
this._workspacesBar.set_position(this._workspacesBarX,
this._workspacesBarY);
this._workspacesBar.width = this._workspacesBarWidth;
this._group.add_actor(this._workspacesBar);
this._workspacesBar.raise(this.workspaces.actor);
// All the the actors in the window group are completely obscured,
// hiding the group holding them while the Overview is displayed greatly
// increases performance of the Overview especially when there are many
@@ -471,17 +301,38 @@ Overview.prototype = {
// clones of them, this would obviously no longer be necessary.
global.window_group.hide();
this._group.show();
this._background.show();
// Create a zoom out effect. First scale the Overview group up and
this.viewSelector.show();
this._workspacesDisplay.show();
this._dash.show();
this.workspaces = this._workspacesDisplay.workspacesView;
global.overlay_group.add_actor(this.workspaces.actor);
if (!this._desktopFade.child)
this._desktopFade.child = this._getDesktopClone();
if (!this.workspaces.getActiveWorkspace().hasMaximizedWindows()) {
this._desktopFade.opacity = 255;
this._desktopFade.show();
Tweener.addTween(this._desktopFade,
{ opacity: 0,
time: ANIMATION_TIME,
transition: 'easeOutQuad'
});
}
// Create a zoom out effect. First scale the workspaces view up and
// position it so that the active workspace fills up the whole screen,
// then transform the group to its normal dimensions and position.
// then transform it to its normal dimensions and position.
// The opposite transition is used in hide().
this._group.scaleX = this._group.scaleY = this.getZoomedInScale();
[this._group.x, this._group.y] = this.getZoomedInPosition();
this.workspaces.actor.scaleX = this.workspaces.actor.scaleY = this.getZoomedInScale();
[this.workspaces.actor.x, this.workspaces.actor.y] = this.getZoomedInPosition();
let primary = global.get_primary_monitor();
Tweener.addTween(this._group,
{ x: primary.x,
y: primary.y,
Tweener.addTween(this.workspaces.actor,
{ x: primary.x - this._group.x,
y: primary.y - this._group.y,
scaleX: 1,
scaleY: 1,
transition: 'easeOutQuad',
@@ -490,9 +341,9 @@ Overview.prototype = {
onCompleteScope: this
});
// Make Dash fade in so that it doesn't appear too big.
this._dash.actor.opacity = 0;
Tweener.addTween(this._dash.actor,
// Make the other elements fade in.
this._group.opacity = 0;
Tweener.addTween(this._group,
{ opacity: 255,
transition: 'easeOutQuad',
time: ANIMATION_TIME
@@ -508,16 +359,24 @@ Overview.prototype = {
this.animationInProgress = true;
this._hideInProgress = true;
if (this._activeDisplayPane != null)
this._activeDisplayPane.close();
if (!this.workspaces.getActiveWorkspace().hasMaximizedWindows()) {
this._desktopFade.opacity = 0;
this._desktopFade.show();
Tweener.addTween(this._desktopFade,
{ opacity: 255,
time: ANIMATION_TIME,
transition: 'easeOutQuad' });
}
this.workspaces.hide();
// Create a zoom in effect by transforming the Overview group so that
// Create a zoom in effect by transforming the workspaces view so that
// the active workspace fills up the whole screen. The opposite
// transition is used in show().
let scale = this.getZoomedInScale();
let [posX, posY] = this.getZoomedInPosition();
Tweener.addTween(this._group,
Tweener.addTween(this.workspaces.actor,
{ x: posX,
y: posY,
scaleX: scale,
@@ -528,8 +387,8 @@ Overview.prototype = {
onCompleteScope: this
});
// Make Dash fade out so that it doesn't appear to big.
Tweener.addTween(this._dash.actor,
// Make other elements fade out.
Tweener.addTween(this._group,
{ opacity: 0,
transition: 'easeOutQuad',
time: ANIMATION_TIME
@@ -565,6 +424,7 @@ Overview.prototype = {
return;
this.animationInProgress = false;
this._desktopFade.hide();
this._coverPane.lower_bottom();
this.emit('shown');
@@ -576,12 +436,12 @@ Overview.prototype = {
this.workspaces.destroy();
this.workspaces = null;
this._workspacesBar.destroy();
this._workspacesBar = null;
this._workspacesManager = null;
this._workspacesDisplay.hide();
this.viewSelector.hide();
this._dash.hide();
this._desktopFade.hide();
this._background.hide();
this._group.hide();
this.visible = false;
@@ -590,7 +450,7 @@ Overview.prototype = {
this._coverPane.lower_bottom();
Main.popModal(this._dash.actor);
Main.popModal(this.viewSelector.actor);
this.emit('hidden');
}
};

View File

@@ -33,6 +33,7 @@ const STANDARD_TRAY_ICON_ORDER = ['a11y', 'display', 'keyboard', 'volume', 'blue
const STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION = {
'a11y': imports.ui.status.accessibility.ATIndicator,
'volume': imports.ui.status.volume.Indicator,
'battery': imports.ui.status.power.Indicator
};
const CLOCK_FORMAT_KEY = 'format';

View File

@@ -72,17 +72,19 @@ SystemStatusButton.prototype = {
_init: function(iconName,tooltipText) {
Button.prototype._init.call(this, St.Align.START);
this._iconActor = null;
this.setIcon(iconName);
this._iconActor = new St.Icon({ icon_name: iconName,
icon_type: St.IconType.SYMBOLIC,
style_class: 'system-status-icon' });
this.actor.set_child(this._iconActor);
this.setTooltip(tooltipText);
},
setIcon: function(iconName) {
this._iconName = iconName;
if (this._iconActor)
this._iconActor.destroy();
this._iconActor = St.TextureCache.get_default().load_icon_name(this._iconName, St.IconType.SYMBOLIC, 24);
this.actor.set_child(this._iconActor);
this._iconActor.icon_name = iconName;
},
setGIcon: function(gicon) {
this._iconActor.gicon = gicon;
},
setTooltip: function(text) {
@@ -95,4 +97,4 @@ SystemStatusButton.prototype = {
this.tooltip = null;
}
}
};
};

View File

@@ -79,7 +79,7 @@ PlaceDeviceInfo.prototype = {
iconFactory: function(size) {
let icon = this._mount.get_icon();
return St.TextureCache.get_default().load_gicon(icon, size);
return St.TextureCache.get_default().load_gicon(null, icon, size);
},
launch: function() {
@@ -109,7 +109,7 @@ PlaceDeviceInfo.prototype = {
this._mount.unmount_finish(res);
} catch (e) {
let message = _("Failed to unmount '%s'").format(o.get_name());
Main.overview.infoBar.setMessage(message,
Main.overview.shellInfo.setMessage(message,
Lang.bind(this, this.remove),
_("Retry"));
}
@@ -137,7 +137,7 @@ PlacesManager.prototype = {
let homeIcon = Shell.util_get_icon_for_uri (homeUri);
this._home = new PlaceInfo('special:home', homeLabel,
function(size) {
return St.TextureCache.get_default().load_gicon(homeIcon, size);
return St.TextureCache.get_default().load_gicon(null, homeIcon, size);
},
function() {
Gio.app_info_launch_default_for_uri(homeUri, global.create_app_launch_context());
@@ -150,7 +150,7 @@ PlacesManager.prototype = {
let desktopIcon = Shell.util_get_icon_for_uri (desktopUri);
this._desktopMenu = new PlaceInfo('special:desktop', desktopLabel,
function(size) {
return St.TextureCache.get_default().load_gicon(desktopIcon, size);
return St.TextureCache.get_default().load_gicon(null, desktopIcon, size);
},
function() {
Gio.app_info_launch_default_for_uri(desktopUri, global.create_app_launch_context());
@@ -158,7 +158,9 @@ PlacesManager.prototype = {
this._connect = new PlaceInfo('special:connect', _("Connect to..."),
function (size) {
return St.TextureCache.get_default().load_icon_name('applications-internet', St.IconType.FULLCOLOR, size);
return new St.Icon({ icon_name: 'applications-internet',
icon_type: St.IconType.FULLCOLOR,
icon_size: size });
},
function () {
new Shell.Process({ args: ['nautilus-connect-server'] }).run();
@@ -325,7 +327,7 @@ PlacesManager.prototype = {
let item = new PlaceInfo('bookmark:' + bookmark, label,
function(size) {
return St.TextureCache.get_default().load_gicon(icon, size);
return St.TextureCache.get_default().load_gicon(null, icon, size);
},
function() {
Gio.app_info_launch_default_for_uri(bookmark, global.create_app_launch_context());
@@ -432,7 +434,9 @@ DashPlaceDisplayItem.prototype = {
box.add(text, { expand: true, x_fill: true });
if (info.isRemovable()) {
let removeIcon = St.TextureCache.get_default().load_icon_name ('media-eject', St.IconType.FULLCOLOR, PLACES_ICON_SIZE);
let removeIcon = new St.Icon({ icon_name: 'media-eject',
icon_type: St.IconType.FULLCOLOR,
icon_size: PLACES_ICON_SIZE });
let removeIconBox = new St.Clickable({ child: removeIcon,
reactive: true });
box.add(removeIconBox);

View File

@@ -296,15 +296,15 @@ PopupBaseMenuItem.prototype = {
};
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);
@@ -566,22 +566,16 @@ PopupImageMenuItem.prototype = {
_init: function (text, iconName) {
PopupBaseMenuItem.prototype._init.call(this);
this._size = 16;
this.label = new St.Label({ text: text });
this.addActor(this.label);
this._imageBin = new St.Bin({ width: this._size, height: this._size });
this.addActor(this._imageBin);
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
this.addActor(this._icon);
this.setIcon(iconName);
},
setIcon: function(name) {
if (this._imageBin.child)
this._imageBin.child.destroy();
let img = St.TextureCache.get_default().load_icon_name(name, St.IconType.SYMBOLIC, this._size);
this._imageBin.set_child(img);
this._icon.icon_name = name;
}
};
@@ -685,8 +679,11 @@ PopupMenu.prototype = {
}));
},
addMenuItem: function(menuItem) {
this._box.add(menuItem.actor);
addMenuItem: function(menuItem, position) {
if (position == undefined)
this._box.add(menuItem.actor);
else
this._box.insert_actor(menuItem.actor, position);
menuItem._activeChangeId = menuItem.connect('active-changed', Lang.bind(this, function (menuItem, active) {
if (active && this._activeMenuItem != menuItem) {
if (this._activeMenuItem)

View File

@@ -2,7 +2,7 @@
const Signals = imports.signals;
const RESULT_ICON_SIZE = 24;
const RESULT_ICON_SIZE = 48;
// Not currently referenced by the search API, but
// this enumeration can be useful for provider
@@ -182,7 +182,7 @@ SearchProvider.prototype = {
* implementation will show the icon next to the name.
*
* The actor should be an instance of St.Widget, with the style class
* 'dash-search-result-content'.
* 'search-result-content'.
*/
createResultActor: function(resultMeta, terms) {
return null;

332
js/ui/searchDisplay.js Normal file
View File

@@ -0,0 +1,332 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Gtk = imports.gi.Gtk;
const St = imports.gi.St;
const DND = imports.ui.dnd;
const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main;
const Search = imports.ui.search;
const MAX_SEARCH_RESULTS_ROWS = 2;
function SearchResult(provider, metaInfo, terms) {
this._init(provider, metaInfo, terms);
}
SearchResult.prototype = {
_init: function(provider, metaInfo, terms) {
this.provider = provider;
this.metaInfo = metaInfo;
this.actor = new St.Clickable({ style_class: 'search-result',
reactive: true,
x_align: St.Align.START,
y_fill: true });
this.actor._delegate = this;
let content = provider.createResultActor(metaInfo, terms);
if (content == null) {
content = new St.Bin({ style_class: 'search-result-content',
reactive: true,
track_hover: true });
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: Lang.bind(this, function(size) {
return this.metaInfo['icon'];
})});
content.set_child(icon.actor);
}
this._content = content;
this.actor.set_child(content);
this.actor.connect('clicked', Lang.bind(this, this._onResultClicked));
let draggable = DND.makeDraggable(this.actor);
draggable.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
}));
},
setSelected: function(selected) {
if (selected)
this._content.add_style_pseudo_class('selected');
else
this._content.remove_style_pseudo_class('selected');
},
activate: function() {
this.provider.activateResult(this.metaInfo.id);
Main.overview.toggle();
},
_onResultClicked: function(actor, event) {
this.activate();
},
getDragActorSource: function() {
return this.metaInfo['icon'];
},
getDragActor: function(stageX, stageY) {
return new Clutter.Clone({ source: this.metaInfo['icon'] });
},
shellWorkspaceLaunch: function() {
if (this.provider.dragActivateResult)
this.provider.dragActivateResult(this.metaInfo.id);
else
this.provider.activateResult(this.metaInfo.id);
}
};
function GridSearchResults(provider) {
this._init(provider);
}
GridSearchResults.prototype = {
__proto__: Search.SearchResultDisplay.prototype,
_init: function(provider) {
Search.SearchResultDisplay.prototype._init.call(this, provider);
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
this.actor = new St.Bin({ x_align: St.Align.START });
this.actor.set_child(this._grid.actor);
this.selectionIndex = -1;
},
getVisibleResultCount: function() {
return this._grid.visibleItemsCount();
},
renderResults: function(results, terms) {
for (let i = 0; i < results.length; i++) {
let result = results[i];
let meta = this.provider.getResultMeta(result);
let display = new SearchResult(this.provider, meta, terms);
this._grid.addItem(display.actor);
}
},
clear: function () {
this._grid.removeAll();
this.selectionIndex = -1;
},
selectIndex: function (index) {
let nVisible = this.getVisibleResultCount();
if (this.selectionIndex >= 0) {
let prevActor = this._grid.getItemAtIndex(this.selectionIndex);
prevActor._delegate.setSelected(false);
}
this.selectionIndex = -1;
if (index >= nVisible)
return false;
else if (index < 0)
return false;
let targetActor = this._grid.getItemAtIndex(index);
targetActor._delegate.setSelected(true);
this.selectionIndex = index;
return true;
},
activateSelected: function() {
if (this.selectionIndex < 0)
return;
let targetActor = this._grid.getItemAtIndex(this.selectionIndex);
targetActor._delegate.activate();
}
};
function SearchResults(searchSystem) {
this._init(searchSystem);
}
SearchResults.prototype = {
_init: function(searchSystem) {
this._searchSystem = searchSystem;
this.actor = new St.Bin({ name: 'searchResults',
y_align: St.Align.START,
x_align: St.Align.START,
x_fill: true });
this._content = new St.BoxLayout({ name: 'searchResultsContent',
vertical: true });
let scrollView = new St.ScrollView({ x_fill: true,
y_fill: false,
vshadows: true });
scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
scrollView.add_actor(this._content);
this.actor.set_child(scrollView);
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._content.add(this._statusText);
this._selectedProvider = -1;
this._providers = this._searchSystem.getProviders();
this._providerMeta = [];
for (let i = 0; i < this._providers.length; i++)
this.createProviderMeta(this._providers[i]);
},
createProviderMeta: function(provider) {
let providerBox = new St.BoxLayout({ style_class: 'search-section',
vertical: true });
let titleButton = new St.Button({ style_class: 'search-section-header',
reactive: true,
x_fill: true,
y_fill: true });
titleButton.connect('clicked', Lang.bind(this, function () { this._onHeaderClicked(provider); }));
providerBox.add(titleButton);
let titleBox = new St.BoxLayout();
titleButton.set_child(titleBox);
let title = new St.Label({ text: provider.title });
let count = new St.Label();
titleBox.add(title, { expand: true });
titleBox.add(count);
let resultDisplayBin = new St.Bin({ style_class: 'search-section-results',
x_fill: true,
y_fill: true });
providerBox.add(resultDisplayBin, { expand: true });
let resultDisplay = provider.createResultContainerActor();
if (resultDisplay == null) {
resultDisplay = new GridSearchResults(provider);
}
resultDisplayBin.set_child(resultDisplay.actor);
this._providerMeta.push({ actor: providerBox,
resultDisplay: resultDisplay,
count: count });
this._content.add(providerBox);
},
_clearDisplay: function() {
this._selectedProvider = -1;
this._visibleResultsCount = 0;
for (let i = 0; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i];
meta.resultDisplay.clear();
meta.actor.hide();
}
},
reset: function() {
this._searchSystem.reset();
this._statusText.hide();
this._clearDisplay();
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching..."));
this._statusText.show();
},
_metaForProvider: function(provider) {
return this._providerMeta[this._providers.indexOf(provider)];
},
updateSearch: function (searchString) {
let results = this._searchSystem.updateSearch(searchString);
this._clearDisplay();
if (results.length == 0) {
this._statusText.set_text(_("No matching results."));
this._statusText.show();
return true;
} else {
this._statusText.hide();
}
let terms = this._searchSystem.getTerms();
for (let i = 0; i < results.length; i++) {
let [provider, providerResults] = results[i];
let meta = this._metaForProvider(provider);
meta.actor.show();
meta.resultDisplay.renderResults(providerResults, terms);
meta.count.set_text('' + providerResults.length);
}
this.selectDown(false);
return true;
},
_onHeaderClicked: function(provider) {
provider.expandSearch(this._searchSystem.getTerms());
},
_modifyActorSelection: function(resultDisplay, up) {
let success;
let index = resultDisplay.getSelectionIndex();
if (up && index == -1)
index = resultDisplay.getVisibleResultCount() - 1;
else if (up)
index = index - 1;
else
index = index + 1;
return resultDisplay.selectIndex(index);
},
selectUp: function(recursing) {
for (let i = this._selectedProvider; i >= 0; i--) {
let meta = this._providerMeta[i];
if (!meta.actor.visible)
continue;
let success = this._modifyActorSelection(meta.resultDisplay, true);
if (success) {
this._selectedProvider = i;
return;
}
}
if (this._providerMeta.length > 0 && !recursing) {
this._selectedProvider = this._providerMeta.length - 1;
this.selectUp(true);
}
},
selectDown: function(recursing) {
let current = this._selectedProvider;
if (current == -1)
current = 0;
for (let i = current; i < this._providerMeta.length; i++) {
let meta = this._providerMeta[i];
if (!meta.actor.visible)
continue;
let success = this._modifyActorSelection(meta.resultDisplay, false);
if (success) {
this._selectedProvider = i;
return;
}
}
if (this._providerMeta.length > 0 && !recursing) {
this._selectedProvider = 0;
this.selectDown(true);
}
},
activateSelected: function() {
let current = this._selectedProvider;
if (current < 0)
return;
let meta = this._providerMeta[current];
let resultDisplay = meta.resultDisplay;
resultDisplay.activateSelected();
Main.overview.hide();
}
};

View File

@@ -17,16 +17,18 @@ const PopupMenu = imports.ui.popupMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const KEY_A11Y_DIR = "/desktop/gnome/accessibility";
const KEY_STICKY_KEYS_ENABLED = KEY_A11Y_DIR + "/keyboard/stickykeys_enable";
const KEY_BOUNCE_KEYS_ENABLED = KEY_A11Y_DIR + "/keyboard/bouncekeys_enable";
const KEY_SLOW_KEYS_ENABLED = KEY_A11Y_DIR + "/keyboard/slowkeys_enable";
const KEY_MOUSE_KEYS_ENABLED = KEY_A11Y_DIR + "/keyboard/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 KEY_FONT_DPI = "/desktop/gnome/font_rendering/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;
@@ -71,8 +73,6 @@ ATIndicator.prototype = {
PanelMenu.SystemStatusButton.prototype._init.call(this, 'preferences-desktop-accessibility', null);
let client = GConf.Client.get_default();
client.add_dir(KEY_A11Y_DIR, GConf.ClientPreloadType.PRELOAD_ONELEVEL, null);
client.notify_add(KEY_A11Y_DIR, Lang.bind(this, this._keyChanged), null, null);
client.add_dir(KEY_META_DIR, GConf.ClientPreloadType.PRELOAD_ONELEVEL, null);
client.notify_add(KEY_META_DIR, Lang.bind(this, this._keyChanged), null, null);
@@ -82,7 +82,7 @@ ATIndicator.prototype = {
let magnifier = this._buildMagItem();
this.menu.addMenuItem(magnifier);
let textZoom = this._buildFontItem(client);
let textZoom = this._buildFontItem();
this.menu.addMenuItem(textZoom);
let screenReader = this._buildItem(_("Screen Reader"), AT_SCREEN_READER_SCHEMA, 'startup');
@@ -94,16 +94,16 @@ ATIndicator.prototype = {
let visualBell = this._buildItemGConf(_("Visual Alerts"), client, KEY_VISUAL_BELL);
this.menu.addMenuItem(visualBell);
let stickyKeys = this._buildItemGConf(_("Sticky Keys"), client, KEY_STICKY_KEYS_ENABLED);
let stickyKeys = this._buildItem(_("Sticky Keys"), A11Y_SCHEMA, KEY_STICKY_KEYS_ENABLED);
this.menu.addMenuItem(stickyKeys);
let slowKeys = this._buildItemGConf(_("Slow Keys"), client, KEY_SLOW_KEYS_ENABLED);
let slowKeys = this._buildItem(_("Slow Keys"), A11Y_SCHEMA, KEY_SLOW_KEYS_ENABLED);
this.menu.addMenuItem(slowKeys);
let bounceKeys = this._buildItemGConf(_("Bounce Keys"), client, KEY_BOUNCE_KEYS_ENABLED);
let bounceKeys = this._buildItem(_("Bounce Keys"), A11Y_SCHEMA, KEY_BOUNCE_KEYS_ENABLED);
this.menu.addMenuItem(bounceKeys);
let mouseKeys = this._buildItemGConf(_("Mouse Keys"), client, KEY_MOUSE_KEYS_ENABLED);
let mouseKeys = this._buildItem(_("Mouse Keys"), A11Y_SCHEMA, KEY_MOUSE_KEYS_ENABLED);
this.menu.addMenuItem(mouseKeys);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
@@ -189,31 +189,32 @@ ATIndicator.prototype = {
return highContrast;
},
_buildFontItem: function(client) {
let first_gconf_value = client.get_without_default(KEY_FONT_DPI);
let default_value = getDPIFromX();
let first_value = first_gconf_value ? first_gconf_value.get_float() : default_value;
_buildFontItem: function() {
let settings = new Gio.Settings({ schema: XSETTINGS_SCHEMA });
// we assume this never changes (which is not true if resolution
// is changed, but we would need XRandR events for that)
let x_value = getDPIFromX();
let user_value;
function on_get() {
let u_dpi = client.get_float(KEY_FONT_DPI);
let x_dpi = getDPIFromX();
return (u_dpi - (DPI_FACTOR_LARGE * x_dpi) > -1);
user_value = settings.get_double(KEY_DPI);
return (user_value - (DPI_FACTOR_LARGE * x_value) > -1);
}
let initial_setting = on_get();
let default_value = initial_setting ? x_value : user_value;
let widget = this._buildItemExtended(_("Large Text"),
initial_setting,
client.key_is_writable(KEY_FONT_DPI),
settings.is_writable(KEY_DPI),
function (enabled) {
if (enabled)
client.set_float(KEY_FONT_DPI, DPI_FACTOR_LARGE * getDPIFromX());
settings.set_double(KEY_DPI, DPI_FACTOR_LARGE * default_value);
else
client.set_float(KEY_FONT_DPI, (first_value && !initial_setting) ? first_value : default_value);
settings.set_double(KEY_DPI, default_value);
});
this.connect('gconf-changed', function() {
settings.connect('changed::' + KEY_DPI, function() {
let active = on_get();
if (!active)
// setting was modified manually, update it
first_value = client.get_float(KEY_FONT_DPI);
widget.setToggleState(on_get());
default_value = active ? x_value : user_value;
widget.setToggleState(active);
});
return widget;
},

243
js/ui/status/power.js Normal file
View File

@@ -0,0 +1,243 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const DBus = imports.dbus;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const BUS_NAME = 'org.gnome.PowerManager';
const OBJECT_PATH = '/org/gnome/PowerManager';
const UPDeviceType = {
UNKNOWN: 0,
AC_POWER: 1,
BATTERY: 2,
UPS: 3,
MONITOR: 4,
MOUSE: 5,
KEYBOARD: 6,
PDA: 7,
PHONE: 8,
MEDIA_PLAYER: 9,
TABLET: 10,
COMPUTER: 11
};
const UPDeviceState = {
UNKNOWN: 0,
CHARGING: 1,
DISCHARGING: 2,
EMPTY: 3,
FULLY_CHARGED: 4,
PENDING_CHARGE: 5,
PENDING_DISCHARGE: 6
};
const PowerManagerInterface = {
name: 'org.gnome.PowerManager',
methods: [
{ name: 'GetDevices', inSignature: '', outSignature: 'a(susbut)' },
{ name: 'GetPrimaryDevice', inSignature: '', outSignature: '(susbut)' },
],
signals: [
{ name: 'Changed', outSignature: '' },
],
properties: [
{ name: 'Icon', signature: 's', access: 'read' },
]
};
let PowerManagerProxy = DBus.makeProxyClass(PowerManagerInterface);
function Indicator() {
this._init.apply(this, arguments);
}
Indicator.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
PanelMenu.SystemStatusButton.prototype._init.call(this, 'battery-missing');
this._proxy = new PowerManagerProxy(DBus.session, BUS_NAME, OBJECT_PATH);
this._deviceItems = [ ];
this._hasPrimary = false;
this._primaryDeviceId = null;
this._batteryItem = new PopupMenu.PopupMenuItem('');
this._primaryPercentage = new St.Label();
let percentBin = new St.Bin();
percentBin.set_child(this._primaryPercentage, { x_align: St.Align.END });
this._batteryItem.addActor(percentBin);
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');
});
this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged));
this._devicesChanged();
},
_readPrimaryDevice: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(device, error) {
if (error) {
this._checkError(error);
this._hasPrimary = false;
this._primaryDeviceId = null;
this._batteryItem.actor.hide();
this._deviceSep.actor.hide();
return;
}
let [device_id, device_type, icon, percentage, state, time] = device;
if (device_type == UPDeviceType.BATTERY) {
this._hasPrimary = true;
let minutes = Math.floor(time / 60);
this._batteryItem.label.text = Gettext.ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes);
this._primaryPercentage.text = '%d%%'.format(Math.round(percentage));
this._batteryItem.actor.show();
if (this._deviceItems.length > 0)
this._deviceSep.actor.show();
} else {
this._hasPrimary = false;
this._batteryItem.actor.hide();
this._deviceSep.actor.hide();
}
this._primaryDeviceId = device_id;
}));
},
_readOtherDevices: function() {
this._proxy.GetDevicesRemote(Lang.bind(this, function(devices, error) {
this._deviceItems.forEach(function(i) { i.destroy(); });
this._deviceItems = [];
if (error) {
this._checkError(error);
this._deviceSep.actor.hide();
return;
}
let position = 0;
for (let i = 0; i < devices.length; i++) {
let [device_id, device_type] = devices[i];
if (device_type == UPDeviceType.AC_POWER || device_id == this._primaryDeviceId)
continue;
let item = new DeviceItem (devices[i]);
item.connect('activate', function() {
let p = new Shell.Process({ args: ['gnome-power-statistics', '--device', device_id] });
p.run();
});
this._deviceItems.push(item);
this.menu.addMenuItem(item, this._otherDevicePosition + position);
position++;
}
if (this._hasPrimary && position > 0)
this._deviceSep.actor.show();
else
this._deviceSep.actor.hide();
}));
},
_devicesChanged: function() {
this._proxy.GetRemote('Icon', Lang.bind(this, function(icon, error) {
if (icon) {
let gicon = Shell.util_icon_from_string (icon);
this.setGIcon(gicon);
this.actor.show();
} else {
this._checkError(error);
this.menu.close();
this.actor.hide();
}
}));
this._readPrimaryDevice();
this._readOtherDevices();
},
_checkError: function(error) {
if (!this._restarted && error && error.message.match(/org\.freedesktop\.DBus\.Error\.(UnknownMethod|InvalidArgs)/)) {
GLib.spawn_command_line_sync('pkill -f "^gnome-power-manager$"');
GLib.spawn_command_line_async('gnome-power-manager');
this._restarted = true;
}
}
};
function DeviceItem() {
this._init.apply(this, arguments);
}
DeviceItem.prototype = {
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
_init: function(device) {
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
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: this._deviceTypeToString(device_type) });
this._icon = new St.Icon({ gicon: Shell.util_icon_from_string(icon),
icon_type: St.IconType.SYMBOLIC,
style_class: 'popup-menu-icon' });
this._box.add_actor(this._icon);
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);
},
_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(_("Output: 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,16 +51,15 @@ Indicator.prototype = {
this._input = null;
this._inputVolumeId = 0;
this._inputMutedId = 0;
this._inputSwitch = new PopupMenu.PopupSwitchMenuItem(_("Input: 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());
this.menu.addAction(_("Sound Preferences"), function() {
this.menu.addAction(_("Sound Settings"), function() {
let p = new Shell.Process({ args: ['gnome-control-center', 'sound'] });
p.run();
});
@@ -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 = _("Output: 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' ? _("Output: Muted") : _("Input: Muted"));
else
label = (property == '_output' ? _("Output: %3.0f%%") : _("Input: %3.0f%%")).format(this[property].volume / VOLUME_MAX * 100);
this[property+'Switch'].label.text = label;
}
};

View File

@@ -9,7 +9,9 @@ const NotificationDaemon = imports.ui.notificationDaemon;
const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'bluetooth-applet': 'bluetooth',
'gnome-volume-control-applet': 'volume',
'gnome-volume-control-applet': 'volume', // renamed to gnome-sound-applet
// when moved to control center
'gnome-sound-applet': 'volume',
'nm-applet': 'network',
'gnome-power-manager': 'battery',
'keyboard': 'keyboard',

View File

@@ -43,10 +43,10 @@ StatusMenuButton.prototype = {
box.add(this._iconBox, { y_align: St.Align.MIDDLE, y_fill: false });
let textureCache = St.TextureCache.get_default();
this._availableIcon = textureCache.load_icon_name('user-available', St.IconType.SYMBOLIC, 16);
this._busyIcon = textureCache.load_icon_name('user-busy', St.IconType.SYMBOLIC, 16);
this._invisibleIcon = textureCache.load_icon_name('user-invisible', St.IconType.SYMBOLIC, 16);
this._idleIcon = textureCache.load_icon_name('user-idle', St.IconType.SYMBOLIC, 16);
this._availableIcon = new St.Icon({ icon_name: 'user-available', style_class: 'popup-menu-icon' });
this._busyIcon = new St.Icon({ icon_name: 'user-busy', style_class: 'popup-menu-icon' });
this._invisibleIcon = new St.Icon({ icon_name: 'user-invisible', style_class: 'popup-menu-icon' });
this._idleIcon = new St.Icon({ icon_name: 'user-idle', style_class: 'popup-menu-icon' });
this._presence.connect('StatusChanged', Lang.bind(this, this._updatePresenceIcon));
this._presence.getStatus(Lang.bind(this, this._updatePresenceIcon));
@@ -108,19 +108,14 @@ StatusMenuButton.prototype = {
this.menu.addMenuItem(item);
this._presenceItems[GnomeSession.PresenceStatus.BUSY] = item;
item = new PopupMenu.PopupImageMenuItem(_("Invisible"), 'user-invisible', true);
item.connect('activate', Lang.bind(this, this._setPresenceStatus, GnomeSession.PresenceStatus.INVISIBLE));
this.menu.addMenuItem(item);
this._presenceItems[GnomeSession.PresenceStatus.INVISIBLE] = item;
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);
@@ -143,11 +138,7 @@ StatusMenuButton.prototype = {
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Suspend"));
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
this.menu.addMenuItem(item);
item = new PopupMenu.PopupMenuItem(_("Restart..."));
item = new PopupMenu.PopupMenuItem(_("Suspend..."));
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
this.menu.addMenuItem(item);
@@ -162,7 +153,7 @@ StatusMenuButton.prototype = {
_onMyAccountActivate: function() {
Main.overview.hide();
this._spawn(['gnome-about-me']);
this._spawn(['gnome-control-center', 'user-accounts']);
},
_onPreferencesActivate: 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;
@@ -347,7 +349,9 @@ ContactManager.prototype = {
let uri = GLib.filename_to_uri(file, null);
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
} else {
iconBox.child = textureCache.load_icon_name('stock_person', St.IconType.FULLCOLOR, iconBox._size);
iconBox.child = new St.Icon({ icon_name: 'stock_person',
icon_type: St.IconType.FULLCOLOR,
icon_size: iconBox._size });
}
},
@@ -529,7 +533,7 @@ Source.prototype = {
_messageReceived: function(channel, id, timestamp, sender,
type, flags, text) {
this._ensureNotification();
this._notification.appendMessage(text);
this._notification.appendMessage(text, timestamp);
this.notify(this._notification);
},
@@ -563,7 +567,7 @@ Source.prototype = {
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
this._ensureNotification();
this._notification.appendMessage(msg, true);
this._notification.appendPresence(msg, notify);
if (notify)
this.notify(this._notification);
}
@@ -584,23 +588,40 @@ Notification.prototype = {
this.setActionArea(this._responseEntry);
this._history = [];
this._timestampTimeoutId = 0;
},
appendMessage: function(text, asTitle) {
if (asTitle)
this.update(text, null, { customContent: true });
else
this.update(this.source.title, text, { customContent: true });
this._append(text, 'chat-received');
appendMessage: function(text, timestamp) {
this.update(this.source.title, text, { customContent: true });
this._append(text, 'chat-received', 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
@@ -609,17 +630,43 @@ 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. */
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.

628
js/ui/viewSelector.js Normal file
View File

@@ -0,0 +1,628 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Main = imports.ui.main;
const Search = imports.ui.search;
const SearchDisplay = imports.ui.searchDisplay;
const Tweener = imports.ui.tweener;
function SearchEntry() {
this._init();
}
SearchEntry.prototype = {
_init : function() {
this.actor = new St.Entry({ name: 'searchEntry',
hint_text: _("Search your computer") });
this.entry = this.actor.clutter_text;
this.actor.clutter_text.connect('text-changed', Lang.bind(this,
function() {
if (this.isActive())
this.actor.set_secondary_icon_from_file(global.imagedir +
'close-black.svg');
else
this.actor.set_secondary_icon_from_file(null);
}));
this.actor.connect('secondary-icon-clicked', Lang.bind(this,
function() {
this.reset();
}));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
global.stage.connect('notify::key-focus', Lang.bind(this, this._updateCursorVisibility));
this.pane = null;
this._capturedEventId = 0;
},
_updateCursorVisibility: function() {
let focus = global.stage.get_key_focus();
if (focus == global.stage || focus == this.entry)
this.entry.set_cursor_visible(true);
else
this.entry.set_cursor_visible(false);
},
show: function() {
if (this._capturedEventId == 0)
this._capturedEventId = global.stage.connect('captured-event',
Lang.bind(this, this._onCapturedEvent));
this.entry.set_cursor_visible(true);
this.entry.set_selection(0, 0);
},
hide: function() {
if (this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
},
reset: function () {
let [x, y, mask] = global.get_pointer();
let actor = global.stage.get_actor_at_pos (Clutter.PickMode.REACTIVE,
x, y);
// this.actor is never hovered directly, only its clutter_text and icon
let hovered = this.actor == actor.get_parent();
this.actor.set_hover(hovered);
this.entry.text = '';
// Return focus to the stage
global.stage.set_key_focus(null);
this.entry.set_cursor_visible(true);
this.entry.set_selection(0, 0);
},
getText: function () {
return this.entry.get_text().replace(/^\s+/g, '').replace(/\s+$/g, '');
},
// some search term has been entered
isActive: function() {
return this.actor.get_text() != '';
},
// the entry does not show the hint
_isActivated: function() {
return this.entry.text == this.actor.get_text();
},
_onCapturedEvent: function(actor, event) {
let source = event.get_source();
let panelEvent = source && Main.panel.actor.contains(source);
switch (event.type()) {
case Clutter.EventType.BUTTON_PRESS:
// the user clicked outside after activating the entry, but
// with no search term entered - cancel the search
if (source != this.entry && this.entry.text == '') {
this.reset();
// allow only panel events to continue
return !panelEvent;
}
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
let focus = global.stage.get_key_focus();
if (focus != global.stage && focus != this.entry)
return false;
let sym = event.get_key_symbol();
// If we have an active search, Escape cancels it - if we
// haven't, the key is ignored
if (sym == Clutter.Escape)
if (this._isActivated()) {
this.reset();
return true;
} else {
return false;
}
// Ignore non-printable keys
if (!Clutter.keysym_to_unicode(sym))
return false;
// Search started - move the key focus to the entry and
// "repeat" the event
if (!this._isActivated()) {
global.stage.set_key_focus(this.entry);
this.entry.event(event, false);
}
return false;
default:
// Suppress all other events outside the panel while the entry
// is activated and no search has been entered - any click
// outside the entry will cancel the search
return (this.entry.text == '' && !panelEvent);
}
},
_onDestroy: function() {
if (this._capturedEventId > 0) {
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
}
};
Signals.addSignalMethods(SearchEntry.prototype);
function BaseTab(titleActor, pageActor) {
this._init(titleActor, pageActor);
}
BaseTab.prototype = {
_init: function(titleActor, pageActor) {
this.title = titleActor;
this.page = new St.Bin({ child: pageActor,
x_align: St.Align.START,
y_align: St.Align.START,
x_fill: true,
y_fill: true,
style_class: 'view-tab-page' });
this.visible = false;
},
show: function() {
this.visible = true;
this.page.opacity = 0;
this.page.show();
Tweener.addTween(this.page,
{ opacity: 255,
time: 0.1,
transition: 'easeOutQuad' });
},
hide: function() {
this.visible = false;
Tweener.addTween(this.page,
{ opacity: 0,
time: 0.1,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.page.hide();
})
});
},
_activate: function() {
this.emit('activated');
}
};
Signals.addSignalMethods(BaseTab.prototype);
function ViewTab(label, pageActor) {
this._init(label, pageActor);
}
ViewTab.prototype = {
__proto__: BaseTab.prototype,
_init: function(label, pageActor) {
let titleActor = new St.Button({ label: label,
style_class: 'view-tab-title' });
titleActor.connect('clicked', Lang.bind(this, this._activate));
BaseTab.prototype._init.call(this, titleActor, pageActor);
}
};
function SearchTab() {
this._init();
}
SearchTab.prototype = {
__proto__: BaseTab.prototype,
_init: function() {
this._searchActive = false;
this._searchPending = false;
this._keyPressId = 0;
this._searchTimeoutId = 0;
this._searchSystem = new Search.SearchSystem();
this._searchEntry = new SearchEntry();
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
BaseTab.prototype._init.call(this,
this._searchEntry.actor,
this._searchResults.actor);
this._searchEntry.entry.connect('text-changed',
Lang.bind(this, this._onTextChanged));
this._searchEntry.entry.connect('activate', Lang.bind(this, function (se) {
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._doSearch();
}
this._searchResults.activateSelected();
return true;
}));
},
setFindAsYouType: function(enabled) {
if (enabled)
this._searchEntry.show();
else
this._searchEntry.hide();
},
show: function() {
BaseTab.prototype.show.call(this);
if (this._keyPressId == 0)
this._keyPressId = global.stage.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._keyPressId = 0;
}
this._searchEntry.reset();
},
addSearchProvider: function(provider) {
this._searchSystem.registerProvider(provider);
this._searchResults.createProviderMeta(provider);
},
_onTextChanged: function (se, prop) {
let searchPreviouslyActive = this._searchActive;
this._searchActive = this._searchEntry.isActive();
this._searchPending = this._searchActive && !searchPreviouslyActive;
if (this._searchPending) {
this._searchResults.startingSearch();
}
if (this._searchActive) {
this._activate();
} else {
this.emit('search-cancelled');
}
if (!this._searchActive) {
if (this._searchTimeoutId > 0) {
Mainloop.source_remove(this._searchTimeoutId);
this._searchTimeoutId = 0;
}
return;
}
if (this._searchTimeoutId > 0)
return;
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;
let symbol = event.get_key_symbol();
if (symbol == Clutter.Up) {
if (!this._searchActive)
return true;
this._searchResults.selectUp(false);
return true;
} else if (symbol == Clutter.Down) {
if (!this._searchActive)
return true;
this._searchResults.selectDown(false);
return true;
}
return false;
},
_doSearch: function () {
this._searchTimeoutId = 0;
let text = this._searchEntry.getText();
this._searchResults.updateSearch(text);
return false;
}
};
function ViewSelector() {
this._init();
}
ViewSelector.prototype = {
_init : function() {
this.actor = new St.BoxLayout({ name: 'viewSelector',
vertical: true });
// The tab bar is located at the top of the view selector and
// holds both "normal" tab labels and the search entry. The former
// is left aligned, the latter right aligned - unless the text
// direction is RTL, in which case the order is reversed.
this._tabBar = new Shell.GenericContainer();
this._tabBar.connect('get-preferred-width',
Lang.bind(this, this._getPreferredTabBarWidth));
this._tabBar.connect('get-preferred-height',
Lang.bind(this, this._getPreferredTabBarHeight));
this._tabBar.connect('allocate',
Lang.bind(this, this._allocateTabBar));
this.actor.add(this._tabBar);
// Box to hold "normal" tab labels
this._tabBox = new St.BoxLayout({ name: 'viewSelectorTabBar' });
this._tabBar.add_actor(this._tabBox);
// The searchArea just holds the entry
this._searchArea = new St.Bin({ name: 'searchArea' });
this._tabBar.add_actor(this._searchArea);
// The page area holds the tab pages. Every page is given the
// area's full allocation, so that the pages would appear on top
// of each other if the inactive ones weren't hidden.
this._pageArea = new Shell.Stack();
this.actor.add(this._pageArea, { x_fill: true,
y_fill: true,
expand: true });
this._tabs = [];
this._activeTab = null;
this._searchTab = new SearchTab();
this._searchArea.set_child(this._searchTab.title);
this._addTab(this._searchTab);
this._searchTab.connect('search-cancelled', Lang.bind(this,
function() {
this._switchTab(this._activeTab);
}));
this._keyPressId = 0;
this._itemDragBeginId = 0;
this._overviewHidingId = 0;
// Public constraints which may be used to tie actors' height or
// vertical position to the current tab's content; as the content's
// height and position depend on the view selector's style properties
// (e.g. font size, padding, spacing, ...) it would be extremely hard
// and ugly to get these from the outside. While it would be possible
// to use position and height properties directly, outside code would
// need to ensure that the content is properly allocated before
// accessing the properties.
this.constrainY = new Clutter.BindConstraint({ source: this._pageArea,
coordinate: Clutter.BindCoordinate.Y });
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
coordinate: Clutter.BindCoordinate.HEIGHT });
},
_addTab: function(tab) {
tab.page.hide();
this._pageArea.add_actor(tab.page);
tab.connect('activated', Lang.bind(this, function(tab) {
this._switchTab(tab);
}));
},
addViewTab: function(title, pageActor) {
let viewTab = new ViewTab(title, pageActor);
this._tabs.push(viewTab);
this._tabBox.add(viewTab.title);
this._addTab(viewTab);
},
_switchTab: function(tab) {
if (this._activeTab && this._activeTab.visible) {
if (this._activeTab == tab)
return;
this._activeTab.title.remove_style_pseudo_class('selected');
this._activeTab.hide();
}
if (tab != this._searchTab) {
tab.title.add_style_pseudo_class('selected');
this._activeTab = tab;
if (this._searchTab.visible) {
this._searchTab.hide();
}
}
if (!tab.visible)
tab.show();
// Pull a Meg Ryan:
if (Main.overview && Main.overview.workspaces) {
if (tab != this._tabs[0]) {
Tweener.addTween(Main.overview.workspaces.actor,
{ opacity: 0,
time: 0.1,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
Main.overview.workspaces.actor.hide();
Main.overview.workspaces.actor.opacity = 255;
})
});
} else {
Main.overview.workspaces.actor.opacity = 0;
Main.overview.workspaces.actor.show();
Tweener.addTween(Main.overview.workspaces.actor,
{ opacity: 255,
time: 0.1,
transition: 'easeOutQuad' });
}
}
},
_switchDefaultTab: function() {
if (this._tabs.length > 0)
this._switchTab(this._tabs[0]);
},
_nextTab: function() {
if (this._tabs.length == 0 ||
this._tabs[this._tabs.length - 1] == this._activeTab)
return;
for (let i = 0; i < this._tabs.length; i++)
if (this._tabs[i] == this._activeTab) {
this._switchTab(this._tabs[i + 1]);
return;
}
},
_prevTab: function() {
if (this._tabs.length == 0 || this._tabs[0] == this._activeTab)
return;
for (let i = 0; i < this._tabs.length; i++)
if (this._tabs[i] == this._activeTab) {
this._switchTab(this._tabs[i - 1]);
return;
}
},
_getPreferredTabBarWidth: function(box, forHeight, alloc) {
let children = box.get_children();
for (let i = 0; i < children.length; i++) {
let [childMin, childNat] = children[i].get_preferred_width(forHeight);
alloc.min_size += childMin;
alloc.natural_size += childNat;
}
},
_getPreferredTabBarHeight: function(box, forWidth, alloc) {
let children = box.get_children();
for (let i = 0; i < children.length; i++) {
let [childMin, childNatural] = children[i].get_preferred_height(forWidth);
if (childMin > alloc.min_size)
alloc.min_size = childMin;
if (childNatural > alloc.natural_size)
alloc.natural_size = childNatural;
}
},
_allocateTabBar: function(container, box, flags) {
let allocWidth = box.x2 - box.x1;
let allocHeight = box.y2 - box.y1;
let [searchMinWidth, searchNatWidth] = this._searchArea.get_preferred_width(-1);
let [barMinWidth, barNatWidth] = this._tabBox.get_preferred_width(-1);
let childBox = new Clutter.ActorBox();
childBox.y1 = 0;
childBox.y2 = allocHeight;
if (this.actor.get_direction() == St.TextDirection.RTL) {
childBox.x1 = allocWidth - barNatWidth;
childBox.x2 = allocWidth;
} else {
childBox.x1 = 0;
childBox.x2 = barNatWidth;
}
this._tabBox.allocate(childBox, flags);
if (this.actor.get_direction() == St.TextDirection.RTL) {
childBox.x1 = 0;
childBox.x2 = searchNatWidth;
} else {
childBox.x1 = allocWidth - searchNatWidth;
childBox.x2 = allocWidth;
}
this._searchArea.allocate(childBox, flags);
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function() {
this.constrainY.offset = this.actor.y;
}));
},
_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;
let modifiers = Shell.get_event_state(event);
let symbol = event.get_key_symbol();
if (symbol == Clutter.Escape) {
Main.overview.hide();
return true;
} else if (modifiers & Clutter.ModifierType.CONTROL_MASK) {
if (symbol == Clutter.Page_Up) {
if (!this._searchActive)
this._prevTab();
return true;
} else if (symbol == Clutter.Page_Down) {
if (!this._searchActive)
this._nextTab();
return true;
}
}
return false;
},
addSearchProvider: function(provider) {
this._searchTab.addSearchProvider(provider);
},
show: function() {
this._searchTab.setFindAsYouType(true);
if (this._itemDragBeginId == 0)
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
Lang.bind(this, this._switchDefaultTab));
if (this._overviewHidingId == 0)
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._switchDefaultTab();
},
hide: function() {
this._searchTab.setFindAsYouType(false);
if (this._keyPressId > 0) {
global.stage.disconnect(this._keyPressId);
this._keyPressId = 0;
}
if (this._itemDragBeginId > 0) {
Main.overview.disconnect(this._itemDragBeginId);
this._itemDragBeginId = 0;
}
if (this._overviewHidingId > 0) {
Main.overview.disconnect(this._overviewHidingId);
this._overviewHidingId = 0;
}
}
};
Signals.addSignalMethods(ViewSelector.prototype);

View File

@@ -20,9 +20,6 @@ const FOCUS_ANIMATION_TIME = 0.15;
const WINDOW_DND_SIZE = 256;
const FRAME_COLOR = new Clutter.Color();
FRAME_COLOR.from_pixel(0xffffffff);
const SCROLL_SCALE_AMOUNT = 100 / 5;
const LIGHTBOX_FADE_TIME = 0.1;
@@ -54,11 +51,6 @@ function _clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
// Spacing between workspaces. At the moment, the same spacing is used
// in both zoomed-in and zoomed-out views; this is slightly
// metaphor-breaking, but the alternatives are also weird.
const GRID_SPACING = 15;
const FRAME_SIZE = GRID_SPACING / 3;
function ScaledPoint(x, y, scaleX, scaleY) {
[this.x, this.y, this.scaleX, this.scaleY] = arguments;
@@ -140,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 () {
@@ -247,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();
@@ -283,82 +280,20 @@ 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');
}
};
Signals.addSignalMethods(WindowClone.prototype);
function DesktopClone(window) {
this._init(window);
}
DesktopClone.prototype = {
_init : function(window) {
this.actor = new Clutter.Group({ reactive: true });
let background = new Clutter.Clone({ source: Main.background.source });
this.actor.add_actor(background);
if (window) {
this._desktop = new Clutter.Clone({ source: window.get_texture() });
this.actor.add_actor(this._desktop);
this._desktop.hide();
} else {
this._desktop = null;
}
this.actor.connect('button-release-event',
Lang.bind(this, this._onButtonRelease));
},
zoomFromOverview: function(fadeInIcons) {
if (this._desktop == null)
return;
if (fadeInIcons) {
this._desktop.opacity = 0;
this._desktop.show();
Tweener.addTween(this._desktop,
{ opacity: 255,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' });
}
},
zoomToOverview: function(fadeOutIcons) {
if (this._desktop == null)
return;
if (fadeOutIcons) {
this._desktop.opacity = 255;
this._desktop.show();
Tweener.addTween(this._desktop,
{ opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this._desktop.hide();
})
});
} else {
this._desktop.hide();
}
},
_onButtonRelease : function (actor, event) {
this.emit('selected', event.get_time());
}
};
Signals.addSignalMethods(DesktopClone.prototype);
/**
* @windowClone: Corresponding window clone
* @parentActor: The actor which will be the parent of all overlay items
@@ -534,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;
},
@@ -561,7 +494,6 @@ WindowOverlay.prototype = {
this._parentActor.queue_relayout();
}
};
Signals.addSignalMethods(WindowOverlay.prototype);
const WindowPositionFlags = {
@@ -585,10 +517,20 @@ Workspace.prototype = {
// Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0);
this.actor = new Clutter.Group();
this.actor = new Clutter.Group({ reactive: true });
this.actor._delegate = this;
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('button-release-event', Lang.bind(this,
function(actor, event) {
// Only switch to the workspace when there's no application
// windows open. The problem is that it's too easy to miss
// an app window and get the wrong one focused.
if (this._windows.length == 0) {
this.metaWorkspace.activate(event.get_time());
Main.overview.hide();
}
}));
// Items in _windowOverlaysGroup should not be scaled, so we don't
// add them to this.actor, but to its parent whenever it changes
@@ -604,35 +546,10 @@ Workspace.prototype = {
let windows = global.get_window_actors().filter(this._isMyWindow, this);
// Find the desktop window
for (let i = 0; i < windows.length; i++) {
if (windows[i].meta_window.get_window_type() == Meta.WindowType.DESKTOP) {
this._desktop = new DesktopClone(windows[i]);
break;
}
}
// If there wasn't one, fake it
if (!this._desktop)
this._desktop = new DesktopClone();
this._desktop.connect('selected',
Lang.bind(this,
function(clone, time) {
// Only switch to the workspace when there's no application windows
// open (we always have one window for the desktop). The problem
// is that it's too easy to miss an app window and get the wrong
// one focused.
if (this._windows.length == 1) {
this.metaWorkspace.activate(time);
Main.overview.hide();
}
}));
this.actor.add_actor(this._desktop.actor);
// Create clones for remaining windows that should be
// visible in the Overview
this._windows = [this._desktop];
this._windowOverlays = [ null ];
this._windows = [];
this._windowOverlays = [];
for (let i = 0; i < windows.length; i++) {
if (this._isOverviewWindow(windows[i])) {
this._addWindowClone(windows[i]);
@@ -651,8 +568,6 @@ Workspace.prototype = {
this._visible = false;
this._frame = null;
this.leavingOverview = false;
},
@@ -714,9 +629,6 @@ Workspace.prototype = {
this._lightbox.show();
else
this._lightbox.hide();
if (this._frame)
this._frame.set_opacity(showLightbox ? 150 : 255);
},
/**
@@ -737,32 +649,6 @@ Workspace.prototype = {
this._lightbox.highlight(actor);
},
// Mark the workspace selected/not-selected
setSelected : function(selected) {
// Don't draw a frame if we only have one workspace
if (selected && global.screen.n_workspaces > 1) {
if (this._frame)
return;
// FIXME: do something cooler-looking using clutter-cairo
this._frame = new Clutter.Rectangle({ color: FRAME_COLOR });
this.actor.add_actor(this._frame);
this._frame.set_position(this._desktop.actor.x - FRAME_SIZE / this.actor.scale_x,
this._desktop.actor.y - FRAME_SIZE / this.actor.scale_y);
this._frame.set_size(this._desktop.actor.width + 2 * FRAME_SIZE / this.actor.scale_x,
this._desktop.actor.height + 2 * FRAME_SIZE / this.actor.scale_y);
this._frame.lower_bottom();
this._framePosHandler = this.actor.connect('notify::scale-x', Lang.bind(this, this._updateFramePosition));
} else {
if (!this._frame)
return;
this.actor.disconnect(this._framePosHandler);
this._frame.destroy();
this._frame = null;
}
},
/**
* setReactive:
* @reactive: %true iff the workspace should be reactive
@@ -770,14 +656,7 @@ Workspace.prototype = {
* Set the workspace (desktop) reactive
**/
setReactive: function(reactive) {
this._desktop.actor.reactive = reactive;
},
_updateFramePosition : function() {
this._frame.set_position(this._desktop.actor.x - FRAME_SIZE / this.actor.scale_x,
this._desktop.actor.y - FRAME_SIZE / this.actor.scale_y);
this._frame.set_size(this._desktop.actor.width + 2 * FRAME_SIZE / this.actor.scale_x,
this._desktop.actor.height + 2 * FRAME_SIZE / this.actor.scale_y);
this.actor.reactive = reactive;
},
_isCloneVisible: function(clone) {
@@ -788,7 +667,7 @@ Workspace.prototype = {
* _getVisibleClones:
*
* Returns a list WindowClone objects where the clone isn't filtered
* out by any application filter. The clone for the desktop is excluded.
* out by any application filter.
* The returned array will always be newly allocated; it is not in any
* defined order, and thus it's convenient to call .sort() with your
* choice of sorting function.
@@ -796,7 +675,7 @@ Workspace.prototype = {
_getVisibleClones: function() {
let visible = [];
for (let i = 1; i < this._windows.length; i++) {
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
if (!this._isCloneVisible(clone))
@@ -808,7 +687,7 @@ Workspace.prototype = {
},
_resetCloneVisibility: function () {
for (let i = 1; i < this._windows.length; i++) {
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
let overlay = this._windowOverlays[i];
@@ -1007,9 +886,9 @@ Workspace.prototype = {
let buttonOuterHeight, captionHeight;
let buttonOuterWidth = 0;
if (this._windowOverlays[1]) {
[buttonOuterHeight, captionHeight] = this._windowOverlays[1].chromeHeights();
buttonOuterWidth = this._windowOverlays[1].chromeWidth() / this.scale;
if (this._windowOverlays[0]) {
[buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights();
buttonOuterWidth = this._windowOverlays[0].chromeWidth() / this.scale;
} else
[buttonOuterHeight, captionHeight] = [0, 0];
buttonOuterHeight /= this.scale;
@@ -1128,8 +1007,6 @@ Workspace.prototype = {
},
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()]; });
@@ -1137,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);
@@ -1157,8 +1034,8 @@ Workspace.prototype = {
// be after the workspace animation finishes.
let [cloneX, cloneY] = clone.actor.get_position();
let [cloneWidth, cloneHeight] = clone.actor.get_size();
cloneX = this.gridX + this.scale * cloneX;
cloneY = this.gridY + this.scale * cloneY;
cloneX = this.x + this.scale * cloneX;
cloneY = this.y + this.scale * cloneY;
cloneWidth = this.scale * clone.actor.scale_x * cloneWidth;
cloneHeight = this.scale * clone.actor.scale_y * cloneHeight;
@@ -1172,7 +1049,7 @@ Workspace.prototype = {
},
_fadeInAllOverlays: function() {
for (let i = 1; i < this._windows.length; i++) {
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))
@@ -1182,7 +1059,7 @@ Workspace.prototype = {
},
_hideAllOverlays: function() {
for (let i = 1; i< this._windows.length; i++) {
for (let i = 0; i < this._windows.length; i++) {
let overlay = this._windowOverlays[i];
overlay.hide();
}
@@ -1197,8 +1074,8 @@ Workspace.prototype = {
let wsHeight = this.actor.height * this.scale;
let pointerHasMoved = (this._cursorX != x && this._cursorY != y);
let inWorkspace = (this.gridX < x && x < this.gridX + wsWidth &&
this.gridY < y && y < this.gridY + wsHeight);
let inWorkspace = (this.x < x && x < this.x + wsWidth &&
this.y < y && y < this.y + wsHeight);
if (pointerHasMoved && inWorkspace) {
// store current cursor position
@@ -1309,8 +1186,8 @@ Workspace.prototype = {
},
// check for maximized windows on the workspace
_haveMaximizedWindows: function() {
for (let i = 1; i < this._windows.length; i++) {
hasMaximizedWindows: function() {
for (let i = 0; i < this._windows.length; i++) {
let metaWindow = this._windows[i].metaWindow;
if (metaWindow.showing_on_its_workspace() &&
metaWindow.maximized_horizontally &&
@@ -1322,7 +1199,7 @@ Workspace.prototype = {
// Animate the full-screen to Overview transition.
zoomToOverview : function() {
this.actor.set_position(this.gridX, this.gridY);
this.actor.set_position(this.x, this.y);
this.actor.set_scale(this.scale, this.scale);
// Position and scale the windows.
@@ -1331,12 +1208,6 @@ Workspace.prototype = {
else
this.positionWindows(WindowPositionFlags.ZOOM);
let active = global.screen.get_active_workspace();
let fadeInIcons = (Main.overview.animationInProgress &&
active == this.metaWorkspace &&
!this._haveMaximizedWindows());
this._desktop.zoomToOverview(fadeInIcons);
this._visible = true;
},
@@ -1354,7 +1225,7 @@ Workspace.prototype = {
this._doneLeavingOverview));
// Position and scale the windows.
for (let i = 1; i < this._windows.length; i++) {
for (let i = 0; i < this._windows.length; i++) {
let clone = this._windows[i];
clone.zoomFromOverview();
@@ -1383,77 +1254,9 @@ Workspace.prototype = {
}
}
let active = global.screen.get_active_workspace();
let fadeOutIcons = (active == this.metaWorkspace &&
!this._haveMaximizedWindows());
this._desktop.zoomFromOverview(fadeOutIcons);
this._visible = false;
},
// Animates grid shrinking/expanding when a row or column
// of workspaces is added or removed
resizeToGrid : function (oldScale) {
this._hideAllOverlays();
Tweener.addTween(this.actor,
{ x: this.gridX,
y: this.gridY,
scale_x: this.scale,
scale_y: this.scale,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, this._fadeInAllOverlays)
});
},
// Animates the addition of a new (empty) workspace
slideIn : function(oldScale) {
if (this.gridCol > this.gridRow) {
this.actor.set_position(global.screen_width, this.gridY);
this.actor.set_scale(oldScale, oldScale);
} else {
this.actor.set_position(this.gridX, global.screen_height);
this.actor.set_scale(this.scale, this.scale);
}
Tweener.addTween(this.actor,
{ x: this.gridX,
y: this.gridY,
scale_x: this.scale,
scale_y: this.scale,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad'
});
this._visible = true;
},
// Animates the removal of a workspace
slideOut : function(onComplete) {
let destX = this.actor.x, destY = this.actor.y;
this._hideAllOverlays();
if (this.gridCol > this.gridRow)
destX = global.screen_width;
else
destY = global.screen_height;
Tweener.addTween(this.actor,
{ x: destX,
y: destY,
scale_x: this.scale,
scale_y: this.scale,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: onComplete
});
this._visible = false;
// Don't let the user try to select this workspace as it's
// making its exit.
this._desktop.reactive = false;
},
destroy : function() {
this.actor.destroy();
},
@@ -1475,7 +1278,7 @@ Workspace.prototype = {
// their parent (this.actor), but we might have a zoomed window
// which has been reparented to the stage - _windows[0] holds
// the desktop window, which is never reparented
for (let w = 1; w < this._windows.length; w++)
for (let w = 0; w < this._windows.length; w++)
this._windows[w].destroy();
this._windows = [];
},
@@ -1506,12 +1309,12 @@ Workspace.prototype = {
Lang.bind(this, this._onCloneSelected));
clone.connect('drag-begin',
Lang.bind(this, function(clone) {
this.emit('window-drag-begin', clone.actor);
Main.overview.beginWindowDrag();
overlay.hide();
}));
clone.connect('drag-end',
Lang.bind(this, function(clone) {
this.emit('window-drag-end', clone.actor);
Main.overview.endWindowDrag();
overlay.show();
}));
clone.connect('zoom-start',
@@ -1534,7 +1337,7 @@ Workspace.prototype = {
},
_onShowOverlayClose: function (windowOverlay) {
for (let i = 1; i < this._windowOverlays.length; i++) {
for (let i = 0; i < this._windowOverlays.length; i++) {
let overlay = this._windowOverlays[i];
if (overlay == windowOverlay)
continue;
@@ -1643,11 +1446,11 @@ function _workspaceRelativeModifier(workspace) {
}
return [ { name: 'x',
parameters: { workspacePos: workspace.gridX,
parameters: { workspacePos: workspace.x,
overviewPos: overviewPosX,
overviewScale: overviewScale } },
{ name: 'y',
parameters: { workspacePos: workspace.gridY,
parameters: { workspacePos: workspace.y,
overviewPos: overviewPosY,
overviewScale: overviewScale } }
];

File diff suppressed because it is too large Load Diff

View File

@@ -35,6 +35,7 @@ sv
ta
th
tr
ug
uk
vi
zh_CN

View File

@@ -15,9 +15,12 @@ js/ui/popupMenu.js
js/ui/runDialog.js
js/ui/statusMenu.js
js/ui/status/accessibility.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

207
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-11-29 17:32+0100\n"
"PO-Revision-Date: 2010-11-29 17:33+0100\n"
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
"Language-Team: Galician <gnome-gl-list@gnome.org>\n"
"Language: gl\n"
@@ -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:538
msgid "New Window"
msgstr "Xanela nova"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:542
msgid "Remove from Favorites"
msgstr "Eliminar dos favoritos"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:543
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,39 +568,31 @@ 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..."
@@ -669,14 +632,18 @@ 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
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Buscar no seu computador"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
@@ -687,14 +654,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 +687,53 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sons do sistema"
#: ../src/shell-global.c:1219
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Descoñecido"
#: ../src/shell-global.c:1163
msgid "Less than a minute ago"
msgstr "Hai menos dun minuto"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1167
#, 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:1172
#, 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:1177
#, 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:1182
#, 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 +742,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..."

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-11-20 14:39+0100\n"
"PO-Revision-Date: 2010-11-20 14:40+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@@ -344,19 +344,19 @@ msgstr "PROGRAMMER"
msgid "PREFERENCES"
msgstr "BRUKERVALG"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:647
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:651
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:652
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
#: ../js/ui/appDisplay.js:830
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "Dra hit for å legge til favoritter"
@@ -385,7 +385,7 @@ 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
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
@@ -429,58 +429,58 @@ msgid "Undo"
msgstr "Angre"
#. 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"
@@ -523,39 +523,31 @@ msgstr "Tilgjengelig"
msgid "Busy"
msgstr "Opptatt"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "Usynlig"
#: ../js/ui/statusMenu.js:119
#: ../js/ui/statusMenu.js:114
msgid "My Account..."
msgstr "Min konto..."
#: ../js/ui/statusMenu.js:123
msgid "System Preferences..."
msgstr "Brukervalg for systemet..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings..."
msgstr "Systeminnstillinger..."
#: ../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
#: ../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..."
@@ -595,11 +587,11 @@ 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
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "Zoom"
@@ -646,49 +638,53 @@ msgstr[1] "%u innganger"
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/shell-global.c:1204
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Ukjent"
#: ../src/shell-global.c:1158
msgid "Less than a minute ago"
msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1208
#: ../src/shell-global.c:1162
#, 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:1167
#, 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:1172
#, 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:1177
#, 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 +693,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"

862
po/ro.po
View File

@@ -1,20 +1,23 @@
# Romanian 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.
# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2009.
# Lucian Adrian Grijincu <lucian.grijincu@gmail.com>, 2009, 2010.
# Daniel Șerbănescu <cyber19rider@gmail.com>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-10-28 22:25+0200\n"
"PO-Revision-Date: 2009-10-28 22:33+0200\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-11-15 13:50+0000\n"
"PO-Revision-Date: 2010-11-15 22:34+0300\n"
"Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
"Language-Team: Romanian <gnomero-list@lists.sourceforge.net>\n"
"Language-Team: Romanian Gnome Team <gnomero-list@lists.sourceforge.net>\n"
"Language: ro\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < "
"20)) ? 1 : 2);;\n"
"X-Generator: Virtaal 0.6.1\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
@@ -24,199 +27,737 @@ msgstr "GNOME Shell"
msgid "Window management and application launching"
msgstr "Administrare de ferestre și lansare de aplicații"
#: ../js/ui/appDisplay.js:332
msgid "Frequent"
msgstr "Frecvent"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
msgstr "Ceas"
#: ../js/ui/appDisplay.js:867
msgid "Drag here to add favorites"
msgstr "Adăugați aici favorite cu mausul"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "Personalizați ceasul din panou"
#: ../js/ui/appIcon.js:426
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Permite accesul la informațiile interne utilitarelor de depanare și "
"monitorizare folosind dialogul Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "Format personalizat pentru ceas"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "Activează utilitarele interne pentru dezvoltatori și testeri din Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
msgstr "Extensia de fișier utilizată pentru stocarea înregistrărilor de ecran"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording screencasts."
msgstr "Frecvența de cadre utilizată pentru înregistrările de ecran."
#: ../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 ""
"Extensiile GNOME Shell au o proprietate uuid; această cheie listează "
"extensiile care nu ar trebui încărcate."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
msgstr "Istoricul dialogului de comenzi (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "Format oră"
#: ../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 ""
"Dacă este adevărat, și formatul este fie „12-hour” fie „24-hour”, pe lângă "
"oră, în ceas se afișează și data."
#: ../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 ""
"Dacă este adevărat, și formatul este fie „12-hour” fie „24-hour”, pe lângă "
"oră, în ceas se afișează și secundele."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "Dacă este adevărat, se afișează săptămâna ISO în calendar."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr "Listă de identificatori de fișiere desktop pentru aplicațiile favorite"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Modul de vizualizare a spațiilor de lucru în prezentarea generală"
#: ../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 ""
"Definește linia de asamblare GStreamer utilizată pentru a codifica "
"înregistrările. Folosiți aceeași sintaxă ca la gst-launch. Linia de "
"asamblare ar trebui să aibă o intrare neconectată unde va fi înregistrat "
"ecranul. În mod normal va avea o intrare neconectată și o ieșire care va fi "
"scrisă în fișierul de ieșire. Cu toate acestea, linia de asamblare poate să "
"aibă grijă de ieșirea proprie - aceasta ar putea fi utilizată pentru a "
"trimite ieșirea la un server icecast, shout2send sau un alt server similar. "
"Când este dezactivată, sau are o valoare vidă, se utilizează linia de "
"asamblare implicită. Aceasta este acum definită ca „videorate ! theoraenc ! "
"oggmux” și înregistrează în formatul Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show date in clock"
msgstr "Afișează data în ceas"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show the week date in the calendar"
msgstr "Afișează săptămâna în calendar"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid "Show time with seconds"
msgstr "Afișează timpul cu secunde "
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"Aplicațiile corespunzătoare acestor identificatori vor fi afișate în zona "
"favoritelor."
#: ../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 ""
"Numele de fișier ale înregistrărilor de ecran vor fi unice, bazate pe data "
"curentă și vor folosi această extensie. Ar trebui să fie modificată când se "
"înregistrează într-un format de container diferit."
#: ../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 ""
"Frecvența de cadre a înregistrărilor de ecran efectuare de Înregistratorul "
"de ecran al GNOME Shell, în cadre pe secundă."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
"Linia de asamblare gstreamer folosită pentru a codifica înregistrarea de "
"ecran"
#: ../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 ""
"Modul de vizualizare a spațiilor de lucru în prezentarea generală. Valorile "
"suportate sunt „single” și „grid”."
#: ../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 ""
"În mod normal, shell-ul monitorizează aplicațiile active pentru a le "
"prezenta pe cele mai utilizate (de ex. în lansatoare de aplicații). Deși "
"aceste date vor fi păstrate în mod privat, s-ar putea să doriți să "
"dezactivați această funcționalitate din motive de intimitate. Dezactivarea "
"nu va șterge datele deja salvate."
#: ../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 ""
"Această cheie specifică formatul utilizat în ceasul de panou când cheia de "
"format are valoarea „custom”. Puteți utiliza specificatorii de conversie "
"specifici strftime() pentru a obține un anumit format. Consultați manualul "
"strftime() pentru mai multe informații."
#: ../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 ""
"Această cheie specifică formatul orei afișate de ceasul din panou. Valorile "
"posibile sunt „12-hour”, „24-hour”, „unix” și „custom”. Dacă valoarea este "
"„unix”, ceasul va afișa timpul în secunde de la începutul Epocii Unix (1 "
"ianuarie 1970). Dacă valoarea este „custom”, ceasul va afișa timpul conform "
"formatului din cheia custom_format. Dacă valoarea este fie „unix” fie "
"„custom” se ignoră valoarea cheilor show_date și show_seconds."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
msgid "Uuids of extensions to disable"
msgstr "Uuid-urile extensiilor de dezactivat"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
msgid "Whether to collect stats about applications usage"
msgstr "Dacă să se colecteze statistici despre utilizarea aplicațiilor"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr "Prinde reticulele în centru"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
msgid "Color of the crosshairs"
msgstr "Culoarea reticulelor"
#: ../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 ""
"Determină lungimea liniilor verticale și orizontale care alcătuiesc "
"reticulele."
#: ../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 ""
"Determină poziția imaginii mărite a mausului în vizualizarea mărită și cum "
"reacționează la mișcarea mausului a sistemului. Valorile sunt - none: nu se "
"urmărește mausul; - centered: imaginea mausului este afișată în centrul "
"regiunii zoom (care reprezintă de asemenea punctul de sub mausul sistemului) "
"și proportional: poziția mausului mărit în regiunea zoom este proporțională "
"la fel ca poziția mausului sistemului de pe ecran; - push: când mausul "
"mărit intersectează o graniță a regiunii zoom, conținutul acesteia este "
"derulat în câmpul vizibil."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
msgid ""
"Determines the transparency of the crosshairs, from fully opaque to fully "
"transparent."
msgstr ""
"Determină transparența reticulelor, de la complet opac la deplin "
"transparente."
#: ../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 ""
"Determină dacă reticulele intersectează umbra mausului mărit, sau sunt "
"prinse astfel încât capetele liniilor orizontale și verticale înconjoară "
"imaginea mausului."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
msgid "Enable lens mode"
msgstr "Activează modul cu lupă"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
msgid ""
"Enables/disables display of crosshairs centered on the magnified mouse "
"sprite."
msgstr ""
"Activează/dezactivează afișarea reticulelor centrate pe umbra mausului "
"mărit."
#: ../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 ""
"Pentru urmărirea centrată a mausului, când indicatorul sistemului este pe "
"sau lângă marginea ecranului, conținutul mărit continuă să se deruleze "
"astfel încât marginile ecranului se mută în modul mărit."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
msgid "Length of the crosshairs"
msgstr "Lungimea reticulelor"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
msgid "Magnification factor"
msgstr "Factorul de mărire"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
msgid "Mouse Tracking Mode"
msgstr "Mod urmărire maus"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
msgid "Opacity of the crosshairs"
msgstr "Opacitatea reticulelor"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
msgid "Screen position"
msgstr "Poziția ecranului"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr "Derulează conținutul mărit în afara marginilor ecranului"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
msgstr "Arată sau ascunde reticulele"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
msgid "Show or hide the magnifier"
msgstr "Arată sau ascunde lupa"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
msgid "Show or hide the magnifier and all of its zoom regions."
msgstr "Arată sau ascunde lupa și toate regiunile ei de zoom."
#: ../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 "Culoarea liniilor verticale și orizontale ce compun reticul."
#: ../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 ""
"Vizualizarea mărită fie se aplică întregului ecran, fie ocupă jumătatea de "
"sus, jumătatea de jos, jumătatea din stânga, sau jumătatea din dreapta a "
"ecranului."
#: ../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 ""
"Factor de mărire. Valoarea 1.0 înseamnă afișare fără mărire sau "
"micșorare. Valoarea 2.0 dublează mărimea."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
msgid "Thickness of the crosshairs"
msgstr "Grosimea reticulelor"
#: ../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 ""
"Dacă vizualizarea mărită ar trebui centrată asupra locației mausului "
"sistemului și dacă ar trebui să se miște odată cu el."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr "Lățimea liniilor verticale și orizontale ce compun reticulele."
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "Format ceas"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "Preferințe ceas"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "Afișaj panou"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "Afișează secu_nde"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "Afișează _data"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "Format cu _12 ore"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "Format cu _24 de ore"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
msgid "APPLICATIONS"
msgstr "APPLICAȚII"
#: ../js/ui/appDisplay.js:348
msgid "PREFERENCES"
msgstr "PREFERINȚE"
#: ../js/ui/appDisplay.js:647
msgid "New Window"
msgstr "Fereastră nouă"
#: ../js/ui/appIcon.js:430
#: ../js/ui/appDisplay.js:651
msgid "Remove from Favorites"
msgstr "Șterge din favorite"
msgstr "Elimină de la favorite"
#: ../js/ui/appIcon.js:431
#: ../js/ui/appDisplay.js:652
msgid "Add to Favorites"
msgstr "Adaugă la favorite"
#: ../js/ui/dash.js:283
msgid "Find..."
msgstr "Caută..."
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "Trageți aici pentru a adăuga favorite"
#: ../js/ui/dash.js:400
msgid "More"
msgstr "Mai multe"
#: ../js/ui/appFavorites.js:88
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s a fost adăugat la favorite."
#: ../js/ui/dash.js:543
msgid "(see all)"
msgstr "(arată tot)"
#: ../js/ui/appFavorites.js:107
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s a fost eliminat de la favorite."
#. **** Applications ****
#: ../js/ui/dash.js:725 ../js/ui/dash.js:787
msgid "APPLICATIONS"
msgstr "APPLICAȚII"
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Caută"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Se caută..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Niciun rezultat care să se potrivească."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:745
msgid "PLACES"
msgstr "LOCAȚII"
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "LOCAȚII & DISPOZITIVE"
#. **** Documents ****
#: ../js/ui/dash.js:752 ../js/ui/dash.js:797
msgid "RECENT DOCUMENTS"
msgstr "DOCUMENTE RECENTE"
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "ELEMENTE RECENTE"
#. **** Search Results ****
#: ../js/ui/dash.js:777 ../js/ui/dash.js:961
msgid "SEARCH RESULTS"
msgstr "REZULTATELE CĂUTĂRII"
#: ../js/ui/lookingGlass.js:552
msgid "No extensions installed"
msgstr "Nicio extensie instalată"
#: ../js/ui/dash.js:792
msgid "PREFERENCES"
msgstr "PREFERINȚE"
#: ../js/ui/lookingGlass.js:589
msgid "Enabled"
msgstr "Activat"
#. 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:274
msgid "Activities"
msgstr "Activități"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Dezactivat"
#. Translators: This is a time format.
#: ../js/ui/panel.js:491
#: ../js/ui/lookingGlass.js:593
msgid "Error"
msgstr "Eroare"
#: ../js/ui/lookingGlass.js:595
msgid "Out of date"
msgstr "Învechit"
#: ../js/ui/lookingGlass.js:620
msgid "View Source"
msgstr "Vezi sursa"
#: ../js/ui/lookingGlass.js:626
msgid "Web Page"
msgstr "Pagină web"
#: ../js/ui/overview.js:160
msgid "Undo"
msgstr "Anulează"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#, c-format
msgid "Quit %s"
msgstr "Închide %s"
#: ../js/ui/panel.js:494
msgid "Preferences"
msgstr "Preferințe"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R:%S"
#: ../js/ui/panel.js:581
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
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:586
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 %e %b, %l:%M:%S %p"
#: ../js/ui/panel.js:594
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
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:599
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#: ../js/ui/places.js:178
#. 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
msgid "Activities"
msgstr "Activități"
#: ../js/ui/placeDisplay.js:111
#, c-format
msgid "Failed to unmount '%s'"
msgstr "Nu s-a putut demonta „%s”"
#: ../js/ui/placeDisplay.js:114
msgid "Retry"
msgstr "Reîncearcă"
#: ../js/ui/placeDisplay.js:159
msgid "Connect to..."
msgstr "Conectare la..."
#: ../js/ui/runDialog.js:96
#. 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-us"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
msgstr "Introduceți o comandă:"
#: ../js/ui/runDialog.js:173
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Execuția comenzii „%s” a eșuat:"
#. Translators: This is a time format.
#: ../js/ui/widget.js:163
msgid "%H:%M"
msgstr "%H:%M"
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "Disponibil"
#: ../js/ui/widget.js:317
msgid "Applications"
msgstr "Aplicații"
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "Ocupat"
#: ../js/ui/widget.js:339
msgid "Recent Documents"
msgstr "Documente recente"
#: ../js/ui/statusMenu.js:114
msgid "My Account..."
msgstr "Contul meu..."
#: ../src/shell-global.c:821
#: ../js/ui/statusMenu.js:118
msgid "System Settings..."
msgstr "Configurări sistem..."
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Blochează ecranul"
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Schimbă utilizatorul"
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Ieși din sesiune..."
#: ../js/ui/statusMenu.js:141
msgid "Suspend"
msgstr "Suspendă"
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Oprește..."
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Cititor de ecran"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr "Tastatură pe ecran"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr "Alerte vizuale"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr "Taste lipicioase"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "Taste încete"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "Taste fără repetiție"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "Taste maus"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr "Configurări acces universal"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr "Contrast puternic"
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Text mare"
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
msgstr "Pornirea %s s-a finalizat"
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "„%s” este gata"
#: ../js/ui/workspacesView.js:229
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Nu se poate adăuga un nou spațiu de lucru pentru că s-a atins limita maximă "
"a numărului de spații."
#: ../js/ui/workspacesView.js:246
msgid "Can't remove the first workspace."
msgstr "Nu se poate elimina primul spațiu de lucru."
#. 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] "o ieșire"
msgstr[1] "%u ieșiri"
msgstr[2] "%u de ieșiri"
#. 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] "o intrare"
msgstr[1] "%u intrări"
msgstr[2] "%u de intrări"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "Sunetele sistemului"
#: ../src/shell-global.c:1219
msgid "Less than a minute ago"
msgstr "În ultimul minut"
msgstr "Cu mai puțin de un minut în urmă"
#: ../src/shell-global.c:824
#: ../src/shell-global.c:1223
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "acum un minut"
msgstr[1] "acum %d minute"
msgstr[2] "acum %d de minute"
msgstr[0] "Acum un minut"
msgstr[1] "Acum %d minute"
msgstr[2] "Acum %d de minute"
#: ../src/shell-global.c:827
#: ../src/shell-global.c:1228
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "acum o oră"
msgstr[1] "acum %d ore"
msgstr[2] "acum %d de ore"
msgstr[0] "Acum o oră"
msgstr[1] "Acum %d ore"
msgstr[2] "Acum %d de ore"
#: ../src/shell-global.c:830
#: ../src/shell-global.c:1233
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "acum o zi"
msgstr[1] "acum %d zile"
msgstr[2] "acum %d de zile"
msgstr[0] "Acum o zi"
msgstr[1] "Acum %d zile"
msgstr[2] "Acum %d de zile"
#: ../src/shell-global.c:833
#: ../src/shell-global.c:1238
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "acum o săptămână"
msgstr[1] "acum %d săptămâni"
msgstr[2] "acum %d de săptămâni"
msgstr[0] "Acum o săptămână"
msgstr[1] "Acum %d săptămâni"
msgstr[2] "Acum %d de săptămâni"
#: ../src/shell-status-menu.c:156
msgid "Unknown"
msgstr "Necunoscut"
#: ../src/shell-status-menu.c:212
#, c-format
msgid "Can't lock screen: %s"
msgstr "Nu s-a putut bloca ecranul: %s"
#: ../src/shell-status-menu.c:227
#, c-format
msgid "Can't temporarily set screensaver to blank screen: %s"
msgstr "Nu s-a putut folosi temporar un ecran gol pentru economizorul de "
"ecran: %s"
#: ../src/shell-status-menu.c:351
#, c-format
msgid "Can't logout: %s"
msgstr "Nu se poate ieși din sesiune: %s"
#: ../src/shell-status-menu.c:492
msgid "Account Information..."
msgstr "Informații despre cont..."
#: ../src/shell-status-menu.c:502
msgid "Sidebar"
msgstr "Bară laterală"
#: ../src/shell-status-menu.c:510
msgid "System Preferences..."
msgstr "Preferințe de sistem..."
#: ../src/shell-status-menu.c:525
msgid "Lock Screen"
msgstr "Blocare ecran"
#: ../src/shell-status-menu.c:535
msgid "Switch User"
msgstr "Alt utilizator"
#. Only show switch user if there are other users
#. Log Out
#: ../src/shell-status-menu.c:546
msgid "Log Out..."
msgstr "Ieșire..."
#. Shut down
#: ../src/shell-status-menu.c:557
msgid "Shut Down..."
msgstr "Oprire..."
#: ../src/shell-uri-util.c:87
#: ../src/shell-uri-util.c:89
msgid "Home Folder"
msgstr "Dosar personal"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-uri-util.c:102
#: ../src/shell-uri-util.c:104
msgid "File System"
msgstr "Sistem de fișiere"
#: ../src/shell-uri-util.c:248
#: ../src/shell-uri-util.c:250
msgid "Search"
msgstr "Caută"
@@ -225,8 +766,59 @@ msgstr "Caută"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:298
#: ../src/shell-uri-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "ON"
#~ msgstr "Pornit"
#~ msgid "OFF"
#~ msgstr "Oprit"
#~ msgid "Invisible"
#~ msgstr "Invizibil"
#~ msgid "Account Information..."
#~ msgstr "Informații despre cont..."
#~ msgid "Frequent"
#~ msgstr "Frecvent"
#~ msgid "More"
#~ msgstr "Mai multe"
#~ msgid "(see all)"
#~ msgstr "(arată tot)"
#~ msgid "PLACES"
#~ msgstr "LOCAȚII"
#~ msgid "SEARCH RESULTS"
#~ msgstr "REZULTATELE CĂUTĂRII"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Applications"
#~ msgstr "Aplicații"
#~ msgid "Recent Documents"
#~ msgstr "Documente recente"
#~ msgid "Unknown"
#~ msgstr "Necunoscut"
#~ msgid "Can't lock screen: %s"
#~ msgstr "Nu s-a putut bloca ecranul: %s"
#~ msgid "Can't temporarily set screensaver to blank screen: %s"
#~ msgstr ""
#~ "Nu s-a putut folosi temporar un ecran gol pentru economizorul de ecran: %s"
#~ msgid "Can't logout: %s"
#~ msgstr "Nu se poate ieși din sesiune: %s"
#~ msgid "Sidebar"
#~ msgstr "Bară laterală"

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 "ข้อมูลบัญชี..."

744
po/ug.po Normal file
View File

@@ -0,0 +1,744 @@
# 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-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"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "GNOME Shell"
#: ../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 ""
"ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن "
"ئاتى "
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording 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 خاسلىقى بار؛ بۇ كۇنۇپكا "
"يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
#: ../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 ""
"ئەگەر راست (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 سائەت» "
"كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ. "
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپتە چېسلانى كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
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 "
"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 ""
"ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان 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"
msgstr "سائەت ئىچىدە چېسلا كۆرسەت"
#: ../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 ""
"GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى "
"كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
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 ""
"قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە "
"بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»"
#: ../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 ""
"چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار"
"(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي "
"ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق "
"قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
#: ../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 ""
"format (فورمات) كۇنۇپكىسى \"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\" يەنى (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 سى"
#: ../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 ""
#: ../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 "سائەت فورماتى"
#: ../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 "سېكۇنتنى كۆرسەت(_N)"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "چېسلانى كۆرسەت(_D)"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "_12 سائەت فورماتى"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "_24 سائەت فورماتى"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
msgid "APPLICATIONS"
msgstr "پروگراممىلار"
#: ../js/ui/appDisplay.js:348
msgid "PREFERENCES"
msgstr "مايىللىق"
#: ../js/ui/appDisplay.js:647
msgid "New Window"
msgstr "يېڭى كۆزنەك"
#: ../js/ui/appDisplay.js:651
msgid "Remove from Favorites"
msgstr "يىغقۇچتىن چىقىرىۋەت"
#: ../js/ui/appDisplay.js:652
msgid "Add to Favorites"
msgstr "يىغقۇچقا قوش"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:88
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:107
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
#: ../js/ui/dash.js:142
msgid "Find"
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:558
msgid "PLACES & DEVICES"
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../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:160
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 "%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: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 "باغلىنىش…"
#. 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-us"
#: ../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
#, fuzzy
#| msgid "My Account..."
msgid "My Account"
msgstr "ھېساباتىم…"
#: ../js/ui/statusMenu.js:118
#, fuzzy
#| 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
#, fuzzy
#| msgid "Suspend"
msgid "Suspend..."
msgstr "توڭلات"
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
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 "Sticky Keys"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "Slow Keys"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "Bounce Keys"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "Mouse Keys"
#: ../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 "%s باشلاشنى تاماملىدى"
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr "«%s» تەييار"
#: ../js/ui/workspacesView.js:229
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "يېڭى خىزمەت رايونى قوشالمايدۇ چۈنكى ئەڭ كۆپ خىزمەت رايون چېكىگە يەتتى."
#: ../js/ui/workspacesView.js:246
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 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:1167
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d مىنۇت ئىلگىرى"
#: ../src/shell-global.c:1172
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d سائەت ئىلگىرى"
#: ../src/shell-global.c:1177
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d كۈن ئىلگىرى"
#: ../src/shell-global.c:1182
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "%d ھەپتە ئىلگىرى"
#: ../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 "Invisible"
#~ msgstr "يوشۇرۇن"

View File

@@ -79,6 +79,8 @@ st_source_h = \
st/st-entry.h \
st/st-focus-manager.h \
st/st-group.h \
st/st-icon.h \
st/st-icon-colors.h \
st/st-im-text.h \
st/st-label.h \
st/st-overflow-box.h \
@@ -87,7 +89,6 @@ st_source_h = \
st/st-scroll-bar.h \
st/st-scroll-view.h \
st/st-shadow.h \
st/st-subtexture.h \
st/st-table.h \
st/st-table-child.h \
st/st-texture-cache.h \
@@ -129,6 +130,8 @@ st_source_c = \
st/st-entry.c \
st/st-focus-manager.c \
st/st-group.c \
st/st-icon.c \
st/st-icon-colors.c \
st/st-im-text.c \
st/st-label.c \
st/st-overflow-box.c \
@@ -137,7 +140,6 @@ st_source_c = \
st/st-scroll-bar.c \
st/st-scroll-view.c \
st/st-shadow.c \
st/st-subtexture.c \
st/st-table.c \
st/st-table-child.c \
st/st-texture-cache.c \

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)|" \
@@ -77,7 +75,7 @@ shell_public_headers_h = \
shell-stack.h \
shell-tray-icon.h \
shell-tray-manager.h \
shell-uri-util.h \
shell-util.h \
shell-window-tracker.h \
shell-wm.h \
shell-xfixes-cursor.h
@@ -109,7 +107,7 @@ libgnome_shell_la_SOURCES = \
shell-stack.c \
shell-tray-icon.c \
shell-tray-manager.c \
shell-uri-util.c \
shell-util.c \
shell-window-tracker.c \
shell-wm.c \
shell-xfixes-cursor.c
@@ -117,6 +115,8 @@ libgnome_shell_la_SOURCES = \
libgnome_shell_la_gir_sources = \
$(filter-out %-private.h $(shell_recorder_non_gir_sources), $(shell_public_headers_h) $(libgnome_shell_la_SOURCES))
########################################
shell_recorder_sources = \
shell-recorder.c \
shell-recorder.h
@@ -139,6 +139,35 @@ test_recorder_SOURCES = \
test-recorder.c
endif BUILD_RECORDER
########################################
# In order to run the interactive tests for GUI components, we need to have
# an executable that exports the St components. Libtool doesn't have a way
# to include all the symbols from a convenience library into a executable
# so what we do is build a small uninstalled library that pulls in the
# St convenience library and link the test running program to that.
noinst_LTLIBRARIES += libjs-test.la
libjs_test_la_LDFLAGS = -rpath $(libdir)
libjs_test_la_CPPFLAGS = $(JS_TEST_CFLAGS)
libjs_test_la_LIBADD = $(JS_TEST_LIBS) libst-1.0.la
# The tests use or reference a couple of Shell classes
libjs_test_la_SOURCES = \
shell-generic-container.c \
shell-perf-log.c
noinst_PROGRAMS += run-js-test
run_js_test_CPPFLAGS = $(JS_TEST_CFLAGS)
run_js_test_LDADD = $(JS_TEST_LIBS) libjs-test.la
run_js_test_LDFLAGS = -export-dynamic
run_js_test_SOURCES = \
run-js-test.c
########################################
shell-marshal.h: stamp-shell-marshal.h
@true

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'),
@@ -717,6 +717,7 @@ function main() {
''')
f.close()
print "Created extension in %r" % (extension_path, )
subprocess.Popen(['gnome-open', extensionjs_path])
sys.exit(0)

144
src/run-js-test.c Normal file
View File

@@ -0,0 +1,144 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Based on gjs/console.c from GJS
*
* Copyright (c) 2008 litl, LLC
* Copyright (c) 2010 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include <config.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <clutter/x11/clutter-x11.h>
#include <string.h>
#include <stdlib.h>
#include <locale.h>
#include <gjs/gjs.h>
static char **include_path = NULL;
static char *command = NULL;
static GOptionEntry entries[] = {
{ "command", 'c', 0, G_OPTION_ARG_STRING, &command, "Program passed in as a string", "COMMAND" },
{ "include-path", 'I', 0, G_OPTION_ARG_STRING_ARRAY, &include_path, "Add the directory DIR to the list of directories to search for js files.", "DIR" },
{ NULL }
};
static GdkFilterReturn
event_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
XEvent *xev = (XEvent *)xevent;
if (clutter_x11_handle_event (xev) == CLUTTER_X11_FILTER_CONTINUE)
return GDK_FILTER_CONTINUE;
else
return GDK_FILTER_REMOVE;
}
int
main(int argc, char **argv)
{
char *command_line;
GOptionContext *context;
ClutterActor *stage;
GError *error = NULL;
GjsContext *js_context;
char *script;
const char *filename;
char *title;
gsize len;
int code;
g_thread_init (NULL);
gtk_init (&argc, &argv);
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
clutter_x11_disable_event_retrieval ();
clutter_init (&argc, &argv);
gdk_window_add_filter (NULL, event_filter, NULL);
context = g_option_context_new (NULL);
/* pass unknown through to the JS script */
g_option_context_set_ignore_unknown_options (context, TRUE);
g_option_context_add_main_entries (context, entries, NULL);
if (!g_option_context_parse (context, &argc, &argv, &error))
g_error ("option parsing failed: %s", error->message);
setlocale (LC_ALL, "");
g_type_init ();
command_line = g_strjoinv (" ", argv);
g_debug ("Command line: %s", command_line);
g_free (command_line);
g_debug ("Creating new context to eval console script");
js_context = gjs_context_new_with_search_path (include_path);
/* prepare command line arguments */
if (!gjs_context_define_string_array (js_context, "ARGV",
argc - 2, (const char**)argv + 2,
&error)) {
g_printerr ("Failed to defined ARGV: %s", error->message);
exit (1);
}
if (command != NULL) {
script = command;
len = strlen (script);
filename = "<command line>";
} else if (argc <= 1) {
script = g_strdup ("const Console = imports.console; Console.interact();");
len = strlen (script);
filename = "<stdin>";
} else /*if (argc >= 2)*/ {
error = NULL;
if (!g_file_get_contents (argv[1], &script, &len, &error)) {
g_printerr ("%s\n", error->message);
exit (1);
}
filename = argv[1];
}
stage = clutter_stage_get_default ();
title = g_filename_display_basename (filename);
clutter_stage_set_title (CLUTTER_STAGE (stage), title);
g_free (title);
/* evaluate the script */
error = NULL;
if (!gjs_context_eval (js_context, script, len,
filename, &code, &error)) {
g_free (script);
g_printerr ("%s\n", error->message);
exit (1);
}
g_free (script);
exit (code);
}

View File

@@ -9,11 +9,12 @@
#include <gio/gdesktopappinfo.h>
#include <gtk/gtk.h>
#include <clutter/clutter.h>
#include <glib/gi18n.h>
#include "shell-app-private.h"
#include "shell-global.h"
#include "st/st-texture-cache.h"
#include "display.h"
#include "st.h"
#define GMENU_I_KNOW_THIS_IS_UNSTABLE
#include <gmenu-tree.h>
@@ -1004,11 +1005,12 @@ shell_app_info_get_name (ShellAppInfo *info)
return g_key_file_get_locale_string (info->keyfile, DESKTOP_ENTRY_GROUP, "Name", NULL, NULL);
case SHELL_APP_INFO_TYPE_WINDOW:
{
char *title;
g_object_get (info->window, "title", &title, NULL);
if (!title)
title = g_strdup ("");
return title;
const char *name;
name = meta_window_get_wm_class (info->window);
if (!name)
name = _("Unknown");
return g_strdup (name);
}
}
g_assert_not_reached ();
@@ -1272,7 +1274,7 @@ shell_app_info_create_icon_texture (ShellAppInfo *info, float size)
}
else
{
ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), icon, (int)size);
ret = st_texture_cache_load_gicon (st_texture_cache_get_default (), NULL, icon, (int)size);
g_object_unref (icon);
}

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

@@ -35,7 +35,6 @@
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data);
static void update_root_window_pixmap (ShellGlobal *global);
struct _ShellGlobal {
GObject parent;
@@ -86,6 +85,7 @@ enum {
PROP_STAGE,
PROP_STAGE_INPUT_MODE,
PROP_WINDOW_GROUP,
PROP_BACKGROUND_ACTOR,
PROP_WINDOW_MANAGER,
PROP_SETTINGS,
PROP_DATADIR,
@@ -160,6 +160,9 @@ shell_global_get_property(GObject *object,
case PROP_WINDOW_GROUP:
g_value_set_object (value, meta_plugin_get_window_group (global->plugin));
break;
case PROP_BACKGROUND_ACTOR:
g_value_set_object (value, meta_plugin_get_background_actor (global->plugin));
break;
case PROP_WINDOW_MANAGER:
g_value_set_object (value, global->wm);
break;
@@ -298,6 +301,13 @@ shell_global_class_init (ShellGlobalClass *klass)
"Actor holding window actors",
CLUTTER_TYPE_ACTOR,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_BACKGROUND_ACTOR,
g_param_spec_object ("background-actor",
"Background Actor",
"Actor drawing root window background",
CLUTTER_TYPE_ACTOR,
G_PARAM_READABLE));
g_object_class_install_property (gobject_class,
PROP_WINDOW_MANAGER,
g_param_spec_object ("window-manager",
@@ -487,6 +497,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 ();
}
@@ -506,6 +519,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;
@@ -1122,77 +1137,6 @@ grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
shell_global_set_stage_input_mode (global, global->input_mode);
}
/*
* Updates the global->root_pixmap actor with the root window's pixmap or fails
* with a warning.
*/
static void
update_root_window_pixmap (ShellGlobal *global)
{
Atom type;
int format;
gulong nitems;
gulong bytes_after;
guchar *data;
Pixmap root_pixmap_id = None;
if (!XGetWindowProperty (gdk_x11_get_default_xdisplay (),
gdk_x11_get_default_root_xwindow (),
gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID"),
0, LONG_MAX,
False,
AnyPropertyType,
&type, &format, &nitems, &bytes_after, &data) &&
type != None)
{
/* Got a property. */
if (type == XA_PIXMAP && format == 32 && nitems == 1)
{
/* Was what we expected. */
root_pixmap_id = *(Pixmap *)data;
}
else
{
g_warning ("Could not get the root window pixmap");
}
XFree(data);
}
clutter_x11_texture_pixmap_set_pixmap (CLUTTER_X11_TEXTURE_PIXMAP (global->root_pixmap),
root_pixmap_id);
}
/*
* Called when the X server emits a root window change event. If the event is
* about a new pixmap, update the global->root_pixmap actor.
*/
static GdkFilterReturn
root_window_filter (GdkXEvent *native, GdkEvent *event, gpointer data)
{
XEvent *xevent = (XEvent *)native;
if ((xevent->type == PropertyNotify) &&
(xevent->xproperty.window == gdk_x11_get_default_root_xwindow ()) &&
(xevent->xproperty.atom == gdk_x11_get_xatom_by_name ("_XROOTPMAP_ID")))
update_root_window_pixmap (SHELL_GLOBAL (data));
return GDK_FILTER_CONTINUE;
}
/*
* Called when the root window pixmap actor is destroyed.
*/
static void
root_pixmap_destroy (GObject *sender, gpointer data)
{
ShellGlobal *global = SHELL_GLOBAL (data);
gdk_window_remove_filter (gdk_get_default_root_window (),
root_window_filter, global);
global->root_pixmap = NULL;
}
/**
* shell_global_format_time_relative_pretty:
* @global:
@@ -1241,80 +1185,6 @@ shell_global_format_time_relative_pretty (ShellGlobal *global,
}
}
/**
* shell_global_create_root_pixmap_actor:
* @global: a #ShellGlobal
*
* Creates an actor showing the root window pixmap.
*
* Return value: (transfer none): a #ClutterActor with the root window pixmap.
* The actor is floating, hence (transfer none).
*/
ClutterActor *
shell_global_create_root_pixmap_actor (ShellGlobal *global)
{
GdkWindow *window;
ClutterActor *stage;
ClutterColor stage_color;
/* The actor created is actually a ClutterClone of global->root_pixmap. */
if (global->root_pixmap == NULL)
{
global->root_pixmap = clutter_glx_texture_pixmap_new ();
clutter_actor_set_size (CLUTTER_ACTOR (global->root_pixmap),
global->last_change_screen_width,
global->last_change_screen_height);
clutter_texture_set_repeat (CLUTTER_TEXTURE (global->root_pixmap),
TRUE, TRUE);
/* The low and medium quality filters give nearest-neighbor resizing. */
clutter_texture_set_filter_quality (CLUTTER_TEXTURE (global->root_pixmap),
CLUTTER_TEXTURE_QUALITY_HIGH);
/* Initialize to the stage color, since that's what will be seen
* in the main view if there's no actual background window.
*/
stage = meta_plugin_get_stage (global->plugin);
clutter_stage_get_color (CLUTTER_STAGE (stage), &stage_color);
clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE (global->root_pixmap),
/* ClutterColor has the same layout
* as one pixel of RGB(A) data.
*/
(const guchar *)&stage_color, FALSE,
/* w, h, rowstride, bpp, flags */
1, 1, 3, 3, 0, NULL);
/* We can only clone an actor within a stage, so we hide the source
* texture then add it to the stage */
clutter_actor_hide (global->root_pixmap);
clutter_container_add_actor (CLUTTER_CONTAINER (stage),
global->root_pixmap);
/* This really should never happen; but just in case... */
g_signal_connect (global->root_pixmap, "destroy",
G_CALLBACK (root_pixmap_destroy), global);
/* Metacity handles changes to some root window properties in its global
* event filter, though not _XROOTPMAP_ID. For all root window property
* changes, the global filter returns GDK_FILTER_CONTINUE, so our
* window specific filter will be called after the global one.
*
* Because Metacity is already handling root window property updates,
* we don't have to worry about adding the PropertyChange mask to the
* root window to get PropertyNotify events.
*/
window = gdk_get_default_root_window ();
gdk_window_add_filter (window, root_window_filter, global);
update_root_window_pixmap (global);
}
return clutter_clone_new (global->root_pixmap);
}
/**
* shell_global_get_monitors:
* @global: the #ShellGlobal

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,
@@ -89,8 +90,6 @@ void shell_global_maybe_gc (ShellGlobal *global);
void shell_global_format_time_relative_pretty (ShellGlobal *global, guint delta, char **text, guint *next_update);
ClutterActor *shell_global_create_root_pixmap_actor (ShellGlobal *global);
GSList *shell_global_get_monitors (ShellGlobal *global);
MetaRectangle *shell_global_get_primary_monitor (ShellGlobal *global);
MetaRectangle *shell_global_get_focus_monitor (ShellGlobal *global);

View File

@@ -264,6 +264,8 @@ on_plug_added (GtkSocket *socket,
child = g_hash_table_lookup (manager->priv->icons, socket);
child->actor = shell_tray_icon_new (SHELL_EMBEDDED_WINDOW (child->window));
g_object_ref_sink (child->actor);
g_signal_emit (manager, shell_tray_manager_signals[TRAY_ICON_ADDED], 0,
child->actor);
}

View File

@@ -1,15 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_URI_UTIL_H__
#define __SHELL_URI_UTIL_H__
#include <gio/gio.h>
G_BEGIN_DECLS
char *shell_util_get_label_for_uri (const char *text_uri);
GIcon *shell_util_get_icon_for_uri (const char *text_uri);
G_END_DECLS
#endif /* __SHELL_URI_UTIL_H__ */

View File

@@ -2,7 +2,7 @@
#include "config.h"
#include "shell-uri-util.h"
#include "shell-util.h"
#include <glib/gi18n-lib.h>
#include <gconf/gconf-client.h>
#include <gtk/gtk.h>
@@ -383,3 +383,59 @@ shell_util_get_icon_for_uri (const char *text_uri)
return g_themed_icon_new ("gtk-file");
}
/**
* shell_util_icon_from_string:
* @string: a stringified #GIcon
*
* A static method equivalent to g_icon_new_for_string, workaround
* for GJS not being able to represent Gio.Icon (which is an interface,
* not a class).
*
* Returns: (transfer full): the icon which is represented by @string
*/
GIcon *
shell_util_icon_from_string (const char *string, GError **error)
{
return g_icon_new_for_string (string, error);
}
static void
stop_pick (ClutterActor *actor,
const ClutterColor *color)
{
g_signal_stop_emission_by_name (actor, "pick");
}
/**
* shell_util_set_hidden_from_pick:
* @actor: A #ClutterActor
* @hidden: Whether @actor should be hidden from pick
*
* If @hidden is %TRUE, hide @actor from pick even with a mode of
* %CLUTTER_PICK_ALL; if @hidden is %FALSE, unhide @actor.
*/
void
shell_util_set_hidden_from_pick (ClutterActor *actor,
gboolean hidden)
{
gpointer existing_handler_data;
existing_handler_data = g_object_get_data (G_OBJECT (actor),
"shell-stop-pick");
if (hidden)
{
if (existing_handler_data != NULL)
return;
g_signal_connect (actor, "pick", G_CALLBACK (stop_pick), NULL);
g_object_set_data (G_OBJECT (actor),
"shell-stop-pick", GUINT_TO_POINTER (1));
}
else
{
if (existing_handler_data == NULL)
return;
g_signal_handlers_disconnect_by_func (actor, stop_pick, NULL);
g_object_set_data (G_OBJECT (actor), "shell-stop-pick", NULL);
}
}

18
src/shell-util.h Normal file
View File

@@ -0,0 +1,18 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_UTIL_H__
#define __SHELL_UTIL_H__
#include <gio/gio.h>
#include <clutter/clutter.h>
G_BEGIN_DECLS
char *shell_util_get_label_for_uri (const char *text_uri);
GIcon *shell_util_get_icon_for_uri (const char *text_uri);
GIcon *shell_util_icon_from_string (const char *string, GError **error);
void shell_util_set_hidden_from_pick (ClutterActor *actor, gboolean hidden);
G_END_DECLS
#endif /* __SHELL_UTIL_H__ */

View File

@@ -16,9 +16,9 @@
#include "shell-window-tracker-private.h"
#include "shell-app-system.h"
#include "shell-app-private.h"
#include "st/st-texture-cache.h"
#include "shell-global.h"
#include "shell-marshal.h"
#include "st.h"
#include "display.h"
#include "window.h"
@@ -941,7 +941,7 @@ shell_startup_sequence_create_icon (ShellStartupSequence *sequence, guint size)
themed = g_themed_icon_new (icon_name);
texture = st_texture_cache_load_gicon (st_texture_cache_get_default (),
themed, size);
NULL, themed, size);
g_object_unref (G_OBJECT (themed));
return texture;
}

View File

@@ -2,8 +2,8 @@
/*
* st-adjustment.c: Adjustment object
*
* Copyright (C) 2008 OpenedHand
* Copyright (c) 2009 Intel Corporation.
* Copyright 2008 OpenedHand
* Copyright 2009 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,
@@ -15,12 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Chris Lord <chris@openedhand.com>, inspired by GtkAdjustment
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -15,12 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Chris Lord <chris@openedhand.com>, inspired by GtkAdjustment
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -2,7 +2,8 @@
/*
* st-bin.c: Basic container actor
*
* Copyright (c) 2009 Intel Corporation.
* Copyright 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
*
* 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,
@@ -14,11 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Emmanuele Bassi <ebassi@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -14,12 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Emmanuele Bassi <ebassi@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,4 +1,22 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-border-image.c: store information about an image with borders
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <config.h>

View File

@@ -1,4 +1,23 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-border-image.h: store information about an image with borders
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ST_BORDER_IMAGE_H__
#define __ST_BORDER_IMAGE_H__

View File

@@ -14,10 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -14,10 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _ST_BOX_LAYOUT_CHILD_H

View File

@@ -3,6 +3,9 @@
* st-box-layout.h: box layout actor
*
* Copyright 2009 Intel Corporation.
* Copyright 2009 Abderrahim Kitouni
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Florian Muellner
*
* 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,
@@ -14,11 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/* Portions copied from Clutter:
@@ -877,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 ();
@@ -951,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 ();
@@ -1012,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)
{
@@ -1048,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-box-layout.h: box layout actor
*
* Copyright 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
*
* 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,
@@ -14,11 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -4,6 +4,7 @@
*
* Copyright 2007 OpenedHand
* Copyright 2008, 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
*
* 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,
@@ -15,12 +16,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Emmanuele Bassi <ebassi@openedhand.com>
* Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -15,13 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Emmanuele Bassi <ebassi@openedhand.com>
* Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,4 +1,22 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-clickable.h: A bin with methods and properties useful for implementing buttons
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* SECTION:st-clickable

View File

@@ -1,4 +1,23 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-clickable.h: A bin with methods and properties useful for implementing buttons
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ST_CLICKABLE_H__
#define __ST_CLICKABLE_H__

View File

@@ -14,11 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -14,11 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -4,6 +4,8 @@
*
* Copyright 2007 OpenedHand
* Copyright 2008, 2009 Intel Corporation.
* Copyright 2010 Florian Müllner
* Copyright 2010 Red Hat, Inc.
*
* 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,
@@ -15,13 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Emmanuele Bassi <ebassi@openedhand.com>
* Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef HAVE_CONFIG_H

View File

@@ -15,10 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,4 +1,22 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-drawing-area.c: A dynamically-sized Cairo drawing area
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* SECTION:st-drawing-area

View File

@@ -1,4 +1,23 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-drawing-area.h: A dynamically-sized Cairo drawing area
*
* Copyright 2009, 2010 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ST_DRAWING_AREA_H__
#define __ST_DRAWING_AREA_H__

View File

@@ -3,6 +3,8 @@
* st-entry.c: Plain entry actor
*
* Copyright 2008, 2009 Intel Corporation
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Florian Müllner
*
* 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,
@@ -14,11 +16,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -14,12 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -2,11 +2,12 @@
/*
* st-focus-manager.c: Keyboard focus manager
*
* Copyright (c) 2010 Red Hat, Inc.
* Copyright 2010 Red Hat, Inc.
*
* 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,
* version 2.1, as published by the Free Software Foundation.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
@@ -14,8 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
@@ -70,8 +70,7 @@ static void
st_focus_manager_init (StFocusManager *manager)
{
manager->priv = ST_FOCUS_MANAGER_GET_PRIVATE (manager);
manager->priv->groups = g_hash_table_new_full (NULL, NULL,
g_object_unref, NULL);
manager->priv->groups = g_hash_table_new (NULL, NULL);
}
static gboolean

View File

@@ -4,9 +4,10 @@
*
* Copyright 2010 Red Hat, Inc.
*
* 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,
* version 2.1, as published by the Free Software Foundation.
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
@@ -14,9 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,6 +1,9 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-group.h: A fixed layout container based on ClutterGroup
* 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,
@@ -12,9 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
@@ -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

@@ -2,6 +2,8 @@
/*
* st-group.h: A fixed layout container based on ClutterGroup
*
* Copyright 2010 Florian Müllner
*
* 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,
* version 2.1, as published by the Free Software Foundation.
@@ -12,10 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

108
src/st/st-icon-colors.c Normal file
View File

@@ -0,0 +1,108 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-icon-colors.c: Colors for colorizing a symbolic icon
*
* Copyright 2010 Red Hat, Inc.
* Copyright 2010 Florian Müllner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "st-icon-colors.h"
/**
* st_icon_colors_new:
*
* Creates a new #StIconColors. All colors are initialized to transparent black.
*
* Return value: a newly created #StIconColors. Free with st_icon_colors_unref()
*/
StIconColors *
st_icon_colors_new (void)
{
StIconColors *colors;
colors = g_slice_new0 (StIconColors);
colors->ref_count = 1;
return colors;
}
/**
* st_icon_colors_ref:
* @colors: a #StIconColors
*
* Atomically increments the reference count of @colors by one.
*
* Returns: the passed in #StIconColors.
*/
StIconColors *
st_icon_colors_ref (StIconColors *colors)
{
g_return_val_if_fail (colors != NULL, NULL);
g_return_val_if_fail (colors->ref_count > 0, colors);
g_atomic_int_add ((volatile int *)&colors->ref_count, 1);
return colors;
}
/**
* st_icon_colors_unref:
* @colors: a #StIconColors
*
* Atomically decrements the reference count of @colors by one.
* If the reference count drops to 0, all memory allocated by the
* #StIconColors is released.
*/
void
st_icon_colors_unref (StIconColors *colors)
{
g_return_if_fail (colors != NULL);
g_return_if_fail (colors->ref_count > 0);
if (g_atomic_int_exchange_and_add ((volatile int *)&colors->ref_count, -1) - 1 == 0)
g_slice_free (StIconColors, colors);
}
/**
* st_icon_colors_copy:
* @colors: a #StIconColors
*
* Creates a new StIconColors structure that is a copy of the passed
* in @colors. You would use this function instead of st_icon_colors_ref()
* if you were planning to change colors in the result.
*
* Returns: a newly created #StIconColors.
*/
StIconColors *
st_icon_colors_copy (StIconColors *colors)
{
StIconColors *copy;
g_return_val_if_fail (colors != NULL, NULL);
copy = st_icon_colors_new ();
copy->foreground = colors->foreground;
copy->warning = colors->warning;
copy->error = colors->error;
copy->success = colors->success;
return copy;
}
G_DEFINE_BOXED_TYPE (StIconColors,
st_icon_colors,
st_icon_colors_ref,
st_icon_colors_unref)

41
src/st/st-icon-colors.h Normal file
View File

@@ -0,0 +1,41 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __ST_ICON_COLORS__
#define __ST_ICON_COLORS__
#include <clutter/clutter.h>
G_BEGIN_DECLS
#define ST_TYPE_ICON_COLORS (st_icon_colors_get_type ())
typedef struct _StIconColors StIconColors;
/**
* StIconColors:
* @foreground: foreground color
* @warning: color indicating a warning state
* @error: color indicating an error state
* @success: color indicating a successful operation
*
* The #StIconColors structure encapsulates colors for colorizing a symbolic
* icon.
*/
struct _StIconColors {
volatile guint ref_count;
ClutterColor foreground;
ClutterColor warning;
ClutterColor error;
ClutterColor success;
};
GType st_icon_colors_get_type (void) G_GNUC_CONST;
StIconColors *st_icon_colors_new (void);
StIconColors *st_icon_colors_ref (StIconColors *colors);
void st_icon_colors_unref (StIconColors *colors);
StIconColors *st_icon_colors_copy (StIconColors *colors);
G_END_DECLS
#endif /* __ST_ICON_COLORS__ */

660
src/st/st-icon.c Normal file
View File

@@ -0,0 +1,660 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-icon.c: icon widget
*
* Copyright 2009, 2010 Intel Corporation.
* Copyright 2010 Red Hat, Inc.
*
* 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,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* SECTION:st-icon
* @short_description: a simple styled icon actor
*
* #StIcon is a simple styled texture actor that displays an image from
* a stylesheet.
*/
#include "st-enum-types.h"
#include "st-icon.h"
#include "st-texture-cache.h"
#include "st-private.h"
enum
{
PROP_0,
PROP_GICON,
PROP_ICON_NAME,
PROP_ICON_TYPE,
PROP_ICON_SIZE
};
G_DEFINE_TYPE (StIcon, st_icon, ST_TYPE_WIDGET)
#define ST_ICON_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), ST_TYPE_ICON, StIconPrivate))
struct _StIconPrivate
{
ClutterActor *icon_texture;
GIcon *gicon;
gchar *icon_name;
StIconType icon_type;
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);
static gboolean st_icon_update_icon_size (StIcon *icon);
#define DEFAULT_ICON_SIZE 48
#define DEFAULT_ICON_TYPE ST_ICON_SYMBOLIC
static void
st_icon_set_property (GObject *gobject,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
StIcon *icon = ST_ICON (gobject);
switch (prop_id)
{
case PROP_GICON:
st_icon_set_gicon (icon, g_value_get_object (value));
break;
case PROP_ICON_NAME:
st_icon_set_icon_name (icon, g_value_get_string (value));
break;
case PROP_ICON_TYPE:
st_icon_set_icon_type (icon, g_value_get_enum (value));
break;
case PROP_ICON_SIZE:
st_icon_set_icon_size (icon, g_value_get_int (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void
st_icon_get_property (GObject *gobject,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
StIcon *icon = ST_ICON (gobject);
switch (prop_id)
{
case PROP_GICON:
g_value_set_object (value, icon->priv->gicon);
break;
case PROP_ICON_NAME:
g_value_set_string (value, st_icon_get_icon_name (icon));
break;
case PROP_ICON_TYPE:
g_value_set_enum (value, st_icon_get_icon_type (icon));
break;
case PROP_ICON_SIZE:
g_value_set_int (value, st_icon_get_icon_size (icon));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
break;
}
}
static void
st_icon_dispose (GObject *gobject)
{
StIconPrivate *priv = ST_ICON (gobject)->priv;
if (priv->icon_texture)
{
clutter_actor_destroy (priv->icon_texture);
priv->icon_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);
}
static void
st_icon_get_preferred_height (ClutterActor *actor,
gfloat for_width,
gfloat *min_height_p,
gfloat *nat_height_p)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
if (min_height_p)
*min_height_p = priv->icon_size;
if (nat_height_p)
*nat_height_p = priv->icon_size;
st_theme_node_adjust_preferred_height (theme_node, min_height_p, nat_height_p);
}
static void
st_icon_get_preferred_width (ClutterActor *actor,
gfloat for_height,
gfloat *min_width_p,
gfloat *nat_width_p)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
if (min_width_p)
*min_width_p = priv->icon_size;
if (nat_width_p)
*nat_width_p = priv->icon_size;
st_theme_node_adjust_preferred_width (theme_node, min_width_p, nat_width_p);
}
static void
st_icon_allocate (ClutterActor *actor,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->allocate (actor, box, flags);
if (priv->icon_texture)
{
ClutterActorBox content_box;
st_theme_node_get_content_box (theme_node, box, &content_box);
/* Center the texture in the allocation; scaling up the icon from the size
* we loaded it at is just a bad idea and probably accidental. Main downside
* of doing this is that it may not be obvious that they have to turn off
* fill to align the icon non-centered in the parent container.
*
* We don't use _st_allocate_fill() for a bit of efficiency and because we
* expect to get rid of the child actor in favor of a CoglTexture in the
* future.
*/
content_box.x1 = (int)(0.5 + content_box.x1 + (content_box.x2 - content_box.x1 - priv->icon_size) / 2.);
content_box.x2 = content_box.x1 + priv->icon_size;
content_box.y1 = (int)(0.5 + content_box.y1 + (content_box.y2 - content_box.y1 - priv->icon_size) / 2.);
content_box.y2 = content_box.y1 + priv->icon_size;
clutter_actor_allocate (priv->icon_texture, &content_box, flags);
}
}
static void
st_icon_paint (ClutterActor *actor)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
/* Chain up to paint background */
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->paint (actor);
if (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;
clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
clutter_actor_box_get_size (&allocation, &width, &height);
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;
_st_paint_shadow_with_opacity (shadow_spec,
priv->shadow_material,
&allocation,
clutter_actor_get_paint_opacity (priv->icon_texture));
}
clutter_actor_paint (priv->icon_texture);
}
}
static void
st_icon_map (ClutterActor *actor)
{
StIconPrivate *priv = ST_ICON (actor)->priv;
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->map (actor);
if (priv->icon_texture)
clutter_actor_map (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);
}
static void
st_icon_style_changed (StWidget *widget)
{
StIcon *self = ST_ICON (widget);
StThemeNode *theme_node = st_widget_get_theme_node (widget);
StIconPrivate *priv = self->priv;
priv->theme_icon_size = st_theme_node_get_length (theme_node, "icon-size");
st_icon_update_icon_size (self);
st_icon_update (self);
}
static void
st_icon_class_init (StIconClass *klass)
{
GParamSpec *pspec;
GObjectClass *object_class = G_OBJECT_CLASS (klass);
ClutterActorClass *actor_class = CLUTTER_ACTOR_CLASS (klass);
StWidgetClass *widget_class = ST_WIDGET_CLASS (klass);
g_type_class_add_private (klass, sizeof (StIconPrivate));
object_class->get_property = st_icon_get_property;
object_class->set_property = st_icon_set_property;
object_class->dispose = st_icon_dispose;
actor_class->get_preferred_height = st_icon_get_preferred_height;
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;
pspec = g_param_spec_object ("gicon",
"GIcon",
"A GIcon to override :icon-name",
G_TYPE_ICON,
ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_GICON, pspec);
pspec = g_param_spec_string ("icon-name",
"Icon name",
"An icon name",
NULL, ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_ICON_NAME, pspec);
pspec = g_param_spec_enum ("icon-type",
"Icon type",
"The type of icon that should be used",
ST_TYPE_ICON_TYPE,
DEFAULT_ICON_TYPE,
ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_ICON_TYPE, pspec);
pspec = g_param_spec_int ("icon-size",
"Icon size",
"The size if the icon, if positive. Otherwise the size will be derived from the current style",
-1, G_MAXINT, -1,
ST_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_ICON_SIZE, pspec);
}
static void
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->icon_texture = 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_update (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
StThemeNode *theme_node;
StTextureCache *cache;
/* Get rid of the old one */
if (priv->icon_texture)
{
clutter_actor_destroy (priv->icon_texture);
priv->icon_texture = NULL;
}
/* Try to lookup the new one */
theme_node = st_widget_peek_theme_node (ST_WIDGET (icon));
if (theme_node == NULL)
return;
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);
}
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);
}
if (priv->icon_texture)
{
st_icon_update_shadow_material (icon);
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (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 gboolean
st_icon_update_icon_size (StIcon *icon)
{
StIconPrivate *priv = icon->priv;
int new_size;
if (priv->prop_icon_size > 0)
new_size = priv->prop_icon_size;
else if (priv->theme_icon_size > 0)
new_size = priv->theme_icon_size;
else
new_size = DEFAULT_ICON_SIZE;
if (new_size != priv->icon_size)
{
clutter_actor_queue_relayout (CLUTTER_ACTOR (icon));
priv->icon_size = new_size;
return TRUE;
}
else
return FALSE;
}
/**
* st_icon_new:
*
* Create a newly allocated #StIcon
*
* Returns: A newly allocated #StIcon
*/
ClutterActor *
st_icon_new (void)
{
return g_object_new (ST_TYPE_ICON, NULL);
}
const gchar *
st_icon_get_icon_name (StIcon *icon)
{
g_return_val_if_fail (ST_IS_ICON (icon), NULL);
return icon->priv->icon_name;
}
void
st_icon_set_icon_name (StIcon *icon,
const gchar *icon_name)
{
StIconPrivate *priv;
g_return_if_fail (ST_IS_ICON (icon));
priv = icon->priv;
/* Check if there's no change */
if (g_strcmp0 (priv->icon_name, icon_name) == 0)
return;
g_free (priv->icon_name);
priv->icon_name = g_strdup (icon_name);
if (priv->gicon)
{
g_object_unref (priv->gicon);
priv->gicon = NULL;
g_object_notify (G_OBJECT (icon), "gicon");
}
g_object_notify (G_OBJECT (icon), "icon-name");
st_icon_update (icon);
}
/**
* st_icon_get_icon_type:
* @icon: a #StIcon
*
* Gets the type of icon we'll look up to display in the actor.
* See st_icon_set_icon_type().
*
* Return value: the icon type.
*/
StIconType
st_icon_get_icon_type (StIcon *icon)
{
g_return_val_if_fail (ST_IS_ICON (icon), DEFAULT_ICON_TYPE);
return icon->priv->icon_type;
}
/**
* st_icon_set_icon_type:
* @icon: a #StIcon
* @icon_type: the type of icon to use
*
* Sets the type of icon we'll look up to display in the actor.
* The icon type determines whether we use a symbolic icon or
* a full color icon and also is used for specific handling for
* application and document icons.
*/
void
st_icon_set_icon_type (StIcon *icon,
StIconType icon_type)
{
StIconPrivate *priv;
g_return_if_fail (ST_IS_ICON (icon));
priv = icon->priv;
if (icon_type == priv->icon_type)
return;
priv->icon_type = icon_type;
st_icon_update (icon);
g_object_notify (G_OBJECT (icon), "icon-type");
}
/**
* st_icon_get_gicon:
* @icon: an icon
*
* Return value: (transfer none): the override GIcon, if set, or NULL
*/
GIcon *
st_icon_get_gicon (StIcon *icon)
{
g_return_val_if_fail (ST_IS_ICON (icon), NULL);
return icon->priv->gicon;
}
/**
* st_icon_set_gicon:
* @icon: an icon
* @gicon: (allow-none): a #GIcon to override :icon-name
*/
void
st_icon_set_gicon (StIcon *icon, GIcon *gicon)
{
g_return_if_fail (ST_IS_ICON (icon));
g_return_if_fail (G_IS_ICON (gicon));
if (icon->priv->gicon == gicon) /* do nothing */
return;
if (icon->priv->gicon)
{
g_object_unref (icon->priv->gicon);
icon->priv->gicon = NULL;
}
if (gicon)
icon->priv->gicon = g_object_ref (gicon);
if (icon->priv->icon_name)
{
g_free (icon->priv->icon_name);
icon->priv->icon_name = NULL;
g_object_notify (G_OBJECT (icon), "icon-name");
}
g_object_notify (G_OBJECT (icon), "gicon");
st_icon_update (icon);
}
/**
* st_icon_get_icon_size:
* @icon: an icon
*
* Gets the size explicit size on the icon. This is not necesariily
* the size that the icon will actually be displayed at.
*
* Return value: the size explicitly set, or -1 if no size has been set
*/
gint
st_icon_get_icon_size (StIcon *icon)
{
g_return_val_if_fail (ST_IS_ICON (icon), -1);
return icon->priv->prop_icon_size;
}
/**
* st_icon_set_icon_size:
* @icon: an icon
* @size: if positive, the new size, otherwise the size will be
* derived from the current style
*
* Sets an explicit size for the icon.
*/
void
st_icon_set_icon_size (StIcon *icon,
gint size)
{
StIconPrivate *priv;
g_return_if_fail (ST_IS_ICON (icon));
priv = icon->priv;
if (priv->prop_icon_size != size)
{
priv->prop_icon_size = size;
if (st_icon_update_icon_size (icon))
st_icon_update (icon);
g_object_notify (G_OBJECT (icon), "icon-size");
}
}

103
src/st/st-icon.h Normal file
View File

@@ -0,0 +1,103 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-icon.h: icon widget
*
* Copyright 2009, 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,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas.wood@intel.com>
*
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)
#error "Only <st/st.h> can be included directly.h"
#endif
#ifndef _ST_ICON
#define _ST_ICON
#include <glib-object.h>
#include <gio/gio.h>
#include <st/st-widget.h>
#include <st/st-types.h>
G_BEGIN_DECLS
#define ST_TYPE_ICON st_icon_get_type()
#define ST_ICON(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), ST_TYPE_ICON, StIcon))
#define ST_ICON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), ST_TYPE_ICON, StIconClass))
#define ST_IS_ICON(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), ST_TYPE_ICON))
#define ST_IS_ICON_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), ST_TYPE_ICON))
#define ST_ICON_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), ST_TYPE_ICON, StIconClass))
typedef struct _StIconPrivate StIconPrivate;
/**
* StIcon:
*
* The contents of this structure are private and should only be accessed
* through the public API.
*/
typedef struct {
/*< private >*/
StWidget parent;
StIconPrivate *priv;
} StIcon;
typedef struct {
StWidgetClass parent_class;
/* padding for future expansion */
void (*_padding_0) (void);
void (*_padding_1) (void);
void (*_padding_2) (void);
void (*_padding_3) (void);
void (*_padding_4) (void);
} StIconClass;
GType st_icon_get_type (void);
ClutterActor* st_icon_new (void);
const gchar *st_icon_get_icon_name (StIcon *icon);
void st_icon_set_icon_name (StIcon *icon, const gchar *icon_name);
void st_icon_set_icon_type (StIcon *icon, StIconType icon_type);
StIconType st_icon_get_icon_type (StIcon *icon);
gint st_icon_get_icon_size (StIcon *icon);
void st_icon_set_icon_size (StIcon *icon, gint size);
void st_icon_set_gicon (StIcon *icon, GIcon *gicon);
GIcon *st_icon_get_gicon (StIcon *icon);
G_END_DECLS
#endif /* _ST_ICON */

View File

@@ -1,6 +1,8 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-im-text.c
* st-im-text.c: Text widget with input method support
*
* Copyright 2009 Red Hat, Inc.
*
* This started as a copy of ClutterIMText converted to use
* GtkIMContext rather than ClutterIMContext. Original code:
@@ -18,10 +20,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
@@ -181,6 +181,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)
@@ -440,6 +447,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

@@ -1,6 +1,8 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-imtext.h
* st-im-text.h: Text widget with input method support
*
* Copyright 2009 Red Hat, Inc.
*
* This is a copy of ClutterIMText converted to use GtkIMContext rather
* than ClutterIMContext. Original code:
@@ -18,10 +20,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -3,6 +3,8 @@
* st-label.c: Plain label actor
*
* Copyright 2008,2009 Intel Corporation
* Copyright 2009 Red Hat, Inc.
* Copyright 2010 Florian Müllner
*
* 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,
@@ -14,11 +16,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -14,12 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Thomas Wood <thomas@linux.intel.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,9 +1,9 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Portions derived from st-box-layout.c, which is
* Copyright 2009 Intel Corporation.
* Modified into -overflow-box, by Colin Walters <walters@verbum.org>, which is
* Copyright 2009 Red Hat, Inc.
* st-overflow-box.c: A vertical box which paints as many actors as it can fit
*
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2009 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,
@@ -15,9 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -1,6 +1,6 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-overflow-box.h: box which hides actors that don't fit
* st-overflow-box.h: A vertical box which paints as many actors as it can fit
*
* Copyright 2009 Red Hat, Inc.
*
@@ -14,9 +14,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,4 +1,24 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-private.h: Private declarations and functions
*
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Florian Müllner
* Copyright 2010 Intel Corporation
* Copyright 2010 Giovanni Campagna
*
* 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,
* version 2.1, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <math.h>
#include <string.h>

View File

@@ -1,9 +1,11 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-private.h: Private declarations
* st-private.h: Private declarations and functions
*
* Copyright 2007 OpenedHand
* Copyright 2009 Intel Corporation.
* Copyright 2010 Red Hat, Inc.
* Copyright 2010 Florian Müllner
*
* 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,
@@ -15,10 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __ST_PRIVATE_H__

View File

@@ -3,7 +3,9 @@
* st-scroll-bar.c: Scroll bar actor
*
* Copyright 2008 OpenedHand
* Copyright 2009 Intel Corporation.
* Copyright 2008, 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Maxim Ermilov
*
* 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,
@@ -15,12 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**

View File

@@ -15,13 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -4,6 +4,8 @@
*
* Copyright 2008 OpenedHand
* Copyright 2009 Intel Corporation.
* Copyright 2009, 2010 Red Hat, Inc.
* Copyright 2010 Maxim Ermilov
*
* 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,
@@ -15,12 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
@@ -284,7 +281,7 @@ st_scroll_view_dispose (GObject *object)
{
g_object_run_dispose (G_OBJECT (priv->vadjustment));
g_object_unref (priv->vadjustment);
priv->hadjustment = NULL;
priv->vadjustment = NULL;
}
/* since it's impossible to get a handle to these actors, we can

View File

@@ -4,6 +4,8 @@
*
* Copyright 2008 OpenedHand
* Copyright 2009 Intel Corporation.
* Copyright 2010 Red Hat, Inc.
* Copyright 2010 Maxim Ermilov
*
* 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,
@@ -15,13 +17,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -4,6 +4,7 @@
*
* Copyright 2008 OpenedHand
* Copyright 2009 Intel Corporation.
* Copyright 2010 Red Hat, Inc.
*
* 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,
@@ -15,12 +16,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "st-scrollable.h"

View File

@@ -15,13 +15,7 @@
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
* Boston, MA 02111-1307, USA.
*
* Written by: Chris Lord <chris@openedhand.com>
* Port to St by: Robert Staudinger <robsta@openedhand.com>
*
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#if !defined(ST_H_INSIDE) && !defined(ST_COMPILATION)

View File

@@ -1,4 +1,23 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* st-shadow.c: Boxed type holding for -st-shadow attributes
*
* Copyright 2009, 2010 Florian Müllner
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
* more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include "st-shadow.h"

Some files were not shown because too many files have changed in this diff Show More