Catch up with master

This commit is contained in:
David Zeuthen 2011-01-19 11:09:57 -05:00
commit 0d9095d2d4
100 changed files with 10986 additions and 5502 deletions

5
.gitignore vendored
View File

@ -18,8 +18,6 @@ config
configure
data/gnome-shell.desktop
data/gnome-shell.desktop.in
data/gnome-shell-clock-preferences.desktop
data/gnome-shell-clock-preferences.desktop.in
data/gschemas.compiled
data/org.gnome.shell.gschema.xml
data/org.gnome.shell.gschema.valid
@ -46,12 +44,13 @@ src/Makefile
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
src/st.h
src/stamp-st.h
src/stamp-st.h.tmp
stamp-h1
tests/run-test.sh
xmldocs.make

View File

@ -1,11 +1,14 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell],[2.91.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_INIT([gnome-shell],[2.91.5],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([config])
AC_SUBST([PACKAGE_NAME], ["$PACKAGE_NAME"])
AC_SUBST([PACKAGE_VERSION], ["$PACKAGE_VERSION"])
AM_INIT_AUTOMAKE([1.10 dist-bzip2 no-dist-gzip foreign])
AM_MAINTAINER_MODE
@ -58,15 +61,15 @@ fi
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.5.8
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
GJS_MIN_VERSION=0.7
MUTTER_MIN_VERSION=2.91.0
GTK_MIN_VERSION=2.91.0
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=0.7.8
MUTTER_MIN_VERSION=2.91.4
GTK_MIN_VERSION=2.91.7
GIO_MIN_VERSION=2.25.9
# Collect more than 20 libraries for a prize!
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION
gio-unix-2.0 dbus-glib-1
gio-unix-2.0 dbus-glib-1 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION
mutter-plugins >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION
@ -78,6 +81,10 @@ PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra)
GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0`
AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to])
AC_SUBST([GJS_VERSION], ["$GJS_VERSION"])
saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS
CFLAGS=$MUTTER_PLUGIN_CFLAGS
@ -87,7 +94,6 @@ AC_CHECK_FUNCS(JS_NewGlobalObject sn_startup_sequence_get_application_id)
CFLAGS=$saved_CFLAGS
LIBS=$saved_LIBS
PKG_CHECK_MODULES(TIDY, clutter-1.0)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 gnome-desktop-3.0 >= 2.90.0)
PKG_CHECK_MODULES(GDMUSER, dbus-glib-1 gtk+-3.0)
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
@ -165,14 +171,6 @@ changequote([,])dnl
AC_PATH_PROG(mutter, [mutter])
AC_SUBST(mutter)
AC_MSG_CHECKING([if mutter was compiled with GTK+-3.0])
if $PKG_CONFIG --libs libmutter-private | grep gtk-x11-3 >/dev/null; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
AC_MSG_ERROR([GNOME Shell requires Mutter to be compiled against GTK+-3.0])
fi
AC_CONFIG_FILES([
Makefile
data/Makefile

View File

@ -1,5 +1,5 @@
desktopdir=$(datadir)/applications
desktop_DATA = gnome-shell.desktop gnome-shell-clock-preferences.desktop
desktop_DATA = gnome-shell.desktop
# We substitute in bindir so it works as an autostart
# file when built in a non-system prefix
@ -12,7 +12,10 @@ desktop_DATA = gnome-shell.desktop gnome-shell-clock-preferences.desktop
%.desktop:%.desktop.in
$(AM_V_GEN) sed s/^_// < $< > $@ || rm $@
dist_pkgdata_DATA = clock-preferences.ui
searchprovidersdir = $(pkgdatadir)/search_providers
dist_searchproviders_DATA = \
search_providers/google.xml \
search_providers/wikipedia.xml
imagesdir = $(pkgdatadir)/images
dist_images_DATA = \
@ -88,7 +91,6 @@ install-data-local:
EXTRA_DIST = \
gnome-shell.desktop.in.in \
gnome-shell-clock-preferences.desktop.in.in \
$(menu_DATA) \
$(gconfschema_DATA) \
$(shaders_DATA) \
@ -97,7 +99,6 @@ EXTRA_DIST = \
CLEANFILES = \
gnome-shell.desktop.in \
gnome-shell-clock-preferences.desktop.in \
$(desktop_DATA) \
$(gsettings_SCHEMAS) \
gschemas.compiled

View File

@ -1,188 +0,0 @@
<?xml version="1.0"?>
<interface domain="gnome-shell">
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkDialog" id="prefs-dialog">
<property name="border_width">5</property>
<property name="title" translatable="yes">Clock Preferences</property>
<property name="window_position">center</property>
<property name="type_hint">normal</property>
<property name="has_separator">False</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">18</property>
<child>
<object class="GtkFrame" id="frame1">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<property name="right_padding">6</property>
<child>
<object class="GtkHBox" id="hbox1">
<property name="visible">True</property>
<property name="spacing">12</property>
<child>
<object class="GtkRadioButton" id="12hr_radio">
<property name="label" translatable="yes">_12 hour format</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="24hr_radio">
<property name="label" translatable="yes">_24 hour format</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
<property name="group">12hr_radio</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_format">
<property name="visible">True</property>
<property name="label" translatable="yes">Clock Format</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="frame2">
<property name="visible">True</property>
<property name="label_xalign">0</property>
<property name="shadow_type">none</property>
<child>
<object class="GtkAlignment" id="alignment2">
<property name="visible">True</property>
<property name="top_padding">6</property>
<property name="left_padding">12</property>
<child>
<object class="GtkVBox" id="vbox2">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">6</property>
<child>
<object class="GtkCheckButton" id="date_check">
<property name="label" translatable="yes">Show the _date</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="seconds_check">
<property name="label" translatable="yes">Show seco_nds</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label_display">
<property name="visible">True</property>
<property name="label" translatable="yes">Panel Display</property>
<attributes>
<attribute name="weight" value="bold"/>
</attributes>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="padding">6</property>
<property name="position">1</property>
</packing>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<object class="GtkButton" id="prefs_close_button">
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
<action-widgets>
<action-widget response="0">prefs_close_button</action-widget>
</action-widgets>
</object>
</interface>

View File

@ -1,15 +0,0 @@
[Desktop Entry]
_Name=Clock
_Comment=Customize the panel clock
Exec=@bindir@/gnome-shell-clock-preferences
Icon=gnome-panel-clock
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Settings;DesktopSettings;
OnlyShowIn=GNOME;
X-GNOME-ShellOnly=true
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-shell
X-GNOME-Bugzilla-Component=general
X-GNOME-Bugzilla-Version=@VERSION@

View File

@ -30,13 +30,17 @@
</_description>
</key>
<key name="favorite-apps" type="as">
<default>[ 'mozilla-firefox.desktop', 'evolution.desktop', 'openoffice.org-writer.desktop' ]</default>
<default>[ 'mozilla-firefox.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'openoffice.org-writer.desktop', 'nautilus.desktop' ]</default>
<_summary>List of desktop file IDs for favorite applications</_summary>
<_description>
The applications corresponding to these identifiers
will be displayed in the favorites area.
</_description>
</key>
<key name="disabled-open-search-providers" type="as">
<default>[]</default>
<_summary>disabled OpenSearch providers</_summary>
</key>
<key name="command-history" type="as">
<default>[]</default>
<_summary>History for command (Alt-F2) dialog</_summary>
@ -59,51 +63,18 @@
<schema id="org.gnome.shell.clock" path="/apps/gnome-shell/clock/"
gettext-domain="@GETTEXT_PACKAGE@">
<key name="format" type="s">
<default l10n="messages" context="hour_format">
<!-- TRANSLATORS: This is the default hour format, choose ONLY '12-hour' or '24-hour'. -->
"12-hour"
</default>
<_summary>Hour format</_summary>
<_description>
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.
</_description>
<choices>
<choice value="12-hour"/>
<choice value="24-hour"/>
<choice value="unix"/>
<choice value="custom"/>
</choices>
</key>
<key name="custom-format" type="s">
<default>''</default>
<_summary>Custom format of the clock</_summary>
<_description>
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.
</_description>
</key>
<key name="show-seconds" type="b">
<default>false</default>
<_summary>Show time with seconds</_summary>
<_description>
If true and format is either "12-hour" or "24-hour", display seconds in time.
If true, display seconds in time.
</_description>
</key>
<key name="show-date" type="b">
<default>false</default>
<_summary>Show date in clock</_summary>
<_description>
If true and format is either "12-hour" or "24-hour",
display date in the clock, in addition to time.
If true, display date in the clock, in addition to time.
</_description>
</key>
</schema>

View File

@ -0,0 +1,7 @@
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Google</ShortName>
<Description>Google Search</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA</Image>
<Url type="text/html" method="GET" template="http://www.google.com/search?q={searchTerms}"/>
</OpenSearchDescription>

View File

@ -0,0 +1,44 @@
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
<ShortName>Wikipedia</ShortName>
<Description>Wikipedia, the free encyclopedia</Description>
<InputEncoding>UTF-8</InputEncoding>
<Image width="16" height="16">data:image/x-icon;base64,AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAEAgQAhIOEAMjHyABIR0gA6ejpAGlqaQCpqKkAKCgoAPz9%2FAAZGBkAmJiYANjZ2ABXWFcAent6ALm6uQA8OjwAiIiIiIiIiIiIiI4oiL6IiIiIgzuIV4iIiIhndo53KIiIiB%2FWvXoYiIiIfEZfWBSIiIEGi%2FfoqoiIgzuL84i9iIjpGIoMiEHoiMkos3FojmiLlUipYliEWIF%2BiDe0GoRa7D6GPbjcu1yIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</Image>
<Url type="text/html" method="GET" template="http://{language}.wikipedia.org/wiki/Special:Search?search={searchTerms}"/>
<!-- The criterion for being below is being listed with more than 100,000
articles on http://meta.wikimedia.org/wiki/List_of_Wikipedias -->
<Language>ar</Language>
<Language>bg</Language>
<Language>ca</Language>
<Language>cs</Language>
<Language>da</Language>
<Language>de</Language>
<Language>en</Language>
<Language>eo</Language>
<Language>es</Language>
<Language>fa</Language>
<Language>fi</Language>
<Language>fr</Language>
<Language>he</Language>
<Language>hu</Language>
<Language>id</Language>
<Language>it</Language>
<Language>ja</Language>
<Language>ko</Language>
<Language>lt</Language>
<Language>nl</Language>
<Language>no</Language>
<Language>pl</Language>
<Language>pt</Language>
<Language>ro</Language>
<Language>ru</Language>
<Language>sk</Language>
<Language>sl</Language>
<Language>sr</Language>
<Language>sv</Language>
<Language>tr</Language>
<Language>uk</Language>
<Language>vi</Language>
<Language>vo</Language>
<Language>war</Language>
<Language>zh</Language>
</OpenSearchDescription>

View File

@ -214,7 +214,7 @@ StTooltip StLabel {
transition-duration: 100;
}
.panel-button:active, .panel-button:checked, .panel-button:pressed {
.panel-button:active, .panel-button:checked, .panel-button:pressed, .panel-button:focus {
background-gradient-direction: vertical;
background-gradient-start: #3c3c3c;
background-gradient-end: #131313;
@ -338,6 +338,7 @@ StTooltip StLabel {
#viewSelector {
spacing: 16px;
font-size: 16px;
}
#viewSelectorTabBar {
@ -384,10 +385,14 @@ StTooltip StLabel {
color: #888a85;
font-weight: bold;
padding: 0px 12px;
height: 24px;
}
.view-tab-title:selected {
color: white;
color: #000000;
background-color: #c2c7cd;
border-radius: 4px;
height: 24px;
}
.view-tab-boxpointer {
@ -436,40 +441,30 @@ StTooltip StLabel {
spacing: 4px;
}
/* GenericDisplay */
.generic-display-container {
.search-providers-box {
spacing: 4px;
}
.generic-display-item {
height: 50px;
border-radius: 4px;
color: #ffffff;
font-size: 14px;
spacing: 4px;
.dash-search-button {
background-gradient-direction: vertical;
background-gradient-start: rgba(255, 255, 255, 0.2);
background-gradient-end: rgba(255, 255, 255, 0);
/* border: 1px solid #808080;*/
border-radius: 10px;
height: 32px;
width: 300px;
}
.generic-display-item:selected {
background-color: rgba(79,111,173,0.66);
.dash-search-button:selected,
.dash-search-button:hover {
background-gradient-direction: vertical;
background-gradient-start: rgba(255, 255, 255, 0.4);
background-gradient-end: rgba(255, 255, 255, 0.2);
}
.generic-display-item-text {
spacing: 4px;
}
.generic-display-item-description {
font-size: 12px;
color: #bababa;
}
.generic-display-details {
font-size: 14px;
color: #ffffff;
}
.generic-display-details-name {
font-weight: bold;
.dash-search-button-label {
color: #cccccc;
font: 16px sans-serif;
}
/* Apps */
@ -549,57 +544,6 @@ StTooltip StLabel {
font-size: 12px
}
/* Places */
.places-section {
spacing-columns: 4px;
spacing-rows: 4px;
}
.places-item-box {
spacing: 2px;
}
.places-item {
border-radius: 4px;
padding: 2px;
border: 1px solid #181818;
padding-left: 4px;
padding-right: 4px;
transition-duration: 100;
}
.places-item: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);
transition-duration: 100;
}
/* Recent items */
.recent-docs-item-box {
spacing: 2px;
}
.recent-docs-item {
border-radius: 4px;
padding: 2px;
border: 1px solid #181818;
padding-left: 4px;
padding-right: 4px;
transition-duration: 100;
}
.recent-docs-item: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);
transition-duration: 100;
}
/* LookingGlass */
#LookingGlassDialog
@ -1142,6 +1086,15 @@ StTooltip StLabel {
border-radius: 8px;
}
.switcher-list .item-box:outlined {
padding: 6px;
border: 2px solid rgba(85,85,85,1.0);
}
.switcher-list .item-box:selected {
background: rgba(255,255,255,0.33);
}
.switcher-list .thumbnail-box {
padding: 2px;
spacing: 4px;
@ -1151,18 +1104,6 @@ StTooltip StLabel {
width: 256px;
}
.switcher-list .outlined-item-box {
padding: 6px;
border: 2px solid rgba(85,85,85,1.0);
border-radius: 8px;
}
.switcher-list .selected-item-box {
padding: 8px;
border-radius: 8px;
background: rgba(255,255,255,0.33);
}
.switcher-list .separator {
width: 1px;
background: rgba(255,255,255,0.33);
@ -1227,6 +1168,54 @@ StTooltip StLabel {
border-radius: 8px;
}
/* Modal Dialogs */
.modal-dialog {
font: 12pt sans-serif;
border-radius: 24px;
background-color: rgba(0.0, 0.0, 0.0, 0.9);
border: 2px solid #868686;
color: #ffffff;
padding-right: 42px;
padding-left: 42px;
padding-bottom: 30px;
padding-top: 30px;
}
.modal-dialog-button {
border: 1px solid #8b8b8b;
border-radius: 18px;
font: 14px sans-serif;
margin-left: 10px;
margin-right: 10px;
padding-left: 32px;
padding-right: 32px;
padding-top: 8px;
padding-bottom: 8px;
background-gradient-direction: vertical;
background-gradient-start: #29323b;
background-gradient-end: #121a24;
}
.modal-dialog-button:active,
.modal-dialog-button:pressed {
border-color: #a5a5a5;
background-gradient-start: #121a24;
background-gradient-end: #29323b;
}
.modal-dialog-button:focus {
border: 2px solid #a5a5a5;
padding-left: 31px;
padding-right: 31px;
padding-top: 7px;
padding-bottom: 7px;
}
/* Run Dialog */
.run-dialog-label {
font: 12px sans-serif;
@ -1252,16 +1241,74 @@ StTooltip StLabel {
}
.run-dialog {
padding: 8px;
border: 1px solid rgba(128,128,128,0.40);
border-radius: 4px;
background: rgba(0,0,0,0.8);
border-radius: 16px;
padding-right: 21px;
padding-left: 21px;
padding-bottom: 15px;
padding-top: 15px;
}
.lightbox {
background-color: rgba(0, 0, 0, 0.4);
}
/* End Session Dialog */
.end-session-dialog-subject {
font: 12pt sans-serif;
font-weight: bold;
color: #666666;
padding-top: 10px;
padding-left: 17px;
padding-bottom: 30px;
}
.end-session-dialog-description {
font: 10pt sans-serif;
color: white;
padding-left: 17px;
padding-right: 40px;
width: 16em;
}
.end-session-dialog-logout-icon {
border: 2px solid #8b8b8b;
border-radius: 5px;
width: 32px;
height: 32px;
}
.end-session-dialog-shutdown-icon {
width: 32px;
height: 32px;
}
.end-session-dialog-app-list {
font: 10pt sans-serif;
max-height: 200px;
padding-top: 42px;
padding-bottom: 42px;
padding-left: 17px;
padding-right: 32px;
}
.end-session-dialog-app-list-item {
padding-right: 1em;
}
.end-session-dialog-app-list-item-icon {
padding-right: 17px;
}
.end-session-dialog-app-list-item-name {
font: 10pt sans-serif;
}
.end-session-dialog-app-list-item-description {
font: 8pt sans-serif;
color: #444444;
}
/* Magnifier */
.magnifier-zoom-region {

View File

@ -9,22 +9,22 @@ nobase_dist_js_DATA = \
misc/gnomeSession.js \
misc/params.js \
misc/telepathy.js \
misc/utils.js \
misc/util.js \
perf/core.js \
prefs/clockPreferences.js \
ui/altTab.js \
ui/appDisplay.js \
ui/appFavorites.js \
ui/boxpointer.js \
ui/calendar.js \
ui/chrome.js \
ui/ctrlAltTab.js \
ui/dash.js \
ui/dateMenu.js \
ui/dnd.js \
ui/docDisplay.js \
ui/endSessionDialog.js \
ui/environment.js \
ui/extensionSystem.js \
ui/genericDisplay.js \
ui/iconGrid.js \
ui/lightbox.js \
ui/link.js \
@ -33,6 +33,7 @@ nobase_dist_js_DATA = \
ui/magnifierDBus.js \
ui/main.js \
ui/messageTray.js \
ui/modalDialog.js \
ui/notificationDaemon.js \
ui/overview.js \
ui/panel.js \
@ -47,6 +48,7 @@ nobase_dist_js_DATA = \
ui/statusIconDispatcher.js \
ui/statusMenu.js \
ui/status/accessibility.js \
ui/status/keyboard.js \
ui/status/power.js \
ui/status/volume.js \
ui/status/bluetooth.js \
@ -57,4 +59,5 @@ nobase_dist_js_DATA = \
ui/windowManager.js \
ui/workspace.js \
ui/workspacesView.js \
ui/workspaceSwitcherPopup.js
ui/workspaceSwitcherPopup.js \
ui/xdndHandler.js

View File

@ -1,3 +1,10 @@
/* mode: js2; indent-tabs-mode: nil; tab-size: 4 */
/* The name of this package (not localized) */
const PACKAGE_NAME = '@PACKAGE_NAME@';
/* The version of this package */
const PACKAGE_VERSION = '@PACKAGE_VERSION@';
/* The version of GJS we're linking to */
const GJS_VERSION = '@GJS_VERSION@';
/* 1 if gnome-bluetooth is available, 0 otherwise */
const HAVE_BLUETOOTH = @HAVE_BLUETOOTH@;

View File

@ -60,8 +60,7 @@ function getDocManager() {
}
/**
* DocManager wraps the DocSystem, primarily to expose DocInfo objects
* which conform to the GenericDisplay item API.
* DocManager wraps the DocSystem, primarily to expose DocInfo objects.
*/
function DocManager() {
this._init();

View File

@ -2,6 +2,7 @@
const DBus = imports.dbus;
const Lang = imports.lang;
const Signals = imports.signals;
const PresenceIface = {
name: 'org.gnome.SessionManager.Presence',
@ -43,3 +44,60 @@ Presence.prototype = {
}
};
DBus.proxifyPrototype(Presence.prototype, PresenceIface);
// Note inhibitors are immutable objects, so they don't
// change at runtime (changes always come in the form
// of new inhibitors)
const InhibitorIface = {
name: 'org.gnome.SessionManager.Inhibitor',
properties: [{ name: 'app_id',
signature: 's',
access: 'readonly' },
{ name: 'client_id',
signature: 's',
access: 'readonly' },
{ name: 'reason',
signature: 's',
access: 'readonly' },
{ name: 'flags',
signature: 'u',
access: 'readonly' },
{ name: 'toplevel_xid',
signature: 'u',
access: 'readonly' },
{ name: 'cookie',
signature: 'u',
access: 'readonly' }],
};
function Inhibitor(objectPath) {
this._init(objectPath);
}
Inhibitor.prototype = {
_init: function(objectPath) {
DBus.session.proxifyObject(this,
"org.gnome.SessionManager",
objectPath);
this.isLoaded = false;
this._loadingPropertiesCount = InhibitorIface.properties.length;
for (let i = 0; i < InhibitorIface.properties.length; i++) {
let propertyName = InhibitorIface.properties[i].name;
this.GetRemote(propertyName, Lang.bind(this,
function(value, exception) {
if (exception)
return;
this[propertyName] = value;
this._loadingPropertiesCount--;
if (this._loadingPropertiesCount == 0) {
this.isLoaded = true;
this.emit("is-loaded");
}
}));
}
},
};
DBus.proxifyPrototype(Inhibitor.prototype, InhibitorIface);
Signals.addSignalMethods(Inhibitor.prototype);

175
js/misc/util.js Normal file
View File

@ -0,0 +1,175 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
/* http://daringfireball.net/2010/07/improved_regex_for_matching_urls */
const _urlRegexp = new RegExp('\\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;
}
// spawn:
// @argv: an argv array
//
// Runs @argv in the background, handling any errors that occur
// when trying to start the program.
function spawn(argv) {
try {
trySpawn(argv);
} catch (err) {
_handleSpawnError(argv[0], err);
}
}
// spawnCommandLine:
// @command_line: a command line
//
// Runs @command_line in the background, handling any errors that
// occur when trying to parse or start the program.
function spawnCommandLine(command_line) {
try {
let [success, argc, argv] = GLib.shell_parse_argv(command_line);
trySpawn(argv);
} catch (err) {
_handleSpawnError(command_line, err);
}
}
// spawnDesktop:
// @id: a desktop file ID
//
// Spawns the desktop file identified by @id using startup notification,
// etc, handling any errors that occur when trying to find or start
// the program.
function spawnDesktop(id) {
try {
trySpawnDesktop(id);
} catch (err) {
_handleSpawnError(id, err);
}
}
// trySpawn:
// @argv: an argv array
//
// Runs @argv in the background. If launching @argv fails,
// this will throw an error.
function trySpawn(argv)
{
try {
GLib.spawn_async(null, argv, null,
GLib.SpawnFlags.SEARCH_PATH,
null, null);
} catch (err) {
// The exception from gjs contains an error string like:
// Error invoking GLib.spawn_command_line_async: Failed to
// execute child process "foo" (No such file or directory)
// We are only interested in the part in the parentheses. (And
// we can't pattern match the text, since it gets localized.)
err.message = err.message.replace(/.*\((.+)\)/, '$1');
throw err;
}
}
// trySpawnCommandLine:
// @command_line: a command line
//
// Runs @command_line in the background. If launching @command_line
// fails, this will throw an error.
function trySpawnCommandLine(command_line) {
let success, argc, argv;
try {
[success, argc, argv] = GLib.shell_parse_argv(command_line);
} catch (err) {
// Replace "Error invoking GLib.shell_parse_argv: " with
// something nicer
err.message = err.message.replace(/[^:]*: /, _("Could not parse command:") + "\n");
throw err;
}
trySpawn(argv);
}
// trySpawnDesktop:
// @id: a desktop file ID
//
// Spawns the desktop file identified by @id using startup notification.
// On error, throws an exception.
function trySpawnDesktop(id) {
let app;
// shell_app_system_load_from_desktop_file() will end up returning
// a stupid error message if the desktop file doesn't exist, but
// that's the only case it returns an error for, so we just
// substitute our own error in instead
try {
app = Shell.AppSystem.get_default().load_from_desktop_file(id + '.desktop');
} catch (err) {
throw new Error(_("No such application"));
}
try {
app.launch();
} catch(err) {
// see trySpawn
err.message = err.message.replace(/.*\((.+)\)/, '$1');
throw err;
}
}
function _handleSpawnError(command, err) {
let title = _("Execution of '%s' failed:").format(command);
let source = new MessageTray.SystemNotificationSource();
Main.messageTray.add(source);
let notification = new MessageTray.Notification(source, title, err.message);
notification.setTransient(true);
source.notify(notification);
}
// killall:
// @processName: a process name
//
// Kills @processName. If no process with the given name is found,
// this will fail silently.
function killall(processName) {
try {
// pkill is more portable than killall, but on Linux at least
// it won't match if you pass more than 15 characters of the
// process name... However, if you use the '-f' flag to match
// the entire command line, it will work, but we have to be
// careful in that case that we can match
// '/usr/bin/processName' but not 'gedit processName.c' or
// whatever...
let argv = ['pkill', '-f', '^([^ ]*/)?' + processName + '($| )'];
GLib.spawn_sync(null, argv, null, GLib.SpawnFlags.SEARCH_PATH, null, null);
// It might be useful to return success/failure, but we'd need
// a wrapper around WIFEXITED and WEXITSTATUS. Since none of
// the current callers care, we don't bother.
} catch (e) {
logError(e, 'Failed to kill ' + processName);
}
}

View File

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

@ -1,97 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Signals = imports.signals;
const Gettext = imports.gettext;
const FORMAT_KEY = 'format';
const SHOW_DATE_KEY = 'show-date';
const SHOW_SECONDS_KEY = 'show-seconds';
function ClockPreferences(uiFile) {
this._init(uiFile);
};
ClockPreferences.prototype = {
_init: function(uiFile) {
let builder = new Gtk.Builder();
builder.add_from_file(uiFile);
this._dialog = builder.get_object('prefs-dialog');
this._dialog.connect('response', Lang.bind(this, this._onResponse));
this._12hrRadio = builder.get_object('12hr_radio');
this._24hrRadio = builder.get_object('24hr_radio');
this._dateCheck = builder.get_object('date_check');
this._secondsCheck = builder.get_object('seconds_check');
delete builder;
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.clock' });
this._notifyId = this._settings.connect('changed',
Lang.bind(this,
this._updateDialog));
this._12hrRadio.connect('toggled', Lang.bind(this,
function() {
let format = this._12hrRadio.active ? '12-hour' : '24-hour';
this._settings.set_string(FORMAT_KEY, format);
}));
this._dateCheck.connect('toggled', Lang.bind(this,
function() {
this._settings.set_boolean(SHOW_DATE_KEY,
this._dateCheck.active);
}));
this._secondsCheck.connect('toggled', Lang.bind(this,
function() {
this._settings.set_boolean(SHOW_SECONDS_KEY,
this._secondsCheck.active);
}));
this._updateDialog();
},
show: function() {
this._dialog.show_all();
},
_updateDialog: function() {
let format = this._settings.get_string(FORMAT_KEY);
this._12hrRadio.active = (format == "12-hour");
this._24hrRadio.active = (format == "24-hour");
this._dateCheck.active = this._settings.get_boolean(SHOW_DATE_KEY);
this._secondsCheck.active = this._settings.get_boolean(SHOW_SECONDS_KEY);
},
_onResponse: function() {
this._dialog.destroy();
this._settings.disconnect(this._notifyId);
this.emit('destroy');
}
};
Signals.addSignalMethods(ClockPreferences.prototype);
function main(params) {
if ('progName' in params)
GLib.set_prgname(params['progName']);
if ('localeDir' in params)
Gettext.bindtextdomain('gnome-shell', params['localeDir']);
Gtk.init(null, null);
let clockPrefs = new ClockPreferences(params['uiFile']);
clockPrefs.connect('destroy',
function() {
Gtk.main_quit();
});
clockPrefs.show();
Gtk.main();
}

View File

@ -34,7 +34,8 @@ function AltTabPopup() {
AltTabPopup.prototype = {
_init : function() {
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
reactive: true });
reactive: true,
visible: false });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
@ -126,8 +127,8 @@ AltTabPopup.prototype = {
return false;
this._haveModal = true;
this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this._keyReleaseEventId = global.stage.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
@ -365,6 +366,7 @@ AltTabPopup.prototype = {
},
destroy : function() {
if (this.actor.visible) {
Tweener.addTween(this.actor,
{ opacity: 0,
time: POPUP_FADE_TIME,
@ -374,6 +376,8 @@ AltTabPopup.prototype = {
this.actor.destroy();
})
});
} else
this.actor.destroy();
},
_onDestroy : function() {
@ -383,11 +387,6 @@ AltTabPopup.prototype = {
if (this._thumbnails)
this._destroyThumbnails();
if (this._keyPressEventId)
global.stage.disconnect(this._keyPressEventId);
if (this._keyReleaseEventId)
global.stage.disconnect(this._keyReleaseEventId);
if (this._motionTimeoutId != 0)
Mainloop.source_remove(this._motionTimeoutId);
if (this._thumbnailTimeoutId != 0)
@ -609,16 +608,18 @@ SwitcherList.prototype = {
},
highlight: function(index, justOutline) {
if (this._highlighted != -1)
this._items[this._highlighted].style_class = 'item-box';
if (this._highlighted != -1) {
this._items[this._highlighted].remove_style_pseudo_class('outlined');
this._items[this._highlighted].remove_style_pseudo_class('selected');
}
this._highlighted = index;
if (this._highlighted != -1) {
if (justOutline)
this._items[this._highlighted].style_class = 'outlined-item-box';
this._items[this._highlighted].add_style_pseudo_class('outlined');
else
this._items[this._highlighted].style_class = 'selected-item-box';
this._items[this._highlighted].add_style_pseudo_class('selected');
}
let monitor = global.get_primary_monitor();
@ -864,17 +865,19 @@ AppSwitcher.prototype = {
while(this._items.length > 1 && this._items[j].style_class != 'item-box') {
j++;
}
let iconPadding = this._items[j].get_theme_node().get_horizontal_padding();
let themeNode = this._items[j].get_theme_node();
let iconPadding = themeNode.get_horizontal_padding();
let iconBorder = themeNode.get_border_width(St.Side.LEFT) + themeNode.get_border_width(St.Side.RIGHT);
let [iconMinHeight, iconNaturalHeight] = this.icons[j].label.get_preferred_height(-1);
let iconSpacing = iconNaturalHeight + iconPadding;
let iconSpacing = iconNaturalHeight + iconPadding + iconBorder;
let totalSpacing = this._list.spacing * (this._items.length - 1);
if (this._separator)
totalSpacing += this._separator.width + this._list.spacing;
// We just assume the whole screen here due to weirdness happing with the passed width
let focus = global.get_focus_monitor();
let primary = global.get_primary_monitor();
let parentPadding = this.actor.get_parent().get_theme_node().get_horizontal_padding();
let availWidth = focus.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
let availWidth = primary.width - parentPadding - this.actor.get_theme_node().get_horizontal_padding();
let height = 0;
for(let i = 0; i < iconSizes.length; i++) {

View File

@ -151,6 +151,7 @@ ViewByCategories.prototype = {
this._apps = apps;
this._view.refresh(apps);
/* Translators: Filter to display all applications */
this._addFilter(_("All"), -1);
if (!sections)
@ -280,21 +281,21 @@ PrefsSearchProvider.prototype = {
}
};
function AppIcon(app) {
this._init(app);
function AppIcon(app, params) {
this._init(app, params);
}
AppIcon.prototype = {
__proto__: IconGrid.BaseIcon.prototype,
_init : function(app) {
_init : function(app, params) {
this.app = app;
let label = this.app.get_name();
IconGrid.BaseIcon.prototype._init.call(this,
label,
{ setSizeManually: true });
params);
},
createIcon: function(iconSize) {
@ -302,12 +303,12 @@ AppIcon.prototype = {
}
};
function AppWellIcon(app) {
this._init(app);
function AppWellIcon(app, iconParams) {
this._init(app, iconParams);
}
AppWellIcon.prototype = {
_init : function(app) {
_init : function(app, iconParams) {
this.app = app;
this.actor = new St.Clickable({ style_class: 'app-well-app',
reactive: true,
@ -315,7 +316,7 @@ AppWellIcon.prototype = {
y_fill: true });
this.actor._delegate = this;
this.icon = new AppIcon(app);
this.icon = new AppIcon(app, iconParams);
this.actor.set_child(this.icon.actor);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));

View File

@ -42,7 +42,7 @@ BoxPointer.prototype = {
this.bin.raise(this._border);
},
animateAppear: function(onComplete) {
show: function(animate, onComplete) {
let x = this.actor.x;
let y = this.actor.y;
let themeNode = this.actor.get_theme_node();
@ -51,6 +51,7 @@ BoxPointer.prototype = {
this.actor.opacity = 0;
this.actor.show();
if (animate) {
switch (this._arrowSide) {
case St.Side.TOP:
this.actor.y -= rise;
@ -65,6 +66,7 @@ BoxPointer.prototype = {
this.actor.x += rise;
break;
}
}
Tweener.addTween(this.actor, { opacity: 255,
x: x,
@ -74,7 +76,7 @@ BoxPointer.prototype = {
time: POPUP_ANIMATION_TIME });
},
animateDisappear: function(onComplete) {
hide: function(animate, onComplete) {
let x = this.actor.x;
let y = this.actor.y;
let originalX = this.actor.x;
@ -82,6 +84,7 @@ BoxPointer.prototype = {
let themeNode = this.actor.get_theme_node();
let rise = themeNode.get_length('-arrow-rise');
if (animate) {
switch (this._arrowSide) {
case St.Side.TOP:
y += rise;
@ -96,6 +99,7 @@ BoxPointer.prototype = {
x -= rise;
break;
}
}
Tweener.addTween(this.actor, { opacity: 0,
x: x,

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

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

View File

@ -78,8 +78,6 @@ function Dash() {
Dash.prototype = {
_init : function() {
this._menus = [];
this._menuDisplays = [];
this._maxHeight = -1;
this._iconSize = 48;
@ -193,7 +191,8 @@ Dash.prototype = {
},
_addApp: function(app) {
let display = new AppDisplay.AppWellIcon(app);
let display = new AppDisplay.AppWellIcon(app,
{ setSizeManually: true });
display._draggable.connect('drag-begin',
Lang.bind(this, function() {
display.actor.opacity = 50;
@ -273,7 +272,11 @@ Dash.prototype = {
if (app == null || app.is_transient())
return DND.DragMotionResult.NO_DROP;
let numFavorites = AppFavorites.getAppFavorites().getFavorites().length;
let favorites = AppFavorites.getAppFavorites().getFavorites();
let numFavorites = favorites.length;
let favPos = favorites.indexOf(app);
let numChildren = this._box.get_children().length;
let boxHeight = this._box.height;
@ -291,15 +294,16 @@ Dash.prototype = {
this._dragPlaceholderPos = pos;
if (this._dragPlaceholder)
this._dragPlaceholder.destroy();
// Don't allow positioning before or after self
if (favPos != -1 && (pos == favPos || pos == favPos + 1))
return DND.DragMotionResult.CONTINUE;
this._dragPlaceholder = new St.Bin({ style_class: 'dash-placeholder' });
this._box.insert_actor(this._dragPlaceholder, pos);
}
let id = app.get_id();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
let srcIsFavorite = (id in favorites);
let srcIsFavorite = (favPos != -1);
if (srcIsFavorite)
return DND.DragMotionResult.MOVE_DROP;

View File

@ -1,487 +1,11 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const St = imports.gi.St;
const Mainloop = imports.mainloop;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const DocInfo = imports.misc.docInfo;
const DND = imports.ui.dnd;
const GenericDisplay = imports.ui.genericDisplay;
const Main = imports.ui.main;
const Search = imports.ui.search;
const MAX_DASH_DOCS = 50;
const DASH_DOCS_ICON_SIZE = 16;
const DEFAULT_SPACING = 4;
/* This class represents a single display item containing information about a document.
* We take the current number of seconds in the constructor to avoid looking up the current
* time for every item when they are created in a batch.
*
* docInfo - DocInfo object containing information about the document
* currentSeconds - current number of seconds since the epoch
*/
function DocDisplayItem(docInfo, currentSecs) {
this._init(docInfo, currentSecs);
}
DocDisplayItem.prototype = {
__proto__: GenericDisplay.GenericDisplayItem.prototype,
_init : function(docInfo, currentSecs) {
GenericDisplay.GenericDisplayItem.prototype._init.call(this);
this._docInfo = docInfo;
this._setItemInfo(docInfo.name, '');
this._timeoutTime = -1;
this._resetTimeDisplay(currentSecs);
},
//// Public methods ////
getUpdateTimeoutTime: function() {
return this._timeoutTime;
},
// Update any relative-time based displays for this item.
redisplay: function(currentSecs) {
this._resetTimeDisplay(currentSecs);
},
//// Public method overrides ////
// Opens a document represented by this display item.
launch : function() {
this._docInfo.launch();
},
//// Protected method overrides ////
// Returns an icon for the item.
_createIcon : function() {
return this._docInfo.createIcon(GenericDisplay.ITEM_DISPLAY_ICON_SIZE);
},
// Returns a preview icon for the item.
_createPreviewIcon : function() {
return this._docInfo.createIcon(GenericDisplay.PREVIEW_ICON_SIZE);
},
// Creates and returns a large preview icon, but only if this._docInfo is an image file
// and we were able to generate a pixbuf from it successfully.
_createLargePreviewIcon : function() {
if (this._docInfo.mimeType == null || this._docInfo.mimeType.indexOf('image/') != 0)
return null;
try {
return St.TextureCache.get_default().load_uri_sync(St.TextureCachePolicy.NONE,
this._docInfo.uri, -1, -1);
} catch (e) {
// An exception will be raised when the image format isn't know
/* FIXME: http://bugzilla.gnome.org/show_bug.cgi?id=591480: should
* only ignore GDK_PIXBUF_ERROR_UNKNOWN_TYPE. */
return null;
}
},
//// Drag and Drop ////
shellWorkspaceLaunch: function() {
this.launch();
},
//// Private Methods ////
// Updates the last visited time displayed in the description text for the item.
_resetTimeDisplay: function(currentSecs) {
let lastSecs = this._docInfo.timestamp;
let timeDelta = currentSecs - lastSecs;
let [text, nextUpdate] = global.format_time_relative_pretty(timeDelta);
this._timeoutTime = currentSecs + nextUpdate;
this._setDescriptionText(text);
}
};
/* This class represents a display containing a collection of document items.
* The documents are sorted by how recently they were last visited.
*/
function DocDisplay() {
this._init();
}
DocDisplay.prototype = {
__proto__: GenericDisplay.GenericDisplay.prototype,
_init : function() {
GenericDisplay.GenericDisplay.prototype._init.call(this);
// We keep a single timeout callback for updating last visited times
// for all the items in the display. This avoids creating individual
// callbacks for each item in the display. So proper time updates
// for individual items and item details depend on the item being
// associated with one of the displays.
this._updateTimeoutTargetTime = -1;
this._updateTimeoutId = 0;
this._docManager = DocInfo.getDocManager();
this._docsStale = true;
this._docManager.connect('changed', Lang.bind(this, function(mgr, userData) {
this._docsStale = true;
// Changes in local recent files should not happen when we are in the Overview mode,
// but redisplaying right away is cool when we use Zephyr.
// Also, we might be displaying remote documents, like Google Docs, in the future
// which might be edited by someone else.
this._redisplay(GenericDisplay.RedisplayFlags.NONE);
}));
this.connect('destroy', Lang.bind(this, function (o) {
if (this._updateTimeoutId > 0)
Mainloop.source_remove(this._updateTimeoutId);
}));
},
//// Protected method overrides ////
// Gets the list of recent items from the recent items manager.
_refreshCache : function() {
if (!this._docsStale)
return true;
this._allItems = {};
Lang.copyProperties(this._docManager.getInfosByUri(), this._allItems);
this._docsStale = false;
return false;
},
// Sets the list of the displayed items based on how recently they were last visited.
_setDefaultList : function() {
// It seems to be an implementation detail of the Mozilla JavaScript that object
// properties are returned during the iteration in the same order in which they were
// defined, but it is not a guarantee according to this
// https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/for...in
// While this._allItems associative array seems to always be ordered by last added,
// as the results of this._recentManager.get_items() based on which it is constructed are,
// we should do the sorting manually because we want the order to be based on last visited.
//
// This function is called each time the search string is set back to '' or we display
// the Overview, so we are doing the sorting over the same items multiple times if the list
// of recent items didn't change. We could store an additional array of doc ids and sort
// them once when they are returned by this._recentManager.get_items() to avoid having to do
// this sorting each time, but the sorting seems to be very fast anyway, so there is no need
// to introduce an additional class variable.
this._matchedItems = {};
this._matchedItemKeys = [];
let docIdsToRemove = [];
for (docId in this._allItems) {
this._matchedItems[docId] = 1;
this._matchedItemKeys.push(docId);
}
for (docId in docIdsToRemove) {
delete this._allItems[docId];
}
this._matchedItemKeys.sort(Lang.bind(this, this._compareItems));
},
// Compares items associated with the item ids based on how recently the items
// were last visited.
// Returns an integer value indicating the result of the comparison.
_compareItems : function(itemIdA, itemIdB) {
let docA = this._allItems[itemIdA];
let docB = this._allItems[itemIdB];
return docB.timestamp - docA.timestamp;
},
// Checks if the item info can be a match for the search string by checking
// the name of the document. Item info is expected to be GtkRecentInfo.
// Returns a boolean flag indicating if itemInfo is a match.
_isInfoMatching : function(itemInfo, search) {
if (!itemInfo.exists())
return false;
if (search == null || search == '')
return true;
let name = itemInfo.name.toLowerCase();
if (name.indexOf(search) >= 0)
return true;
// TODO: we can also check doc URIs, so that
// if you search for a directory name, we display recent files from it
return false;
},
// Creates a DocDisplayItem based on itemInfo, which is expected to be a DocInfo object.
_createDisplayItem: function(itemInfo) {
let currentSecs = new Date().getTime() / 1000;
let docDisplayItem = new DocDisplayItem(itemInfo, currentSecs);
this._updateTimeoutCallback(docDisplayItem, currentSecs);
return docDisplayItem;
},
//// Private Methods ////
// A callback function that redisplays the items, updating their descriptions,
// and sets up a new timeout callback.
_docTimeout: function () {
let currentSecs = new Date().getTime() / 1000;
this._updateTimeoutId = 0;
this._updateTimeoutTargetTime = -1;
for (let docId in this._displayedItems) {
let docDisplayItem = this._displayedItems[docId];
docDisplayItem.redisplay(currentSecs);
this._updateTimeoutCallback(docDisplayItem, currentSecs);
}
return false;
},
// Updates the timeout callback if the timeout time for the docDisplayItem
// is earlier than the target time for the current timeout callback.
_updateTimeoutCallback: function (docDisplayItem, currentSecs) {
let timeoutTime = docDisplayItem.getUpdateTimeoutTime();
if (this._updateTimeoutTargetTime < 0 || timeoutTime < this._updateTimeoutTargetTime) {
if (this._updateTimeoutId > 0)
Mainloop.source_remove(this._updateTimeoutId);
this._updateTimeoutId = Mainloop.timeout_add_seconds(timeoutTime - currentSecs, Lang.bind(this, this._docTimeout));
this._updateTimeoutTargetTime = timeoutTime;
}
}
};
Signals.addSignalMethods(DocDisplay.prototype);
function DashDocDisplayItem(docInfo) {
this._init(docInfo);
}
DashDocDisplayItem.prototype = {
_init: function(docInfo) {
this._info = docInfo;
this._icon = docInfo.createIcon(DASH_DOCS_ICON_SIZE);
this.actor = new St.Clickable({ style_class: 'recent-docs-item',
reactive: true,
x_align: St.Align.START });
let box = new St.BoxLayout({ style_class: 'recent-docs-item-box' });
this.actor.set_child(box);
box.add(this._icon);
let text = new St.Label({ text: docInfo.name });
box.add(text);
this.actor.connect('clicked', Lang.bind(this, function () {
docInfo.launch();
Main.overview.hide();
}));
this.actor._delegate = this;
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);
}));
},
getUri: function() {
return this._info.uri;
},
getDragActorSource: function() {
return this._icon;
},
getDragActor: function(stageX, stageY) {
this.dragActor = this._info.createIcon(DASH_DOCS_ICON_SIZE);
return this.dragActor;
},
//// Drag and drop functions ////
shellWorkspaceLaunch: function () {
this._info.launch();
}
};
/**
* Class used to display two column recent documents in the dash
*/
function DashDocDisplay() {
this._init();
}
DashDocDisplay.prototype = {
_init: function() {
this.actor = new Shell.GenericContainer();
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
this._actorsByUri = {};
this._docManager = DocInfo.getDocManager();
this._docManager.connect('changed', Lang.bind(this, this._onDocsChanged));
this._pendingDocsChange = true;
this._checkDocExistence = false;
},
_getPreferredWidth: function(actor, forHeight, alloc) {
let children = actor.get_children();
// We use two columns maximum. Just take the min and natural size of the
// first two items, even though strictly speaking it's not correct; we'd
// need to calculate how many items we could fit for the height, then
// take the biggest preferred width for each column.
// In practice the dash gets a fixed width anyways.
// If we have one child, add its minimum and natural size
if (children.length > 0) {
let [minSize, naturalSize] = children[0].get_preferred_width(forHeight);
alloc.min_size += minSize;
alloc.natural_size += naturalSize;
}
// If we have two, add its size, plus DEFAULT_SPACING
if (children.length > 1) {
let [minSize, naturalSize] = children[1].get_preferred_width(forHeight);
alloc.min_size += DEFAULT_SPACING + minSize;
alloc.natural_size += DEFAULT_SPACING + naturalSize;
}
},
_getPreferredHeight: function(actor, forWidth, alloc) {
let children = actor.get_children();
// The width of an item is our allocated width, minus spacing, divided in half.
this._itemWidth = Math.floor((forWidth - DEFAULT_SPACING) / 2);
let maxNatural = 0;
for (let i = 0; i < children.length; i++) {
let child = children[i];
let [minSize, naturalSize] = child.get_preferred_height(this._itemWidth);
maxNatural = Math.max(maxNatural, naturalSize);
}
this._itemHeight = maxNatural;
let firstColumnChildren = Math.ceil(children.length / 2);
alloc.natural_size = (firstColumnChildren * maxNatural +
(firstColumnChildren - 1) * DEFAULT_SPACING);
},
_allocate: function(actor, box, flags) {
let width = box.x2 - box.x1;
let height = box.y2 - box.y1;
// Make sure this._itemWidth/Height have been computed, even
// if the parent actor didn't check our size before allocating.
// (Not clear if that is required or not as a Clutter
// invariant; this is safe and cheap because of caching.)
actor.get_preferred_height(width);
let children = actor.get_children();
let x = 0;
let y = 0;
let columnIndex = 0;
let i = 0;
// Loop over the children, going vertically down first. When we run
// out of vertical space (our y variable is bigger than box.y2), switch
// to the second column.
while (i < children.length) {
let child = children[i];
if (y + this._itemHeight > box.y2) {
// Is this the second column, or we're in
// the first column and can't even fit one
// item? In that case, break.
if (columnIndex == 1 || i == 0) {
break;
}
// Set x to the halfway point.
columnIndex += 1;
x = x + this._itemWidth + DEFAULT_SPACING;
// And y is back to the top.
y = 0;
// Retry this same item, now that we're in the second column.
// By looping back to the top here, we re-test the size
// again for the second column.
continue;
}
let childBox = new Clutter.ActorBox();
childBox.x1 = x;
childBox.y1 = y;
childBox.x2 = childBox.x1 + this._itemWidth;
childBox.y2 = y + this._itemHeight;
y = childBox.y2 + DEFAULT_SPACING;
child.allocate(childBox, flags);
this.actor.set_skip_paint(child, false);
i++;
}
if (this._checkDocExistence) {
// Now we know how many docs we are displaying, queue a check to see if any of them
// have been deleted. If they are deleted, then we'll get a 'changed' signal; since
// we'll now be displaying items we weren't previously, we'll check again to see
// if they were deleted, and so forth and so on.
// TODO: We should change this to ask for as many as we can fit in the given space:
// https://bugzilla.gnome.org/show_bug.cgi?id=603522#c23
this._docManager.queueExistenceCheck(i);
this._checkDocExistence = false;
}
for (; i < children.length; i++)
this.actor.set_skip_paint(children[i], true);
},
_onDocsChanged: function() {
this._checkDocExistence = true;
Main.queueDeferredWork(this._workId);
},
_redisplay: function() {
// Should be kept alive by the _actorsByUri
this.actor.remove_all();
let docs = this._docManager.getTimestampOrderedInfos();
for (let i = 0; i < docs.length && i < MAX_DASH_DOCS; i++) {
let doc = docs[i];
let display = this._actorsByUri[doc.uri];
if (display) {
this.actor.add_actor(display.actor);
} else {
let display = new DashDocDisplayItem(doc);
this.actor.add_actor(display.actor);
this._actorsByUri[doc.uri] = display;
}
}
// Any unparented actors must have been deleted
for (let uri in this._actorsByUri) {
let display = this._actorsByUri[uri];
if (display.actor.get_parent() == null) {
display.actor.destroy();
delete this._actorsByUri[uri];
}
}
this.emit('changed');
}
};
Signals.addSignalMethods(DashDocDisplay.prototype);
function DocSearchProvider() {
this._init();

504
js/ui/endSessionDialog.js Normal file
View File

@ -0,0 +1,504 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*-
*
* Copyright 2010 Red Hat, Inc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
const DBus = imports.dbus;
const Lang = imports.lang;
const Signals = imports.signals;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Clutter = imports.gi.Clutter;
const Gdm = imports.gi.Gdm;
const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Pango = imports.gi.Pango;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const GnomeSession = imports.misc.gnomeSession
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
let _endSessionDialog = null;
const _ITEM_ICON_SIZE = 48;
const _DIALOG_ICON_SIZE = 32;
const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
const EndSessionDialogIface = {
name: 'org.gnome.SessionManager.EndSessionDialog',
methods: [{ name: 'Open',
inSignature: 'uuuao',
outSignature: ''
}
],
signals: [{ name: 'Canceled',
outSignature: '',
}],
properties: []
};
const logoutDialogContent = {
subjectWithUser: _("Log Out %s"),
subject: _("Log Out"),
inhibitedDescription: _("Click Log Out to quit these applications and log out of the system."),
uninhibitedDescriptionWithUser: _("%s will be logged out automatically in %d seconds."),
uninhibitedDescription: _("You will be logged out automatically in %d seconds."),
endDescription: _("Logging out of the system."),
confirmButtonText: _("Log Out"),
iconStyleClass: 'end-session-dialog-logout-icon'
};
const shutdownDialogContent = {
subject: _("Shut Down"),
inhibitedDescription: _("Click Shut Down to quit these applications and shut down the system."),
uninhibitedDescription: _("The system will shut down automatically in %d seconds."),
endDescription: _("Shutting down the system."),
confirmButtonText: _("Shut Down"),
iconName: 'system-shutdown',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
const restartDialogContent = {
subject: _("Restart"),
inhibitedDescription: _("Click Restart to quit these applications and restart the system."),
uninhibitedDescription: _("The system will restart automatically in %d seconds."),
endDescription: _("Restarting the system."),
confirmButtonText: _("Restart"),
iconName: 'system-shutdown',
iconStyleClass: 'end-session-dialog-shutdown-icon'
};
const DialogContent = {
0 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_LOGOUT */: logoutDialogContent,
1 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_SHUTDOWN */: shutdownDialogContent,
2 /* GSM_SHELL_END_SESSION_DIALOG_TYPE_RESTART */: restartDialogContent
};
function findAppFromInhibitor(inhibitor) {
let desktopFile = inhibitor.app_id;
if (!GLib.str_has_suffix(desktopFile, '.desktop'))
desktopFile += '.desktop';
let candidateDesktopFiles = [];
candidateDesktopFiles.push(desktopFile);
candidateDesktopFiles.push('gnome-' + desktopFile);
let appSystem = Shell.AppSystem.get_default();
let app = null;
for (let i = 0; i < candidateDesktopFiles.length; i++) {
try {
app = appSystem.get_app(candidateDesktopFiles[i]);
if (app)
break;
} catch(e) {
// ignore errors
}
}
return app;
}
function ListItem(app, reason) {
this._init(app, reason);
}
ListItem.prototype = {
_init: function(app, reason) {
this._app = app;
this._reason = reason;
if (this._reason == null)
this._reason = '';
let layout = new St.BoxLayout({ vertical: false});
this.actor = new St.Clickable({ style_class: 'end-session-dialog-app-list-item',
can_focus: true,
child: layout,
reactive: true,
x_align: St.Align.START,
x_fill: true });
this._icon = this._app.create_icon_texture(_ITEM_ICON_SIZE);
let iconBin = new St.Bin({ style_class: 'end-session-dialog-app-list-item-icon',
child: this._icon });
layout.add(iconBin);
let textLayout = new St.BoxLayout({ style_class: 'end-session-dialog-app-list-item-text-box',
vertical: true });
layout.add(textLayout);
this._nameLabel = new St.Label({ text: this._app.get_name(),
style_class: 'end-session-dialog-app-list-item-name' });
textLayout.add(this._nameLabel,
{ expand: false,
x_fill: true });
this._descriptionLabel = new St.Label({ text: this._reason,
style_class: 'end-session-dialog-app-list-item-description' });
textLayout.add(this._descriptionLabel,
{ expand: true,
x_fill: true });
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
},
_onClicked: function() {
this.emit('activate');
this._app.activate();
}
};
Signals.addSignalMethods(ListItem.prototype);
// The logout timer only shows updates every 10 seconds
// until the last 10 seconds, then it shows updates every
// second. This function takes a given time and returns
// what we should show to the user for that time.
function _roundSecondsToInterval(totalSeconds, secondsLeft, interval) {
let time;
time = Math.ceil(secondsLeft);
// Final count down is in decrements of 1
if (time <= interval)
return time;
// Round up higher than last displayable time interval
time += interval - 1;
// Then round down to that time interval
if (time > totalSeconds)
time = Math.ceil(totalSeconds);
else
time -= time % interval;
return time;
}
function _setLabelText(label, text) {
if (text) {
label.set_text(text);
label.show();
} else {
label.set_text('');
label.hide();
}
}
function EndSessionDialog() {
if (_endSessionDialog == null) {
this._init();
DBus.session.exportObject('/org/gnome/SessionManager/EndSessionDialog',
this);
_endSessionDialog = this;
}
return _endSessionDialog;
}
function init() {
// This always returns the same singleton object
// By instantiating it initially, we register the
// bus object, etc.
let dialog = new EndSessionDialog();
}
EndSessionDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init: function() {
ModalDialog.ModalDialog.prototype._init.call(this);
this._user = Gdm.UserManager.ref_default().get_user(GLib.get_user_name());
this._secondsLeft = 0;
this._totalSecondsToStayOpen = 0;
this._inhibitors = [];
this.connect('destroy',
Lang.bind(this, this._onDestroy));
this.connect('opened',
Lang.bind(this, this._onOpened));
this._userLoadedId = this._user.connect('notify::is_loaded',
Lang.bind(this, this._updateContent));
this._userChangedId = this._user.connect('changed',
Lang.bind(this, this._updateContent));
let mainContentLayout = new St.BoxLayout({ vertical: false });
this.contentLayout.add(mainContentLayout,
{ x_fill: true,
y_fill: false });
this._iconBin = new St.Bin();
mainContentLayout.add(this._iconBin,
{ x_fill: true,
y_fill: false,
x_align: St.Align.END,
y_align: St.Align.START });
let messageLayout = new St.BoxLayout({ vertical: true });
mainContentLayout.add(messageLayout,
{ y_align: St.Align.START });
this._subjectLabel = new St.Label({ style_class: 'end-session-dialog-subject' });
messageLayout.add(this._subjectLabel,
{ y_fill: false,
y_align: St.Align.START });
this._descriptionLabel = new St.Label({ style_class: 'end-session-dialog-description' });
this._descriptionLabel.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
this._descriptionLabel.clutter_text.line_wrap = true;
messageLayout.add(this._descriptionLabel,
{ y_fill: true,
y_align: St.Align.START });
let scrollView = new St.ScrollView({ style_class: 'end-session-dialog-app-list'});
scrollView.set_policy(Gtk.PolicyType.NEVER,
Gtk.PolicyType.AUTOMATIC);
this.contentLayout.add(scrollView,
{ x_fill: true,
y_fill: true });
this._applicationList = new St.BoxLayout({ vertical: true });
scrollView.add_actor(this._applicationList,
{ x_fill: true,
y_fill: true,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
},
_onDestroy: function() {
this._user.disconnect(this._userLoadedId);
this._user.disconnect(this._userChangedId);
},
_setIconFromFile: function(iconFile, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
this._iconBin.child = null;
if (iconFile) {
this._iconBin.show();
this._iconBin.set_style('background-image: url("' + iconFile + '");');
} else {
this._iconBin.hide();
}
},
_setIconFromName: function(iconName, styleClass) {
if (styleClass)
this._iconBin.set_style_class_name(styleClass);
this._iconBin.set_style(null);
if (iconName != null) {
let textureCache = St.TextureCache.get_default();
let icon = textureCache.load_icon_name(this._iconBin.get_theme_node(),
iconName,
St.IconType.SYMBOLIC,
_DIALOG_ICON_SIZE);
this._iconBin.child = icon;
this._iconBin.show();
} else {
this._iconBin.child = null;
this._iconBin.hide();
}
},
_updateContent: function() {
if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED)
return;
let dialogContent = DialogContent[this._type];
let subject = dialogContent.subject;
let description;
if (this._user.is_loaded && !dialogContent.iconName) {
let iconFile = this._user.get_icon_file();
this._setIconFromFile(iconFile, dialogContent.iconStyleClass);
} else if (dialogContent.iconName) {
this._setIconFromName(dialogContent.iconName,
dialogContent.iconStyleClass);
}
if (this._inhibitors.length > 0) {
this._stopTimer();
description = dialogContent.inhibitedDescription;
} else if (this._secondsLeft > 0 && this._inhibitors.length == 0) {
let displayTime = _roundSecondsToInterval(this._totalSecondsToStayOpen,
this._secondsLeft,
10);
if (this._user.is_loaded) {
let realName = this._user.get_real_name();
if (realName != null) {
if (dialogContent.subjectWithUser)
subject = dialogContent.subjectWithUser.format(realName);
if (dialogContent.uninhibitedDescriptionWithUser)
description = dialogContent.uninhibitedDescriptionWithUser.format(realName, displayTime);
else
description = dialogContent.uninhibitedDescription.format(displayTime);
}
}
if (!description)
description = dialogContent.uninhibitedDescription.format(displayTime);
} else {
description = dialogContent.endDescription;
}
_setLabelText(this._subjectLabel, subject);
_setLabelText(this._descriptionLabel, description);
},
_updateButtons: function() {
if (this.state != ModalDialog.State.OPENING &&
this.state != ModalDialog.State.OPENED)
return;
let dialogContent = DialogContent[this._type];
let confirmButtonText = _("Confirm");
if (dialogContent.confirmButtonText)
confirmButtonText = dialogContent.confirmButtonText;
this.setButtons([{ label: _("Cancel"),
action: Lang.bind(this, this.cancel),
key: Clutter.Escape
},
{ label: confirmButtonText,
action: Lang.bind(this, this._confirm)
}]);
},
cancel: function() {
this._stopTimer();
DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
'org.gnome.SessionManager.EndSessionDialog',
'Canceled', '', []);
this.close(global.get_current_time());
},
_confirm: function() {
this._fadeOutDialog();
this._stopTimer();
DBus.session.emit_signal('/org/gnome/SessionManager/EndSessionDialog',
'org.gnome.SessionManager.EndSessionDialog',
'Confirmed', '', []);
},
_onOpened: function() {
if (this._inhibitors.length == 0)
this._startTimer();
},
_startTimer: function() {
this._secondsLeft = this._totalSecondsToStayOpen;
Tweener.addTween(this,
{ _secondsLeft: 0,
time: this._secondsLeft,
transition: 'linear',
onUpdate: Lang.bind(this, this._updateContent),
onComplete: Lang.bind(this, this._confirm),
});
},
_stopTimer: function() {
Tweener.removeTweens(this);
this._secondsLeft = 0;
},
_onInhibitorLoaded: function(inhibitor) {
if (this._inhibitors.indexOf(inhibitor) < 0) {
// Stale inhibitor
return;
}
let app = findAppFromInhibitor(inhibitor);
if (app) {
let item = new ListItem(app, inhibitor.reason);
item.connect('activate',
Lang.bind(this, function() {
this.close(global.get_current_time());
}));
this._applicationList.add(item.actor, { x_fill: true });
this._stopTimer();
} else {
// inhibiting app is a service, not an application
this._inhibitors.splice(this._inhibitors.indexOf(inhibitor), 1);
}
this._updateContent();
},
OpenAsync: function(type, timestamp, totalSecondsToStayOpen, inhibitorObjectPaths, callback) {
this._totalSecondsToStayOpen = totalSecondsToStayOpen;
this._inhibitors = [];
this._applicationList.remove_all();
this._type = type;
if (!(this._type in DialogContent))
throw new DBus.DBusError('org.gnome.Shell.ModalDialog.TypeError',
"Unknown dialog type requested");
for (let i = 0; i < inhibitorObjectPaths.length; i++) {
let inhibitor = new GnomeSession.Inhibitor(inhibitorObjectPaths[i]);
inhibitor.connect('is-loaded',
Lang.bind(this, function() {
this._onInhibitorLoaded(inhibitor);
}));
this._inhibitors.push(inhibitor);
}
if (!this.open(timestamp))
throw new DBus.DBusError('org.gnome.Shell.ModalDialog.GrabError',
"Cannot grab pointer and keyboard");
this._updateButtons();
this._updateContent();
let signalId = this.connect('opened',
Lang.bind(this, function() {
callback();
this.disconnect(signalId);
}));
}
};
DBus.conformExport(EndSessionDialog.prototype, EndSessionDialogIface);

View File

@ -88,7 +88,7 @@ function init() {
_blockMethod('Clutter.Event.get_state', 'Shell.get_event_state',
'gjs\'s handling of Clutter.ModifierType is broken. See bug 597292.');
_blockMethod('Gdk.Display.get_device_state', 'global.get_pointer',
_blockMethod('Gdk.Device.get_state', 'global.get_pointer',
'gjs\'s handling of Gdk.ModifierType is broken. See bug 597292.');
_blockMethod('Gdk.Window.get_device_position', 'global.get_pointer',
'gjs\'s handling of Gdk.ModifierType is broken. See bug 597292.');

View File

@ -4,6 +4,8 @@ const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const St = imports.gi.St;
const Config = imports.misc.config;
const ExtensionState = {
ENABLED: 1,
DISABLED: 2,
@ -25,6 +27,36 @@ var disabledExtensions;
// GFile for user extensions
var userExtensionsDir = null;
/**
* versionCheck:
* @required: an array of versions we're compatible with
* @current: the version we have
*
* Check if a component is compatible for an extension.
* @required is an array, and at least one version must match.
* @current must be in the format <major>.<minor>.<point>.<micro>
* <micro> is always ignored
* <point> is ignored if <minor> is even (so you can target the
* whole stable release)
* <minor> and <major> must match
* Each target version must be at least <major> and <minor>
*/
function versionCheck(required, current) {
let currentArray = current.split('.');
let major = currentArray[0];
let minor = currentArray[1];
let point = currentArray[2];
for (let i = 0; i < required.length; i++) {
let requiredArray = required[i].split('.');
if (requiredArray[0] == major &&
requiredArray[1] == minor &&
(requiredArray[2] == point ||
(requiredArray[2] == undefined && parseInt(minor) % 2 == 0)))
return true;
}
return false;
}
function loadExtension(dir, enabled, type) {
let info;
let baseErrorString = 'While loading extension from "' + dir.get_parse_name() + '": ';
@ -43,8 +75,8 @@ function loadExtension(dir, enabled, type) {
global.logError(baseErrorString + 'Failed to parse metadata.json: ' + e);
return;
}
let requiredProperties = ['uuid', 'name', 'description'];
for (let i = 0; i < requiredProperties; i++) {
let requiredProperties = ['uuid', 'name', 'description', 'shell-version'];
for (let i = 0; i < requiredProperties.length; i++) {
let prop = requiredProperties[i];
if (!meta[prop]) {
global.logError(baseErrorString + 'missing "' + prop + '" property in metadata.json');
@ -68,6 +100,12 @@ function loadExtension(dir, enabled, type) {
return;
}
if (!versionCheck(meta['shell-version'], Config.PACKAGE_VERSION) ||
(meta['js-version'] && !versionCheck(meta['js-version'], Config.GJS_VERSION))) {
global.logError(baseErrorString + 'extension is not compatible with current GNOME Shell and/or GJS version');
return;
}
extensionMeta[meta.uuid] = meta;
extensionMeta[meta.uuid].type = type;
extensionMeta[meta.uuid].path = dir.get_path();

View File

@ -1,693 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const DND = imports.ui.dnd;
const Main = imports.ui.main;
const RedisplayFlags = { NONE: 0,
FULL: 1 << 1,
SUBSEARCH: 1 << 2,
IMMEDIATE: 1 << 3 };
// Used by subclasses
const ITEM_DISPLAY_ICON_SIZE = 48;
const PREVIEW_ICON_SIZE = 96;
/* This is a virtual class that represents a single display item containing
* a name, a description, and an icon. It allows selecting an item and represents
* it by highlighting it with a different background color than the default.
*/
function GenericDisplayItem() {
this._init();
}
GenericDisplayItem.prototype = {
_init: function() {
this.actor = new St.BoxLayout({ style_class: 'generic-display-item',
reactive: true });
this.actor._delegate = this;
this.actor.connect('button-release-event',
Lang.bind(this,
function() {
// Activates the item by launching it
this.emit('activate');
return true;
}));
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);
}));
this._iconBin = new St.Bin();
this.actor.add(this._iconBin);
this._infoText = new St.BoxLayout({ style_class: 'generic-display-item-text',
vertical: true });
this.actor.add(this._infoText, { expand: true, y_fill: false });
this._name = null;
this._description = null;
this._icon = null;
this._initialLoadComplete = false;
// An array of details description actors that we create over time for the item.
// It is used for updating the description text inside the details actor when
// the description text for the item is updated.
this._detailsDescriptions = [];
},
//// Draggable object interface ////
// Returns a cloned texture of the item's icon to represent the item as it
// is being dragged.
getDragActor: function(stageX, stageY) {
return this._createIcon();
},
// Returns the item icon, a separate copy of which is used to
// represent the item as it is being dragged. This is used to
// determine a snap-back location for the drag icon if it does
// not get accepted by any drop target.
getDragActorSource: function() {
return this._icon;
},
//// Public methods ////
// Highlights the item by setting a different background color than the default
// if isSelected is true, removes the highlighting otherwise.
markSelected: function(isSelected) {
if (isSelected)
this.actor.add_style_pseudo_class('selected');
else
this.actor.remove_style_pseudo_class('selected');
},
/*
* Returns an actor containing item details. In the future details can have more information than what
* the preview pop-up has and be item-type specific.
*/
createDetailsActor: function() {
let details = new St.BoxLayout({ style_class: 'generic-display-container',
vertical: true });
let mainDetails = new St.BoxLayout({ style_class: 'generic-display-container' });
// Inner box with name and description
let textDetails = new St.BoxLayout({ style_class: 'generic-display-details',
vertical: true });
let detailsName = new St.Label({ style_class: 'generic-display-details-name',
text: this._name.text });
textDetails.add(detailsName);
let detailsDescription = new St.Label({ text: this._description.text });
textDetails.add(detailsDescription);
this._detailsDescriptions.push(detailsDescription);
mainDetails.add(textDetails, { expand: true });
let previewIcon = this._createPreviewIcon();
let largePreviewIcon = this._createLargePreviewIcon();
if (previewIcon != null && largePreviewIcon == null) {
mainDetails.insert_actor(previewIcon, 0);
}
details.add(mainDetails);
if (largePreviewIcon != null) {
details.add(largePreviewIcon);
}
return details;
},
// Destroys the item.
destroy: function() {
this.actor.destroy();
},
//// Pure virtual public methods ////
// Performes an action associated with launching this item, such as opening a file or an application.
launch: function() {
throw new Error('Not implemented');
},
//// Protected methods ////
/*
* Creates the graphical elements for the item based on the item information.
*
* nameText - name of the item
* descriptionText - short description of the item
*/
_setItemInfo: function(nameText, descriptionText) {
if (this._name != null) {
// this also removes this._name from the parent container,
// so we don't need to call this.actor.remove_actor(this._name) directly
this._name.destroy();
this._name = null;
}
if (this._description != null) {
this._description.destroy();
this._description = null;
}
if (this._icon != null) {
// though we get the icon from elsewhere, we assume its ownership here,
// and therefore should be responsible for distroying it
this._icon.destroy();
this._icon = null;
}
this._icon = this._createIcon();
this._iconBin.set_child(this._icon);
this._name = new St.Label({ style_class: 'generic-display-item-name',
text: nameText });
this._infoText.add(this._name);
this._description = new St.Label({ style_class: 'generic-display-item-description',
text: descriptionText ? descriptionText : '' });
this._infoText.add(this._description);
},
// Sets the description text for the item, including the description text
// in the details actors that have been created for the item.
_setDescriptionText: function(text) {
this._description.text = text;
for (let i = 0; i < this._detailsDescriptions.length; i++) {
let detailsDescription = this._detailsDescriptions[i];
if (detailsDescription != null) {
detailsDescription.text = text;
}
}
},
//// Virtual protected methods ////
// Creates and returns a large preview icon, but only if we have a detailed image.
_createLargePreviewIcon : function() {
return null;
},
//// Pure virtual protected methods ////
// Returns an icon for the item.
_createIcon: function() {
throw new Error('Not implemented');
},
// Returns a preview icon for the item.
_createPreviewIcon: function() {
throw new Error('Not implemented');
}
//// Private methods ////
};
Signals.addSignalMethods(GenericDisplayItem.prototype);
/* This is a virtual class that represents a display containing a collection of items
* that can be filtered with a search string.
*/
function GenericDisplay() {
this._init();
}
GenericDisplay.prototype = {
_init : function() {
this._search = '';
this._expanded = false;
this.actor = new St.ScrollView({ x_fill: true,
y_fill: false,
vshadows: true });
this._list = new St.BoxLayout({ style_class: 'generic-display-container',
vertical: true });
this.actor.add_actor(this._list);
this.actor.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this._pendingRedisplay = RedisplayFlags.NONE;
this.actor.connect('notify::mapped', Lang.bind(this, this._onMappedNotify));
// map<itemId, Object> where Object represents the item info
this._allItems = {};
// set<itemId>
this._matchedItems = {};
// sorted array of items matched by search
this._matchedItemKeys = [];
// map<itemId, GenericDisplayItem>
this._displayedItems = {};
this._openDetailIndex = -1;
this._selectedIndex = -1;
},
//// Public methods ////
// Sets the search string and displays the matching items.
setSearch: function(text) {
let lowertext = text.toLowerCase();
if (lowertext == this._search) {
return;
}
let flags = RedisplayFlags.IMMEDIATE;
if (this._search != '') {
// Because we combine search terms with OR, we have to be sure that no new term
// was introduced before deciding that the new search results will be a subset of
// the existing search results.
if (lowertext.indexOf(this._search) == 0 &&
lowertext.split(/\s+/).length == this._search.split(/\s+/).length) {
flags |= RedisplayFlags.SUBSEARCH;
}
}
this._search = lowertext;
this._redisplay(flags);
},
// Launches the item that is currently selected, closing the Overview
activateSelected: function() {
if (this._selectedIndex != -1) {
let selected = this._findDisplayedByIndex(this._selectedIndex);
selected.launch();
this.unsetSelected();
Main.overview.hide();
}
},
// Moves the selection one up. If the selection was already on the top item, it's moved
// to the bottom one. Returns true if the selection actually moved up, false if it wrapped
// around to the bottom.
selectUp: function() {
let count = this._getVisibleCount();
let selectedUp = true;
let prev = this._selectedIndex - 1;
if (this._selectedIndex <= 0) {
prev = count - 1;
selectedUp = false;
}
this._selectIndex(prev);
return selectedUp;
},
// Moves the selection one down. If the selection was already on the bottom item, it's moved
// to the top one. Returns true if the selection actually moved down, false if it wrapped
// around to the top.
selectDown: function() {
let count = this._getVisibleCount();
let selectedDown = true;
let next = this._selectedIndex + 1;
if (this._selectedIndex == count - 1) {
next = 0;
selectedDown = false;
}
this._selectIndex(next);
return selectedDown;
},
// Selects the first item among the displayed items.
selectFirstItem: function() {
if (this.hasItems())
this._selectIndex(0);
},
// Selects the last item among the displayed items.
selectLastItem: function() {
let count = this._getVisibleCount();
if (this.hasItems())
this._selectIndex(count - 1);
},
// Returns true if the display has some item selected.
hasSelected: function() {
return this._selectedIndex != -1;
},
// Removes selection if some display item is selected.
unsetSelected: function() {
this._selectIndex(-1);
},
// Returns true if the display has any displayed items.
hasItems: function() {
// TODO: figure out why this._list.displayedCount is returning a
// positive number when this._mathedItems.length is 0
// This can be triggered if a search string is entered for which there are no matches.
// log('this._mathedItems.length: ' + this._matchedItems.length + ' this._list.displayedCount ' + this._list.displayedCount);
return this._matchedItemKeys.length > 0;
},
getMatchedItemsCount: function() {
return this._matchedItemKeys.length;
},
// Load the initial state
load: function() {
this._redisplay(RedisplayFlags.FULL);
},
// Should be called when the display is closed
resetState: function() {
this._filterReset();
this._openDetailIndex = -1;
this.actor.get_vscroll_bar().get_adjustment().value = 0;
},
// Returns an actor which acts as a sidebar; this is used for
// the applications category view
getNavigationArea: function () {
return null;
},
createDetailsForIndex: function(index) {
let item = this._findDisplayedByIndex(index);
return item.createDetailsActor();
},
//// Protected methods ////
_recreateDisplayItems: function() {
this._removeAllDisplayItems();
this._setDefaultList();
for (let itemId in this._allItems) {
this._addDisplayItem(itemId);
}
},
// Creates a display item based on the information associated with itemId
// and adds it to the list of displayed items, but does not yet display it.
_addDisplayItem : function(itemId) {
if (this._displayedItems.hasOwnProperty(itemId)) {
log('Tried adding a display item for ' + itemId + ', but an item with this item id is already among displayed items.');
return;
}
let itemInfo = this._allItems[itemId];
let displayItem = this._createDisplayItem(itemInfo);
displayItem.connect('activate',
Lang.bind(this,
function() {
// update the selection
this._selectIndex(this._list.get_children().indexOf(displayItem.actor));
this.activateSelected();
}));
displayItem.connect('show-details',
Lang.bind(this,
function() {
let index = this._list.get_children().indexOf(displayItem.actor);
/* Close the details pane if already open */
if (index == this._openDetailIndex) {
this._openDetailIndex = -1;
this.emit('show-details', -1);
} else {
this._openDetailIndex = index;
this.emit('show-details', index);
}
}));
this._displayedItems[itemId] = displayItem;
},
// Removes an item identifed by the itemId from the displayed items.
_removeDisplayItem: function(itemId) {
let children = this._list.get_children();
let count = children.length;
let displayItem = this._displayedItems[itemId];
let displayItemIndex = children.indexOf(displayItem.actor);
if (this.hasSelected() && count == 1) {
this.unsetSelected();
} else if (this.hasSelected() && displayItemIndex < this._selectedIndex) {
this.selectUp();
}
displayItem.destroy();
delete this._displayedItems[itemId];
},
// Removes all displayed items.
_removeAllDisplayItems: function() {
this.unsetSelected();
for (itemId in this._displayedItems)
this._removeDisplayItem(itemId);
},
// Return true if there's an active search or other constraint
// on the list
_filterActive: function() {
return this._search != '';
},
// Called when we are resetting state
_filterReset: function() {
this.unsetSelected();
},
_compareSearchMatch: function(a, b) {
let countA = this._matchedItems[a];
let countB = this._matchedItems[b];
if (countA > countB)
return -1;
else if (countA < countB)
return 1;
else
return this._compareItems(a, b);
},
_setMatches: function(matches) {
this._matchedItems = matches;
this._matchedItemKeys = [];
for (let itemId in this._matchedItems) {
this._matchedItemKeys.push(itemId);
}
this._matchedItemKeys.sort(Lang.bind(this, this._compareSearchMatch));
},
/**
* _redisplaySubSearch:
* A somewhat more optimized function called when we know
* that we're going to be displaying a subset of the items
* we already had, in the same order. In that case, we can
* just hide the actors that shouldn't be shown.
*/
_redisplaySubSearch: function() {
let matches = this._getSearchMatchedItems(true);
// Just hide all from the old set,
// we'll show the ones we want below
for (let itemId in this._displayedItems) {
let item = this._displayedItems[itemId];
item.actor.hide();
}
this._setMatches(matches);
for (let itemId in matches) {
let item = this._displayedItems[itemId];
item.actor.show();
}
this._list.queue_relayout();
},
_redisplayReordering: function() {
if (!this._filterActive()) {
this._setDefaultList();
} else {
this._setMatches(this._getSearchMatchedItems(false));
}
this._list.remove_all();
for (let i = 0; i < this._matchedItemKeys.length; i++) {
let itemId = this._matchedItemKeys[i];
let item = this._displayedItems[itemId];
item.actor.show();
this._list.add_actor(item.actor);
}
},
/*
* Updates the displayed items, applying the search string if one exists.
* @flags: Flags controlling redisplay behavior as follows:
* SUBSEARCH - Indicates that the current _search is a superstring of the previous
* one, which implies we only need to re-search through previous results.
* FULL - Indicates that we need recreate all displayed items.
* IMMEDIATE - Do the full redisplay even if we're not mapped. This is useful
* if you want to get the number of matched items and show/hide a section based on
* that number.
*/
_redisplay: function(flags) {
let immediate = (flags & RedisplayFlags.IMMEDIATE) != 0;
if (!immediate && !this.actor.mapped) {
this._pendingRedisplay |= flags;
return;
}
let isSubSearch = (flags & RedisplayFlags.SUBSEARCH) != 0;
let fullReload = (flags & RedisplayFlags.FULL) != 0;
let hadSelected = this.hasSelected();
this.unsetSelected();
if (!this._initialLoadComplete)
fullReload = true;
if (!this._refreshCache())
fullReload = true;
if (fullReload) {
this._recreateDisplayItems();
this._initialLoadComplete = true;
}
if (isSubSearch) {
this._redisplaySubSearch();
} else {
this._redisplayReordering();
}
if (hadSelected) {
this._selectedIndex = -1;
this.selectFirstItem();
}
this.emit('redisplayed');
},
//// Pure virtual protected methods ////
// Performs the steps needed to have the latest information about the items.
// Implementation should return %true if we are up to date, and %false
// if a full reload occurred.
_refreshCache: function() {
throw new Error('Not implemented');
},
// Sets the list of the displayed items based on the default sorting order.
// The default sorting order is specific to each implementing class.
_setDefaultList: function() {
throw new Error('Not implemented');
},
// Compares items associated with the item ids based on the order in which the
// items should be displayed.
// Intended to be used as a compareFunction for array.sort().
// Returns an integer value indicating the result of the comparison.
_compareItems: function(itemIdA, itemIdB) {
throw new Error('Not implemented');
},
// Checks if the item info can be a match for the search string.
// Returns a boolean flag indicating if that's the case.
_isInfoMatching: function(itemInfo, search) {
throw new Error('Not implemented');
},
// Creates a display item based on itemInfo.
_createDisplayItem: function(itemInfo) {
throw new Error('Not implemented');
},
//// Private methods ////
_getItemSearchScore: function(itemId, terms) {
let item = this._allItems[itemId];
let score = 0;
for (let i = 0; i < terms.length; i++) {
let term = terms[i];
if (this._isInfoMatching(item, term)) {
score++;
}
}
return score;
},
_getSearchMatchedItems: function(isSubSearch) {
// Break the search up into terms, and search for each
// individual term. Keep track of the number of terms
// each item matched.
let terms = this._search.split(/\s+/);
let matchScores = {};
if (isSubSearch) {
for (let i = 0; i < this._matchedItemKeys.length; i++) {
let itemId = this._matchedItemKeys[i];
let score = this._getItemSearchScore(itemId, terms);
if (score > 0)
matchScores[itemId] = score;
}
} else {
for (let itemId in this._displayedItems) {
let score = this._getItemSearchScore(itemId, terms);
if (score > 0)
matchScores[itemId] = score;
}
}
return matchScores;
},
// Returns a display item based on its index in the ordering of the
// display children.
_findDisplayedByIndex: function(index) {
let actor = this._list.get_children()[index];
return this._findDisplayedByActor(actor);
},
// Returns a display item based on the actor that represents it in
// the display.
_findDisplayedByActor: function(actor) {
for (itemId in this._displayedItems) {
let item = this._displayedItems[itemId];
if (item.actor == actor) {
return item;
}
}
return null;
},
// Selects (e.g. highlights) a display item at the provided index,
// updates this.selectedItemDetails actor, and emits 'selected' signal.
_selectIndex: function(index) {
// Cleanup from the previous item
if (this.hasSelected()) {
this._findDisplayedByIndex(this._selectedIndex).markSelected(false);
}
this._selectedIndex = index;
if (index < 0)
return;
// Mark the new item as selected and create its details pane
let item = this._findDisplayedByIndex(index);
item.markSelected(true);
this.emit('selected');
},
_getVisibleCount: function() {
return this._list.get_n_children();
},
_onMappedNotify: function () {
let mapped = this.actor.mapped;
if (mapped && this._pendingRedisplay > RedisplayFlags.NONE)
this._redisplay(this._pendingRedisplay);
this._pendingRedisplay = RedisplayFlags.NONE;
}
};
Signals.addSignalMethods(GenericDisplay.prototype);

View File

@ -398,6 +398,9 @@ Inspector.prototype = {
},
_allocate: function(actor, box, flags) {
if (!this._eventHandler)
return;
let primary = global.get_primary_monitor();
let [minWidth, minHeight, natWidth, natHeight] =
@ -415,6 +418,7 @@ Inspector.prototype = {
Clutter.ungrab_pointer(this._eventHandler);
Clutter.ungrab_keyboard(this._eventHandler);
this._eventHandler.destroy();
this._eventHandler = null;
this.emit('closed');
},
@ -663,7 +667,7 @@ LookingGlass.prototype = {
style_class: 'lg-dialog',
vertical: true,
visible: false });
this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent));
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._interfaceSettings.connect('changed::monospace-font-name',
@ -924,20 +928,15 @@ LookingGlass.prototype = {
if (this._open)
return;
if (!Main.pushModal(this.actor))
if (!Main.pushModal(this._entry))
return;
this._keyPressEventId = global.stage.connect('key-press-event',
Lang.bind(this, this._globalKeyPressEvent));
this.actor.show();
this.actor.lower(Main.chrome.actor);
this._open = true;
Tweener.removeTweens(this.actor);
global.stage.set_key_focus(this._entry);
// We inverse compensate for the slow-down so you can change the factor
// through LookingGlass without long waits.
Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
@ -950,9 +949,6 @@ LookingGlass.prototype = {
if (!this._open)
return;
if (this._keyPressEventId)
global.stage.disconnect(this._keyPressEventId);
this._objInspector.actor.hide();
this._historyNavIndex = -1;
@ -965,7 +961,7 @@ LookingGlass.prototype = {
this._borderPaintTarget = null;
}
Main.popModal(this.actor);
Main.popModal(this._entry);
Tweener.addTween(this.actor, { time: 0.5 / St.get_slow_down_factor(),
transition: 'easeOutQuad',

View File

@ -17,8 +17,12 @@ const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Chrome = imports.ui.chrome;
const CtrlAltTab = imports.ui.ctrlAltTab;
const EndSessionDialog = imports.ui.endSessionDialog;
const Environment = imports.ui.environment;
const ExtensionSystem = imports.ui.extensionSystem;
const MessageTray = imports.ui.messageTray;
@ -34,7 +38,9 @@ const ShellDBus = imports.ui.shellDBus;
const TelepathyClient = imports.ui.telepathyClient;
const WindowManager = imports.ui.windowManager;
const Magnifier = imports.ui.magnifier;
const XdndHandler = imports.ui.xdndHandler;
const StatusIconDispatcher = imports.ui.statusIconDispatcher;
const Util = imports.misc.util;
const DEFAULT_BACKGROUND_COLOR = new Clutter.Color();
DEFAULT_BACKGROUND_COLOR.from_pixel(0x2266bbff);
@ -50,12 +56,14 @@ let messageTray = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let telepathyClient = null;
let ctrlAltTabManager = null;
let recorder = null;
let shellDBusService = null;
let modalCount = 0;
let modalActorFocusStack = [];
let uiGroup = null;
let magnifier = null;
let xdndHandler = null;
let statusIconDispatcher = null;
let _errorLogStack = [];
let _startDate;
@ -103,10 +111,7 @@ function start() {
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';
let theme = new St.Theme ({ application_stylesheet: stylesheetPath });
themeContext.set_theme (theme);
loadTheme();
let shellwm = global.window_manager;
shellwm.takeover_keybinding('panel_main_menu');
@ -125,6 +130,7 @@ function start() {
global.stage.add_actor(uiGroup);
placesManager = new PlaceDisplay.PlacesManager();
xdndHandler = new XdndHandler.XdndHandler();
overview = new Overview.Overview();
chrome = new Chrome.Chrome();
magnifier = new Magnifier.Magnifier();
@ -137,6 +143,9 @@ function start() {
telepathyClient = new TelepathyClient.Client();
panel.startStatusArea();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
ctrlAltTabManager.addGroup(panel.actor, _("Panel"), 'gnome-panel');
_startDate = new Date();
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
@ -163,6 +172,10 @@ function start() {
}
});
// Provide the bus object for gnome-session to
// initiate logouts.
EndSessionDialog.init();
global.gdk_screen.connect('monitors-changed', _relayout);
ExtensionSystem.init();
@ -191,6 +204,18 @@ function start() {
}
}
/**
* loadTheme:
*
* Reloads the theme CSS file from the default theme.
*/
function loadTheme() {
let themeContext = St.ThemeContext.get_for_stage (global.stage);
let stylesheetPath = global.datadir + '/theme/gnome-shell.css';
let theme = new St.Theme ({ application_stylesheet: stylesheetPath });
themeContext.set_theme (theme);
}
/**
* _log:
* @category: string message type ('info', 'error')
@ -277,47 +302,42 @@ function _removeUnusedWorkspaces() {
// are disabled with a global grab. (When there is a global grab, then
// all key events will be delivered to the stage, so ::captured-event
// on the stage can be used for global keybindings.)
//
// We expect to need to conditionally enable just a few keybindings
// depending on circumstance; the main hackiness here is that we are
// assuming that keybindings have their default values; really we
// should be asking Mutter to resolve the key into an action and then
// base our handling based on the action.
function _globalKeyPressHandler(actor, event) {
if (modalCount == 0)
return false;
if (event.type() != Clutter.EventType.KEY_RELEASE)
if (event.type() != Clutter.EventType.KEY_PRESS)
return false;
let symbol = event.get_key_symbol();
let keyCode = event.get_key_code();
let modifierState = Shell.get_event_state(event);
// Check the overview key first, this isn't a Meta.KeyBindingAction yet
if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) {
// The super key is the default for triggering the overview, and should
// get us out of the overview when we are already in it.
if (overview.visible)
overview.hide();
return true;
}
// Whitelist some of the Metacity actions
let display = global.screen.get_display();
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
// This relies on the fact that Clutter.ModifierType is the same as Gdk.ModifierType
let action = display.get_keybinding_action(keyCode, modifierState);
switch (action) {
case Meta.KeyBindingAction.COMMAND_SCREENSHOT:
// The screenshot action should always be available (even if a
// modal dialog is present)
if (action == Meta.KeyBindingAction.COMMAND_SCREENSHOT) {
let gconf = GConf.Client.get_default();
let command = gconf.get_string('/apps/metacity/keybinding_commands/command_screenshot');
if (command != null && command != '') {
let [ok, len, args] = GLib.shell_parse_argv(command);
let p = new Shell.Process({'args' : args});
p.run();
}
if (command != null && command != '')
Util.spawnCommandLine(command);
return true;
}
// Other bindings are only available when the overview is up and
// no modal dialog is present.
if (!overview.visible || modalCount > 1)
return false;
// This isn't a Meta.KeyBindingAction yet
if (symbol == Clutter.Super_L || symbol == Clutter.Super_R) {
overview.hide();
return true;
}
switch (action) {
case Meta.KeyBindingAction.WORKSPACE_LEFT:
wm.actionMoveWorkspaceLeft();
return true;
@ -328,6 +348,12 @@ function _globalKeyPressHandler(actor, event) {
case Meta.KeyBindingAction.COMMAND_2:
getRunDialog().open();
return true;
case Meta.KeyBindingAction.PANEL_MAIN_MENU:
overview.hide();
return true;
case Meta.KeyBindingAction.SWITCH_PANELS:
ctrlAltTabManager.popup(modifierState & Clutter.ModifierType.SHIFT_MASK);
return true;
}
return false;
@ -346,21 +372,30 @@ function _findModal(actor) {
/**
* pushModal:
* @actor: #ClutterActor which will be given keyboard focus
* @timestamp: optional timestamp
*
* Ensure we are in a mode where all keyboard and mouse input goes to
* the stage. Multiple calls to this function act in a stacking fashion;
* the effect will be undone when an equal number of popModal() invocations
* have been made.
* the stage, and focus @actor. Multiple calls to this function act in
* a stacking fashion; the effect will be undone when an equal number
* of popModal() invocations have been made.
*
* Next, record the current Clutter keyboard focus on a stack. If the modal stack
* returns to this actor, reset the focus to the actor which was focused
* at the time pushModal() was invoked.
* Next, record the current Clutter keyboard focus on a stack. If the
* modal stack returns to this actor, reset the focus to the actor
* which was focused at the time pushModal() was invoked.
*
* @timestamp is optionally used to associate the call with a specific user
* initiated event. If not provided then the value of
* global.get_current_time() is assumed.
*
* Returns: true iff we successfully acquired a grab or already had one
*/
function pushModal(actor) {
function pushModal(actor, timestamp) {
if (timestamp == undefined)
timestamp = global.get_current_time();
if (modalCount == 0) {
if (!global.begin_modal(global.get_current_time())) {
if (!global.begin_modal(timestamp)) {
log('pushModal: invocation of begin_modal failed');
return false;
}
@ -384,19 +419,28 @@ function pushModal(actor) {
}
modalActorFocusStack.push([actor, curFocus]);
global.stage.set_key_focus(null);
global.stage.set_key_focus(actor);
return true;
}
/**
* popModal:
* @actor: #ClutterActor passed to original invocation of pushModal().
* @timestamp: optional timestamp
*
* Reverse the effect of pushModal(). If this invocation is undoing
* the topmost invocation, then the focus will be restored to the
* previous focus at the time when pushModal() was invoked.
*
* @timestamp is optionally used to associate the call with a specific user
* initiated event. If not provided then the value of
* global.get_current_time() is assumed.
*/
function popModal(actor) {
function popModal(actor, timestamp) {
if (timestamp == undefined)
timestamp = global.get_current_time();
modalCount -= 1;
let focusIndex = _findModal(actor);
if (focusIndex >= 0) {
@ -414,7 +458,8 @@ function popModal(actor) {
if (modalCount > 0)
return;
global.end_modal(global.get_current_time());
global.stage.set_key_focus(null);
global.end_modal(timestamp);
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
}

View File

@ -16,7 +16,10 @@ 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 Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const ANIMATION_TIME = 0.2;
const NOTIFICATION_TIMEOUT = 4;
@ -38,6 +41,17 @@ const State = {
HIDING: 3
};
// Message tray has its custom Urgency enumeration. LOW, NORMAL and CRITICAL
// urgency values map to the corresponding values for the notifications received
// through the notification daemon. HIGH urgency value is used for chats received
// through the Telepathy client.
const Urgency = {
LOW: 0,
NORMAL: 1,
HIGH: 2,
CRITICAL: 3
}
function _fixMarkup(text, allowMarkup) {
if (allowMarkup) {
// Support &amp;, &quot;, &apos;, &lt; and &gt;, escape all other
@ -92,8 +106,7 @@ URLHighlighter.prototype = {
return true;
} catch (e) {
// TODO: remove this after gnome 3 release
let p = new Shell.Process({ 'args' : ['gvfs-open', url] });
p.run();
Util.spawn(['gvfs-open', url]);
return true;
}
}
@ -124,13 +137,13 @@ URLHighlighter.prototype = {
this.actor.clutter_text.set_markup(text);
/* clutter_text.text contain text without markup */
this._urls = Utils.findUrls(this.actor.clutter_text.text);
this._urls = Util.findUrls(this.actor.clutter_text.text);
this._highlightUrls();
},
_highlightUrls: function() {
// text here contain markup
let urls = Utils.findUrls(this._text);
let urls = Util.findUrls(this._text);
let markup = '';
let pos = 0;
for (let i = 0; i < urls.length; i++) {
@ -225,7 +238,7 @@ function Notification(source, title, banner, params) {
Notification.prototype = {
_init: function(source, title, banner, params) {
this.source = source;
this.urgent = false;
this.urgency = Urgency.NORMAL;
this.resident = false;
// 'transient' is a reserved keyword in JS, so we have to use an alternate variable name
this.isTransient = false;
@ -245,7 +258,6 @@ Notification.prototype = {
this._prevFocusedWindow = null;
this._prevKeyFocusActor = null;
this._focusWindowChangedId = 0;
this._focusActorChangedId = 0;
this._stageInputModeChangedId = 0;
this._capturedEventId = 0;
@ -491,8 +503,8 @@ Notification.prototype = {
this._updated();
},
setUrgent: function(urgent) {
this.urgent = urgent;
setUrgency: function(urgency) {
this.urgency = urgency;
},
setResident: function(resident) {
@ -624,29 +636,16 @@ Notification.prototype = {
let metaDisplay = global.screen.get_display();
this._prevFocusedWindow = metaDisplay.focus_window;
this._prevKeyFocus = global.stage.get_key_focus();
this._prevKeyFocusActor = global.stage.get_key_focus();
// We need to use the captured event in the overview, because we don't want to change the stage input mode to
// FOCUSED there. On the other hand, using the captured event doesn't work correctly in the main view because
// it doesn't allow focusing the windows again correctly. So we are using the FOCUSED stage input mode in the
// main view.
if (Main.overview.visible) {
if (!Main.pushModal(this.actor))
return;
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
} else {
if (!Main.overview.visible)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
this._focusWindowChangedId = metaDisplay.connect('notify::focus-window', Lang.bind(this, this._focusWindowChanged));
// Use captured-event to notice clicks outside the notification
// without consuming them.
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
this._stageInputModeChangedId = global.connect('notify::stage-input-mode', Lang.bind(this, this._stageInputModeChanged));
this._keyPressId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPress));
}
// We need to listen to this signal in the overview, as well as in the main view, to make the key bindings such as
// Alt+F2 work. When a notification has key focus, which is the case with chat notifications, all captured KEY_PRESS
// events have the actor with the key focus as their source. This makes it impossible to distinguish between the chat
// window input and the key bindings based solely on the KEY_PRESS event.
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
this._hasFocus = true;
@ -654,19 +653,6 @@ Notification.prototype = {
Main.messageTray.lock();
},
_focusWindowChanged: function() {
let metaDisplay = global.screen.get_display();
// this._focusWindowChanged() will be called when we call
// global.set_stage_input_mode(Shell.StageInputMode.FOCUSED) ,
// however metaDisplay.focus_window will be null in that case. We only
// want to ungrab focus if the focus has been moved to an application
// window.
if (metaDisplay.focus_window) {
this._prevFocusedWindow = null;
this.ungrabFocus();
}
},
_focusActorChanged: function() {
let focusedActor = global.stage.get_key_focus();
if (!focusedActor || !this.actor.contains(focusedActor)) {
@ -676,15 +662,6 @@ Notification.prototype = {
},
_stageInputModeChanged: function() {
let focusedActor = global.stage.get_key_focus();
// TODO: We need to set this._prevFocusedWindow to null in order to
// get the cursor in the run dialog. However, that also means it's
// set to null when the application menu is activated, which defeats
// the point of keeping the name of the previously focused application
// in the panel. It'd be good to be able to distinguish between these
// two cases.
this._prevFocusedWindow = null;
this._prevKeyFocusActor = null;
this.ungrabFocus();
},
@ -729,24 +706,11 @@ Notification.prototype = {
this.destroy();
},
_onKeyPress: function(actor, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.Escape) {
Main.messageTray.escapeTray();
return true;
}
return false;
},
ungrabFocus: function() {
if (!this._hasFocus)
return;
let metaDisplay = global.screen.get_display();
if (this._focusWindowChangedId > 0) {
metaDisplay.disconnect(this._focusWindowChangedId);
this._focusWindowChangedId = 0;
}
if (this._focusActorChangedId > 0) {
global.stage.disconnect(this._focusActorChangedId);
@ -759,20 +723,14 @@ Notification.prototype = {
}
if (this._capturedEventId > 0) {
Main.popModal(this.actor);
global.stage.disconnect(this._capturedEventId);
this._capturedEventId = 0;
}
if (this._keyPressId > 0) {
global.stage.disconnect(this._keyPressId);
this._keyPressId = 0;
}
this._hasFocus = false;
Main.messageTray.unlock();
if (this._prevFocusedWindow) {
if (this._prevFocusedWindow && !metaDisplay.focus_window) {
metaDisplay.set_input_focus_window(this._prevFocusedWindow, false, global.get_current_time());
this._prevFocusedWindow = null;
}
@ -951,7 +909,7 @@ MessageTray.prototype = {
this._notification = null;
this._notificationClickedId = 0;
this._summaryBin = new St.Bin({ anchor_gravity: Clutter.Gravity.NORTH_EAST });
this._summaryBin = new St.Bin({ x_align: St.Align.END });
this.actor.add_actor(this._summaryBin);
this._summary = new St.BoxLayout({ name: 'summary-mode',
reactive: true,
@ -1043,9 +1001,8 @@ MessageTray.prototype = {
this.actor.width = primary.width;
this._notificationBin.x = 0;
this._notificationBin.width = primary.width;
// These work because of their anchor_gravity
this._summaryBin.x = primary.width;
this._summaryBin.x = 0;
this._summaryBin.width = primary.width;
},
contains: function(source) {
@ -1212,13 +1169,11 @@ MessageTray.prototype = {
} else if (this._notificationQueue.indexOf(notification) < 0) {
notification.connect('destroy',
Lang.bind(this, this.removeNotification));
if (notification.urgent)
this._notificationQueue.unshift(notification);
else
this._notificationQueue.push(notification);
this._notificationQueue.sort(function(notification1, notification2) {
return (notification2.urgency - notification1.urgency);
});
}
this._updateState();
},
@ -1417,7 +1372,7 @@ MessageTray.prototype = {
let notificationsPending = this._notificationQueue.length > 0;
let notificationPinned = this._pointerInTray && !this._pointerInSummary && !this._notificationRemoved;
let notificationExpanded = this._notificationBin.y < 0;
let notificationExpired = (this._notificationTimeoutId == 0 && !this._pointerInTray && !this._locked) || this._notificationRemoved;
let notificationExpired = (this._notificationTimeoutId == 0 && !(this._notification && this._notification.urgency == Urgency.CRITICAL) && !this._pointerInTray && !this._locked) || this._notificationRemoved;
if (this._notificationState == State.HIDDEN) {
if (notificationsPending)
@ -1545,26 +1500,44 @@ MessageTray.prototype = {
_updateShowingNotification: function() {
Tweener.removeTweens(this._notificationBin);
this._tween(this._notificationBin, '_notificationState', State.SHOWN,
{ y: 0,
opacity: 255,
// We auto-expand notifications with CRITICAL urgency.
// We use Tweener.removeTweens() to remove a tween that was hiding the notification we are
// updating, in case that notification was in the process of being hidden. However,
// Tweener.removeTweens() would also remove a tween that was updating the position of the
// notification we are updating, in case that notification was already expanded and its height
// changed. Therefore we need to call this._expandNotification() for expanded notifications
// to make sure their position is updated.
if (this._notification.urgency == Urgency.CRITICAL || this._notification.expanded)
this._expandNotification(true);
// We tween all notifications to full opacity. This ensures that both new notifications and
// notifications that might have been in the process of hiding get full opacity.
//
// We tween any notification showing in the banner mode to banner height (this._notificationBin.y = 0).
// This ensures that both new notifications and notifications in the banner mode that might
// have been in the process of hiding are shown with the banner height.
//
// We use this._showNotificationCompleted() onComplete callback to extend the time the updated
// notification is being shown.
//
// We don't set the y parameter for the tween for expanded notifications because
// this._expandNotification() will result in getting this._notificationBin.y set to the appropriate
// fully expanded value.
let tweenParams = { opacity: 255,
time: ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: this._showNotificationCompleted,
onCompleteScope: this
});
};
if (!this._notification.expanded)
tweenParams.y = 0;
// We auto-expand urgent notifications.
// We call _expandNotification() again on the notifications that
// are expanded in case they were in the process of hiding and need
// to re-expand.
if (this._notification.urgent || this._notification.expanded)
// This will overwrite the y tween, but leave the opacity
// tween, and so the onComplete will remain as well.
this._expandNotification(true);
this._tween(this._notificationBin, '_notificationState', State.SHOWN, tweenParams);
},
_showNotificationCompleted: function() {
if (this._notification.urgency != Urgency.CRITICAL)
this._updateNotificationTimeout(NOTIFICATION_TIMEOUT * 1000);
},
@ -1650,7 +1623,7 @@ MessageTray.prototype = {
},
// We use this function to grab focus when the user moves the pointer
// to an urgent notification that was already auto-expanded.
// to a notification with CRITICAL urgency that was already auto-expanded.
_ensureNotificationFocused: function() {
this._notification.grabFocus(false);
},
@ -1722,7 +1695,7 @@ MessageTray.prototype = {
this._adjustNotificationBoxPointerPosition();
this._summaryNotificationState = State.SHOWING;
this._summaryNotificationBoxPointer.animateAppear(Lang.bind(this, function() {
this._summaryNotificationBoxPointer.show(true, Lang.bind(this, function() {
this._summaryNotificationState = State.SHOWN;
}));
},
@ -1761,7 +1734,7 @@ MessageTray.prototype = {
this._summaryNotification.ungrabFocus();
this._summaryNotificationState = State.HIDING;
this._summaryNotificationBoxPointer.animateDisappear(Lang.bind(this, this._hideSummaryNotificationCompleted));
this._summaryNotificationBoxPointer.hide(true, Lang.bind(this, this._hideSummaryNotificationCompleted));
},
_hideSummaryNotificationCompleted: function() {
@ -1780,3 +1753,27 @@ MessageTray.prototype = {
}
}
};
function SystemNotificationSource() {
this._init();
}
SystemNotificationSource.prototype = {
__proto__: Source.prototype,
_init: function() {
Source.prototype._init.call(this, _("System Information"));
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'dialog-information',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
_notificationClicked: function() {
this.destroy();
}
};

233
js/ui/modalDialog.js Normal file
View File

@ -0,0 +1,233 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Params = imports.misc.params;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const OPEN_AND_CLOSE_TIME = 0.1;
const FADE_OUT_DIALOG_TIME = 1.0;
const State = {
OPENED: 0,
CLOSED: 1,
OPENING: 2,
CLOSING: 3,
FADED_OUT: 4
};
function ModalDialog() {
this._init();
}
ModalDialog.prototype = {
_init: function(params) {
params = Params.parse(params, { styleClass: null });
this.state = State.CLOSED;
this._group = new St.Group({ visible: false,
x: 0,
y: 0 });
Main.uiGroup.add_actor(this._group);
global.focus_manager.add_group(this._group);
this._initialKeyFocus = this._group;
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
this._actionKeys = {};
this._group.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true });
this._backgroundBin = new St.Bin();
this._group.add_actor(this._backgroundBin);
this._lightbox.highlight(this._backgroundBin);
this._dialogLayout = new St.BoxLayout({ style_class: 'modal-dialog',
vertical: true });
if (params.styleClass != null) {
this._dialogLayout.add_style_class_name(params.styleClass);
}
this._backgroundBin.child = this._dialogLayout;
this.contentLayout = new St.BoxLayout({ vertical: true });
this._dialogLayout.add(this.contentLayout,
{ x_fill: true,
y_fill: true,
x_align: St.Align.MIDDLE,
y_align: St.Align.START });
this._buttonLayout = new St.BoxLayout({ opacity: 220,
vertical: false });
this._dialogLayout.add(this._buttonLayout,
{ expand: true,
x_align: St.Align.MIDDLE,
y_align: St.Align.END });
},
setButtons: function(buttons) {
this._buttonLayout.remove_all();
let i = 0;
for (let index in buttons) {
let buttonInfo = buttons[index];
let label = buttonInfo['label'];
let action = buttonInfo['action'];
let key = buttonInfo['key'];
let button = new St.Button({ style_class: 'modal-dialog-button',
reactive: true,
can_focus: true,
label: label });
let x_alignment;
if (buttons.length == 1)
x_alignment = St.Align.END;
else if (i == 0)
x_alignment = St.Align.START;
else if (i == buttons.length - 1)
x_alignment = St.Align.END;
else
x_alignment = St.Align.MIDDLE;
this._initialKeyFocus = button;
this._buttonLayout.add(button,
{ expand: true,
x_fill: false,
y_fill: false,
x_align: x_alignment,
y_align: St.Align.MIDDLE });
button.connect('clicked', action);
if (key)
this._actionKeys[key] = action;
i++;
}
},
_onKeyPressEvent: function(object, keyPressEvent) {
let symbol = keyPressEvent.get_key_symbol();
let action = this._actionKeys[symbol];
if (action)
action();
},
_onGroupDestroy: function() {
this.emit('destroy');
},
_fadeOpen: function() {
let monitor = global.get_focus_monitor();
this._backgroundBin.set_position(monitor.x, monitor.y);
this._backgroundBin.set_size(monitor.width, monitor.height);
this.state = State.OPENING;
this._dialogLayout.opacity = 255;
this._lightbox.show();
this._group.opacity = 0;
this._group.show();
Tweener.addTween(this._group,
{ opacity: 255,
time: OPEN_AND_CLOSE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this._initialKeyFocus.grab_key_focus();
this.state = State.OPENED;
this.emit('opened');
}),
});
},
open: function(timestamp) {
if (this.state == State.OPENED || this.state == State.OPENING)
return true;
if (!Main.pushModal(this._group, timestamp))
return false;
global.stage.set_key_focus(this._group);
this._fadeOpen();
return true;
},
close: function(timestamp) {
if (this.state == State.CLOSED || this.state == State.CLOSING)
return;
let needsPopModal;
if (this.state == State.OPENED || this.state == State.OPENING)
needsPopModal = true;
else
needsPopModal = false;
this.state = State.CLOSING;
Tweener.addTween(this._group,
{ opacity: 0,
time: OPEN_AND_CLOSE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.state = State.CLOSED;
this._group.hide();
if (needsPopModal)
Main.popModal(this._group, timestamp);
})
});
},
// This method is like close, but fades the dialog out much slower,
// and leaves the lightbox in place. Once in the faded out state,
// the dialog can be brought back by an open call, or the lightbox
// can be dismissed by a close call.
//
// The main point of this method is to give some indication to the user
// that the dialog reponse has been acknowledged but will take a few
// moments before being processed.
// e.g., if a user clicked "Log Out" then the dialog should go away
// imediately, but the lightbox should remain until the logout is
// complete.
_fadeOutDialog: function(timestamp) {
if (this.state == State.CLOSED || this.state == State.CLOSING)
return;
if (this.state == State.FADED_OUT)
return;
Tweener.addTween(this._dialogLayout,
{ opacity: 0,
time: FADE_OUT_DIALOG_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this.state = State.FADED_OUT;
Main.popModal(this._group, timestamp);
})
});
}
};
Signals.addSignalMethods(ModalDialog.prototype);

View File

@ -9,9 +9,11 @@ const St = imports.gi.St;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Config = imports.misc.config;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const Params = imports.misc.params;
const Util = imports.misc.util;
let nextNotificationId = 1;
@ -126,17 +128,8 @@ NotificationDaemon.prototype = {
log('Failed to acquire org.freedesktop.Notifications');
else {
log('Failed to acquire org.freedesktop.Notifications; trying again');
// kill the notification-daemon. pkill is more portable
// than killall, but on Linux at least it won't match if
// you pass more than 15 characters of the process name...
// However, if you use the '-f' flag to match the entire
// command line, it will work, but we have to be careful
// in that case that we don't match 'gedit
// notification-daemon.c' or whatever...
let p = new Shell.Process({ args: ['pkill', '-f',
'^([^ ]*/)?(notification-daemon|notify-osd)$']});
p.run();
Util.killall('notification-daemon');
Util.killall('notify-osd');
}
},
@ -343,8 +336,17 @@ NotificationDaemon.prototype = {
for (let i = 0; i < actions.length - 1; i += 2)
notification.addButton(actions[i], actions[i + 1]);
}
notification.setUrgent(hints.urgency == Urgency.CRITICAL);
switch (hints.urgency) {
case Urgency.LOW:
notification.setUrgency(MessageTray.Urgency.LOW);
break;
case Urgency.NORMAL:
notification.setUrgency(MessageTray.Urgency.NORMAL);
break;
case Urgency.CRITICAL:
notification.setUrgency(MessageTray.Urgency.CRITICAL);
break;
}
notification.setResident(hints.resident == true);
// 'transient' is a reserved keyword in JS, so we have to retrieve the value
// of the 'transient' hint with hints['transient'] rather than hints.transient
@ -381,10 +383,10 @@ NotificationDaemon.prototype = {
GetServerInformation: function() {
return [
'GNOME Shell',
Config.PACKAGE_NAME,
'GNOME',
'0.1', // FIXME, get this from somewhere
'1.0'
Config.PACKAGE_VERSION,
'1.2'
];
},
@ -467,8 +469,8 @@ Source.prototype = {
return;
// Only override the icon if we were previously using
// notification-based icons (ie, not a trayicon)
if (this.useNotificationIcon) {
// notification-based icons (ie, not a trayicon) or if it was unset before
if (!this._isTrayIcon) {
this.useNotificationIcon = false;
this._setSummaryIcon(this.app.create_icon_texture (this.ICON_SIZE));
}

View File

@ -6,13 +6,15 @@ const Mainloop = imports.mainloop;
const Signals = imports.signals;
const Lang = imports.lang;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Gdk = imports.gi.Gdk;
const AppDisplay = imports.ui.appDisplay;
const Dash = imports.ui.dash;
const DND = imports.ui.dnd;
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;
@ -28,30 +30,7 @@ const ANIMATION_TIME = 0.25;
// We split the screen vertically between the dash and the view selector.
const DASH_SPLIT_FRACTION = 0.1;
function Source() {
this._init();
}
Source.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function() {
MessageTray.Source.prototype._init.call(this,
"System Information");
this._setSummaryIcon(this.createNotificationIcon());
},
createNotificationIcon: function() {
return new St.Icon({ icon_name: 'dialog-information',
icon_type: St.IconType.SYMBOLIC,
icon_size: this.ICON_SIZE });
},
_notificationClicked: function() {
this.destroy();
}
}
const DND_WINDOW_SWITCH_TIMEOUT = 1250;
function ShellInfo() {
this._init();
@ -74,7 +53,7 @@ ShellInfo.prototype = {
setMessage: function(text, undoCallback, undoLabel) {
if (this._source == null) {
this._source = new Source();
this._source = new MessageTray.SystemNotificationSource();
this._source.connect('destroy', Lang.bind(this,
function() {
this._source = null;
@ -135,7 +114,10 @@ Overview.prototype = {
this._workspacesDisplay = null;
this.visible = false;
this.visible = false; // animating to overview, in overview, animating out
this._shown = false; // show() and not hide()
this._shownTemporarily = false; // showTemporarily() and not hideTemporarily()
this._modal = false; // have a modal grab
this.animationInProgress = false;
this._hideInProgress = false;
@ -174,9 +156,72 @@ Overview.prototype = {
this._coverPane.lower_bottom();
// XDND
this._dragMonitor = {
dragMotion: Lang.bind(this, this._onDragMotion)
};
Main.xdndHandler.connect('drag-begin', Lang.bind(this, this._onDragBegin));
Main.xdndHandler.connect('drag-end', Lang.bind(this, this._onDragEnd));
this._windowSwitchTimeoutId = 0;
this._windowSwitchTimestamp = 0;
this._lastActiveWorkspaceIndex = -1;
this._needsFakePointerEvent = false;
this.workspaces = null;
},
_onDragBegin: function() {
DND.addDragMonitor(this._dragMonitor);
// Remember the workspace we started from
this._lastActiveWorkspaceIndex = global.screen.get_active_workspace_index();
},
_onDragEnd: function(time) {
// In case the drag was canceled while in the overview
// we have to go back to where we started and hide
// the overview
if (this._shownTemporarily) {
global.screen.get_workspace_by_index(this._lastActiveWorkspaceIndex).activate(time);
this.hideTemporarily();
}
DND.removeMonitor(this._dragMonitor);
},
_fakePointerEvent: function() {
let display = Gdk.Display.get_default();
let deviceManager = display.get_device_manager();
let pointer = deviceManager.get_client_pointer();
let [screen, pointerX, pointerY] = pointer.get_position();
pointer.warp(screen, pointerX, pointerY);
},
_onDragMotion: function(dragEvent) {
if (this._windowSwitchTimeoutId != 0) {
Mainloop.source_remove(this._windowSwitchTimeoutId);
this._windowSwitchTimeoutId = 0;
this._needsFakePointerEvent = false;
}
if (dragEvent.targetActor &&
dragEvent.targetActor._delegate &&
dragEvent.targetActor._delegate.metaWindow) {
this._windowSwitchTimestamp = global.get_current_time();
this._windowSwitchTimeoutId = Mainloop.timeout_add(DND_WINDOW_SWITCH_TIMEOUT,
Lang.bind(this, function() {
this._needsFakePointerEvent = true;
Main.activateWindow(dragEvent.targetActor._delegate.metaWindow,
this._windowSwitchTimestamp);
this.hideTemporarily();
}));
}
return DND.DragMotionResult.CONTINUE;
},
_getDesktopClone: function() {
let windows = global.get_window_actors().filter(function(w) {
return w.meta_window.get_window_type() == Meta.WindowType.DESKTOP;
@ -267,11 +312,23 @@ Overview.prototype = {
return [this.workspaces.actor.x, this.workspaces.actor.y];
},
// show:
//
// Animates the overview visible and grabs mouse and keyboard input
show : function() {
if (this.visible)
if (this._shown)
return;
// Do this manually instead of using _syncInputMode, to handle failure
if (!Main.pushModal(this.viewSelector.actor))
return;
this._modal = true;
this._animateVisible();
this._shown = true;
},
_animateVisible: function() {
if (this.visible || this.animationInProgress)
return;
this.visible = true;
this.animationInProgress = true;
@ -337,8 +394,102 @@ Overview.prototype = {
this.emit('showing');
},
// showTemporarily:
//
// Animates the overview visible without grabbing mouse and keyboard input;
// if show() has already been called, this has no immediate effect, but
// will result in the overview not being hidden until hideTemporarily() is
// called.
showTemporarily: function() {
if (this._shownTemporarily)
return;
this._syncInputMode();
this._animateVisible();
this._shownTemporarily = true;
},
// hide:
//
// Reverses the effect of show()
hide: function() {
if (!this.visible || this._hideInProgress)
if (!this._shown)
return;
if (!this._shownTemporarily)
this._animateNotVisible();
this._shown = false;
this._syncInputMode();
},
// hideTemporarily:
//
// Reverses the effect of showTemporarily()
hideTemporarily: function() {
if (!this._shownTemporarily)
return;
if (!this._shown)
this._animateNotVisible();
this._shownTemporarily = false;
this._syncInputMode();
},
toggle: function() {
if (this._shown)
this.hide();
else
this.show();
},
/**
* getWorkspacesForWindow:
* @metaWindow: A #MetaWindow
*
* Returns the Workspaces object associated with the given window.
* This method is not be accessible if the overview is not open
* and will return %null.
*/
getWorkspacesForWindow: function(metaWindow) {
return this.workspaces;
},
//// Private methods ////
_syncInputMode: function() {
// We delay input mode changes during animation so that when removing the
// overview we don't have a problem with the release of a press/release
// going to an application.
if (this.animationInProgress)
return;
if (this._shown) {
if (!this._modal) {
if (Main.pushModal(this._dash.actor))
this._modal = true;
else
this.hide();
}
} else if (this._shownTemporarily) {
if (this._modal) {
Main.popModal(this._dash.actor);
this._modal = false;
}
global.stage_input_mode = Shell.StageInputMode.FULLSCREEN;
} else {
if (this._modal) {
Main.popModal(this._dash.actor);
this._modal = false;
}
else if (global.stage_input_mode == Shell.StageInputMode.FULLSCREEN)
global.stage_input_mode = Shell.StageInputMode.NORMAL;
}
},
_animateNotVisible: function() {
if (!this.visible || this.animationInProgress)
return;
this.animationInProgress = true;
@ -382,36 +533,17 @@ Overview.prototype = {
this.emit('hiding');
},
toggle: function() {
if (this.visible)
this.hide();
else
this.show();
},
/**
* getWorkspacesForWindow:
* @metaWindow: A #MetaWindow
*
* Returns the Workspaces object associated with the given window.
* This method is not be accessible if the overview is not open
* and will return %null.
*/
getWorkspacesForWindow: function(metaWindow) {
return this.workspaces;
},
//// Private methods ////
_showDone: function() {
if (this._hideInProgress)
return;
this.animationInProgress = false;
this._desktopFade.hide();
this._coverPane.lower_bottom();
this.emit('shown');
// Handle any calls to hide* while we were showing
if (!this._shown && !this._shownTemporarily)
this._animateNotVisible();
this._syncInputMode();
},
_hideDone: function() {
@ -434,8 +566,18 @@ Overview.prototype = {
this._coverPane.lower_bottom();
Main.popModal(this.viewSelector.actor);
this.emit('hidden');
// Handle any calls to show* while we were hiding
if (this._shown || this._shownTemporarily)
this._animateVisible();
this._syncInputMode();
// Fake a pointer event if requested
if (this._needsFakePointerEvent) {
this._fakePointerEvent();
this._needsFakePointerEvent = false;
}
}
};
Signals.addSignalMethods(Overview.prototype);

View File

@ -27,6 +27,8 @@ const PANEL_ICON_SIZE = 24;
const HOT_CORNER_ACTIVATION_TIMEOUT = 0.5;
const BUTTON_DND_ACTIVATION_TIMEOUT = 250;
const ANIMATED_ICON_UPDATE_TIMEOUT = 100;
const SPINNER_UPDATE_TIMEOUT = 130;
const SPINNER_SPEED = 0.02;
@ -35,14 +37,17 @@ 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
'battery': imports.ui.status.power.Indicator,
'keyboard': imports.ui.status.keyboard.XKBIndicator
};
if (Config.HAVE_BLUETOOTH)
STANDARD_TRAY_ICON_SHELL_IMPLEMENTATION['bluetooth'] = imports.ui.status.bluetooth.Indicator;
const CLOCK_FORMAT_KEY = 'format';
const CLOCK_CUSTOM_FORMAT_KEY = 'custom-format';
// in org.gnome.desktop.interface
const CLOCK_FORMAT_KEY = 'clock-format';
// in org.gnome.shell.clock
const CLOCK_SHOW_DATE_KEY = 'show-date';
const CLOCK_SHOW_SECONDS_KEY = 'show-seconds';
@ -493,69 +498,53 @@ function ClockButton() {
}
ClockButton.prototype = {
__proto__: PanelMenu.Button.prototype,
_init: function() {
PanelMenu.Button.prototype._init.call(this, St.Align.START);
this.menu.addAction(_("Preferences"), Lang.bind(this, this._onPrefs));
this.actor = new St.Bin({ style_class: 'panel-button',
reactive: true,
can_focus: true,
x_fill: true,
y_fill: false,
track_hover: true });
this.actor._delegate = this;
this.actor.connect('button-press-event',
Lang.bind(this, this._toggleCalendar));
this._clock = new St.Label();
this.actor.set_child(this._clock);
this._calendarPopup = null;
this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._clockSettings = new Gio.Settings({ schema: 'org.gnome.shell.clock' });
this._desktopSettings.connect('changed', Lang.bind(this, this._updateClock));
this._clockSettings.connect('changed', Lang.bind(this, this._updateClock));
// Start the clock
this._updateClock();
},
_onButtonPress: function(actor, event) {
let button = event.get_button();
if (button == 3 &&
(!this._calendarPopup || !this._calendarPopup.isOpen))
this.menu.toggle();
else
this._toggleCalendar();
},
closeCalendar: function() {
if (!this._calendarPopup || !this._calendarPopup.isOpen)
return;
this._calendarPopup.hide();
this.menu.isOpen = false;
this.actor.remove_style_pseudo_class('pressed');
},
openCalendar: function() {
this._calendarPopup.show();
// simulate an open menu, so it won't appear beneath the calendar
this.menu.isOpen = true;
this.actor.add_style_pseudo_class('pressed');
},
_onPrefs: function() {
let args = ['gnome-shell-clock-preferences'];
let p = new Shell.Process({ args: args });
p.run();
},
_toggleCalendar: function() {
if (this._calendarPopup == null) {
this._calendarPopup = new CalendarPopup();
this._calendarPopup.actor.hide();
}
if (this.menu.isOpen && !this._calendarPopup.isOpen) {
this.menu.close();
return;
}
if (!this._calendarPopup.isOpen)
this.openCalendar();
else
@ -563,23 +552,13 @@ ClockButton.prototype = {
},
_updateClock: function() {
let format = this._clockSettings.get_string(CLOCK_FORMAT_KEY);
let format = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let showDate = this._clockSettings.get_boolean(CLOCK_SHOW_DATE_KEY);
let showSeconds = this._clockSettings.get_boolean(CLOCK_SHOW_SECONDS_KEY);
let clockFormat;
switch (format) {
case 'unix':
// force updates every second
showSeconds = true;
clockFormat = '%s';
break;
case 'custom':
// force updates every second
showSeconds = true;
clockFormat = this._clockSettings.get_string(CLOCK_CUSTOM_FORMAT_KEY);
break;
case '24-hour':
case '24h':
if (showDate)
/* Translators: This is the time format with date used
in 24-hour mode. */
@ -591,7 +570,7 @@ ClockButton.prototype = {
clockFormat = showSeconds ? _("%a %R:%S")
: _("%a %R");
break;
case '12-hour':
case '12h':
default:
if (showDate)
/* Translators: This is a time format with date used
@ -753,7 +732,20 @@ Panel.prototype = {
reactive: true,
can_focus: true });
this.button.set_child(label);
this.button._delegate = this.button;
this.button._xdndTimeOut = 0;
this.button.handleDragOver = Lang.bind(this,
function(source, actor, x, y, time) {
if (source == Main.xdndHandler) {
if (this.button._xdndTimeOut != 0)
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
Lang.bind(this,
function() {
this._xdndShowOverview(actor);
}));
}
});
this._leftBox.add(this.button);
// We use this flag to mark the case where the user has entered the
@ -791,6 +783,18 @@ Panel.prototype = {
this._hotCorner.connect('leave-event',
Lang.bind(this, this._onHotCornerLeft));
this._hotCorner._delegate = this._hotCorner;
this._hotCorner.handleDragOver = Lang.bind(this,
function(source, actor, x, y, time) {
if (source == Main.xdndHandler) {
if(!Main.overview.visible && !Main.overview.animationInProgress) {
this.rippleAnimation();
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
}
});
this._boxContainer.add_actor(this._hotCornerEnvirons);
this._boxContainer.add_actor(this._hotCorner);
@ -846,6 +850,25 @@ Panel.prototype = {
Main.chrome.addActor(this.actor, { visibleInOverview: true });
},
_xdndShowOverview: function (actor) {
let [x, y, mask] = global.get_pointer();
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, x, y);
if (pickedActor != this.button) {
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = 0;
return;
}
if(!Main.overview.visible && !Main.overview.animationInProgress) {
Main.overview.showTemporarily();
Main.overview.beginItemDrag(actor);
}
Mainloop.source_remove(this.button._xdndTimeOut);
this.button._xdndTimeOut = 0;
},
startStatusArea: function() {
for (let i = 0; i < STANDARD_TRAY_ICON_ORDER.length; i++) {
let role = STANDARD_TRAY_ICON_ORDER[i];
@ -936,14 +959,7 @@ Panel.prototype = {
Main.uiGroup.add_actor(ripple);
},
_onHotCornerEntered : function() {
if (this._menus.grabbed)
return false;
if (!this._hotCornerEntered) {
this._hotCornerEntered = true;
if (!Main.overview.animationInProgress) {
this._hotCornerActivationTime = Date.now() / 1000;
rippleAnimation: function() {
// Show three concentric ripples expanding outwards; the exact
// parameters were found by trial and error, so don't look
// for them to make perfect sense mathematically
@ -952,6 +968,17 @@ Panel.prototype = {
this._addRipple(0.0, 0.83, 0.25, 1.0, 1.5, 0.0);
this._addRipple(0.05, 1.0, 0.0, 0.7, 1.25, 0.0);
this._addRipple(0.35, 1.0, 0.0, 0.3, 1, 0.0);
},
_onHotCornerEntered : function() {
if (this._menus.grabbed)
return false;
if (!this._hotCornerEntered) {
this._hotCornerEntered = true;
if (!Main.overview.animationInProgress) {
this._hotCornerActivationTime = Date.now() / 1000;
this.rippleAnimation();
Main.overview.toggle();
}
}
@ -998,6 +1025,9 @@ function CalendarPopup() {
CalendarPopup.prototype = {
_init: function() {
let panelActor = Main.panel.actor;
let alignConstraint = new Clutter.AlignConstraint({ source: panelActor,
align_axis: Clutter.AlignAxis.X_AXIS,
factor: 0.5 });
this.actor = new St.Bin({ name: 'calendarPopup' });
@ -1009,7 +1039,7 @@ CalendarPopup.prototype = {
Main.chrome.addActor(this.actor, { visibleInOverview: true,
affectsStruts: false });
this.actor.y = (panelActor.y + panelActor.height - this.actor.height);
this.calendar.actor.connect('notify::width', Lang.bind(this, this._centerPopup));
this.actor.add_constraint(alignConstraint);
},
show: function() {
@ -1022,7 +1052,6 @@ CalendarPopup.prototype = {
// Reset the calendar to today's date
this.calendar.setDate(new Date());
this._centerPopup();
this.actor.lower(panelActor);
this.actor.show();
Tweener.addTween(this.actor,
@ -1046,10 +1075,5 @@ CalendarPopup.prototype = {
onComplete: function() { this.actor.hide(); },
onCompleteScope: this
});
},
_centerPopup: function() {
let panelActor = Main.panel.actor;
this.actor.x = Math.round(panelActor.x + (panelActor.width - this.actor.width) / 2);
}
};

View File

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

View File

@ -1,6 +1,5 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const GConf = imports.gi.GConf;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Shell = imports.gi.Shell;
@ -14,11 +13,7 @@ const _ = Gettext.gettext;
const DND = imports.ui.dnd;
const Main = imports.ui.main;
const Search = imports.ui.search;
const NAUTILUS_PREFS_DIR = '/apps/nautilus/preferences';
const DESKTOP_IS_HOME_KEY = NAUTILUS_PREFS_DIR + '/desktop_is_home_dir';
const PLACES_ICON_SIZE = 16;
const Util = imports.misc.util;
/**
* Represents a place object, which is most normally a bookmark entry,
@ -123,13 +118,9 @@ function PlacesManager() {
PlacesManager.prototype = {
_init: function() {
let gconf = GConf.Client.get_default();
gconf.add_dir(NAUTILUS_PREFS_DIR, GConf.ClientPreloadType.PRELOAD_NONE);
this._defaultPlaces = [];
this._mounts = [];
this._bookmarks = [];
this._isDesktopHome = gconf.get_bool(DESKTOP_IS_HOME_KEY);
let homeFile = Gio.file_new_for_path (GLib.get_home_dir());
let homeUri = homeFile.get_uri();
@ -163,7 +154,7 @@ PlacesManager.prototype = {
icon_size: size });
},
function () {
new Shell.Process({ args: ['nautilus-connect-server'] }).run();
Util.spawn(['nautilus-connect-server']);
});
let networkApp = null;
@ -188,9 +179,6 @@ PlacesManager.prototype = {
}
this._defaultPlaces.push(this._home);
this._desktopMenuIndex = this._defaultPlaces.length;
if (!this._isDesktopHome)
this._defaultPlaces.push(this._desktopMenu);
if (this._network)
@ -229,9 +217,6 @@ PlacesManager.prototype = {
}));
this._reloadBookmarks();
gconf.notify_add(DESKTOP_IS_HOME_KEY, Lang.bind(this, this._updateDesktopMenuVisibility));
},
_updateDevices: function() {
@ -340,21 +325,6 @@ PlacesManager.prototype = {
this.emit('places-updated');
},
_updateDesktopMenuVisibility: function() {
let gconf = GConf.Client.get_default();
this._isDesktopHome = gconf.get_boolean(DESKTOP_IS_HOME_KEY);
if (this._isDesktopHome)
this._removeById(this._defaultPlaces, 'special:desktop');
else
this._defaultPlaces.splice(this._desktopMenuIndex, 0,
this._desktopMenu);
/* See comment in _updateDevices for explanation why there are two signals. */
this.emit('defaults-updated');
this.emit('places-updated');
},
_addMount: function(mount) {
let devItem = new PlaceDeviceInfo(mount);
this._mounts.push(devItem);
@ -402,150 +372,8 @@ PlacesManager.prototype = {
sourceArray.splice(this._lookupIndexById(sourceArray, id), 1);
}
};
Signals.addSignalMethods(PlacesManager.prototype);
/**
* An entry in the places menu.
* @info The corresponding PlaceInfo to populate this entry.
*/
function DashPlaceDisplayItem(info) {
this._init(info);
}
DashPlaceDisplayItem.prototype = {
_init: function(info) {
this.name = info.name;
this._info = info;
this._icon = info.iconFactory(PLACES_ICON_SIZE);
this.actor = new St.Clickable({ style_class: 'places-item',
reactive: true,
x_align: St.Align.START,
x_fill: true });
let box = new St.BoxLayout({ style_class: 'places-item-box' });
this.actor.set_child(box);
let bin = new St.Bin({ child: this._icon });
box.add(bin);
let text = new St.Label({ text: info.name });
box.add(text, { expand: true, x_fill: true });
if (info.isRemovable()) {
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);
removeIconBox.connect('clicked',
Lang.bind(this, function() {
this._info.remove();
}));
}
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor._delegate = this;
this._draggable = DND.makeDraggable(this.actor);
this._draggable.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
this._draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
}));
},
_onClicked: function(b) {
this._info.launch();
Main.overview.hide();
},
getDragActorSource: function() {
return this._icon;
},
getDragActor: function(stageX, stageY) {
return this._info.iconFactory(PLACES_ICON_SIZE);
},
//// Drag and drop methods ////
shellWorkspaceLaunch: function() {
this._info.launch();
}
};
function DashPlaceDisplay() {
this._init();
}
DashPlaceDisplay.prototype = {
_init: function() {
// Places is divided semi-arbitrarily into left and right; a grid would
// look better in that there would be an even number of items left+right,
// but it seems like we want some sort of differentiation between actions
// like "Connect to server..." and regular folders
this.actor = new St.Table({ style_class: 'places-section',
homogeneous: true });
this._defaultsList = [];
this._bookmarksList = [];
this._mountsList = [];
Main.placesManager.connect('defaults-updated', Lang.bind(this, this._updateDefaults));
Main.placesManager.connect('bookmarks-updated', Lang.bind(this, this._updateBookmarks));
Main.placesManager.connect('mounts-updated', Lang.bind(this, this._updateMounts));
this._updateDefaults();
this._updateMounts();
this._updateBookmarks();
},
_updateDefaults: function() {
for (let i = 0; i < this._defaultsList.length; i++)
this._defaultsList[i].destroy();
this._defaultsList = [];
let places = Main.placesManager.getDefaultPlaces();
for (let i = 0; i < places.length; i++) {
this._defaultsList[i] = new DashPlaceDisplayItem(places[i]).actor;
this.actor.add(this._defaultsList[i], {row: i, col: 0});
}
this._updateMounts();
},
_updateMounts: function() {
for (let i = 0; i < this._mountsList.length; i++)
this._mountsList[i].destroy();
this._mountsList = [];
let places = Main.placesManager.getMounts();
for (let i = 0; i < places.length; i++) {
this._mountsList[i] = new DashPlaceDisplayItem(places[i]).actor;
this.actor.add(this._mountsList[i], {row: this._defaultsList.length + i, col: 0});
}
},
_updateBookmarks: function() {
for (let i = 0; i < this._bookmarksList.length; i++)
this._bookmarksList[i].destroy();
this._bookmarksList = [];
let places = Main.placesManager.getBookmarks();
for (let i = 0; i < places.length; i ++) {
this._bookmarksList[i] = new DashPlaceDisplayItem(places[i]).actor;
this.actor.add(this._bookmarksList[i], {row: i, col: 1});
}
}
};
Signals.addSignalMethods(DashPlaceDisplay.prototype);
function PlaceSearchProvider() {
this._init();

View File

@ -631,18 +631,25 @@ PopupMenuBase.prototype = {
},
addMenuItem: function(menuItem, position) {
if (position == undefined)
let before_item = null;
if (position == undefined) {
this.box.add(menuItem.actor);
else
this.box.insert_actor(menuItem.actor, position);
} else {
let items = this.getMenuItems();
if (position < items.length) {
before_item = items[position].actor;
this.box.insert_before(menuItem.actor, before_item);
} else
this.box.add(menuItem.actor);
}
if (menuItem instanceof PopupSubMenuMenuItem) {
if (position == undefined)
if (before_item == null)
this.box.add(menuItem.menu.actor);
else
this.box.insert_actor(menuItem.menu.actor, position + 1);
this.box.insert_before(menuItem.menu.actor, before_item);
menuItem._subMenuActivateId = menuItem.menu.connect('activate', Lang.bind(this, function() {
this.emit('activate');
this.close();
this.close(true);
}));
menuItem._subMenuActiveChangeId = menuItem.menu.connect('active-changed', Lang.bind(this, function(submenu, submenuItem) {
if (this._activeMenuItem && this._activeMenuItem != submenuItem)
@ -652,7 +659,7 @@ PopupMenuBase.prototype = {
}));
menuItem._closingId = this.connect('open-state-changed', function(self, open) {
if (!open)
menuItem.menu.immediateClose();
menuItem.menu.close(false);
});
}
menuItem._activeChangeId = menuItem.connect('active-changed', Lang.bind(this, function (menuItem, active) {
@ -668,7 +675,7 @@ PopupMenuBase.prototype = {
}));
menuItem._activateId = menuItem.connect('activate', Lang.bind(this, function (menuItem, event) {
this.emit('activate', menuItem);
this.close();
this.close(true);
}));
menuItem.connect('destroy', Lang.bind(this, function(emitter) {
menuItem.disconnect(menuItem._activateId);
@ -735,9 +742,9 @@ PopupMenuBase.prototype = {
toggle: function() {
if (this.isOpen)
this.close();
this.close(true);
else
this.open();
this.open(true);
},
destroy: function() {
@ -802,26 +809,26 @@ PopupMenu.prototype = {
this._boxPointer.setArrowOrigin(origin);
},
open: function() {
open: function(animate) {
if (this.isOpen)
return;
this.isOpen = true;
this._boxPointer.setPosition(this.sourceActor, this._gap, this._alignment);
this._boxPointer.animateAppear();
this._boxPointer.show(animate);
this.emit('open-state-changed', true);
},
close: function() {
close: function(animate) {
if (!this.isOpen)
return;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
this._boxPointer.animateDisappear();
this._boxPointer.hide(animate);
this.isOpen = false;
this.emit('open-state-changed', false);
@ -848,12 +855,15 @@ PopupSubMenu.prototype = {
this.actor.hide();
},
open: function() {
open: function(animate) {
if (this.isOpen)
return;
this.isOpen = true;
// we don't implement the !animate case because that doesn't
// currently get used...
let [naturalHeight, minHeight] = this.actor.get_preferred_height(-1);
this.actor.height = 0;
this.actor.show();
@ -874,7 +884,7 @@ PopupSubMenu.prototype = {
});
},
close: function() {
close: function(animate) {
if (!this.isOpen)
return;
@ -883,6 +893,7 @@ PopupSubMenu.prototype = {
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
if (animate) {
this.actor._arrow_rotation = this._arrow.rotation_angle_z;
Tweener.addTween(this.actor,
{ _arrow_rotation: 0,
@ -900,27 +911,20 @@ PopupSubMenu.prototype = {
this._arrow.rotation_angle_z = this.actor._arrow_rotation;
}
});
},
immediateClose: function() {
if (!this.isOpen)
return;
if (this._activeMenuItem)
this._activeMenuItem.setActive(false);
} else {
this._arrow.rotation_angle_z = 0;
this.actor.hide();
this.isOpen = false;
this.emit('open-state-changed', false);
}
},
_onKeyPressEvent: function(actor, event) {
// Move focus back to parent menu if the user types Left.
if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
this.close();
this.close(true);
this.sourceActor._delegate.setActive(true);
return true;
}
@ -964,7 +968,7 @@ PopupSubMenuMenuItem.prototype = {
_onKeyPressEvent: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Right) {
this.menu.open();
this.menu.open(true);
this.menu.activateFirst();
return true;
}
@ -972,7 +976,7 @@ PopupSubMenuMenuItem.prototype = {
},
activate: function(event) {
this.menu.open();
this.menu.open(true);
},
_onButtonReleaseEvent: function(actor) {
@ -999,23 +1003,24 @@ PopupMenuManager.prototype = {
this._leaveEventId = 0;
this._activeMenu = null;
this._menus = [];
this._delayedMenus = [];
this._preGrabInputMode = null;
},
addMenu: function(menu, position) {
let menudata = {
menu: menu,
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
activateId: menu.connect('activate', Lang.bind(this, this._onMenuActivated)),
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
enterId: 0,
focusId: 0
focusInId: 0,
focusOutId: 0
};
let source = menu.sourceActor;
if (source) {
menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusOutId = source.connect('key-focus-out', Lang.bind(this, function() { this._onKeyFocusOut(menu); }));
}
if (position == undefined)
@ -1034,18 +1039,19 @@ PopupMenuManager.prototype = {
let menudata = this._menus[position];
menu.disconnect(menudata.openStateChangeId);
menu.disconnect(menudata.activateId);
menu.disconnect(menudata.destroyId);
if (menudata.enterId)
menu.sourceActor.disconnect(menudata.enterId);
if (menudata.focusId)
menu.sourceActor.disconnect(menudata.focusId);
if (menudata.focusInId)
menu.sourceActor.disconnect(menudata.focusInId);
if (menudata.focusOutId)
menu.sourceActor.disconnect(menudata.focusOutId);
this._menus.splice(position, 1);
},
grab: function() {
_grab: function() {
Main.pushModal(this._owner.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
@ -1057,7 +1063,7 @@ PopupMenuManager.prototype = {
this.grabbed = true;
},
ungrab: function() {
_ungrab: function() {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
global.stage.disconnect(this._keyPressEventId);
@ -1073,40 +1079,100 @@ PopupMenuManager.prototype = {
_onMenuOpenState: function(menu, open) {
if (open) {
this._activeMenu = menu;
if (!this.grabbed)
this.grab();
} else if (menu == this._activeMenu) {
this._activeMenu = null;
if (this.grabbed)
this.ungrab();
if (!this.grabbed) {
this._preGrabInputMode = global.stage_input_mode;
this._grab();
}
this._activeMenu = menu;
// if the focus is not already associated with the menu,
// then focus the menu
let focus = global.stage.key_focus;
if (!this._activeMenuContains(focus))
menu.sourceActor.grab_key_focus();
} else if (menu == this._activeMenu) {
let focus = global.stage.key_focus;
let fromActive = this._activeMenuContains(focus);
if (this.grabbed)
this._ungrab();
this._activeMenu = null;
// If keynav was in effect before we grabbed, then we need
// to properly re-establish it after we ungrab. (popModal
// will have unset the focus.) If some part of the menu
// was focused at the time of the ungrab then focus its
// sourceActor. Otherwise just reset the focus to where it
// was right before the ungrab.
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED) {
global.stage_input_mode = Shell.StageInputMode.FOCUSED;
if (fromActive)
menu.sourceActor.grab_key_focus();
else
focus.grab_key_focus();
}
}
},
// change the currently-open menu without dropping grab
_changeMenu: function(newMenu) {
if (this._activeMenu) {
// _onOpenMenuState will drop the grab if it sees
// this._activeMenu being closed; so clear _activeMenu
// before closing it to keep that from happening
let oldMenu = this._activeMenu;
this._activeMenu = null;
oldMenu.close(false);
newMenu.open(false);
} else
newMenu.open(true);
},
_onMenuSourceEnter: function(menu) {
if (!this.grabbed || menu == this._activeMenu)
return false;
if (this._activeMenu != null)
this._activeMenu.close();
menu.open();
this._changeMenu(menu);
return false;
},
_onMenuActivated: function(menu, item) {
if (this.grabbed)
this.ungrab();
_onKeyFocusOut: function(menu) {
if (!this.grabbed || menu != this._activeMenu)
return;
// We want to close the menu if the focus has moved somewhere
// other than inside the menu or to another menu's sourceActor.
// Unfortunately, when key-focus-out is emitted,
// stage.key_focus will be null. So we have to wait until
// after it emits the key-focus-in as well.
let id = global.stage.connect('notify::key-focus', Lang.bind(this,
function () {
global.stage.disconnect(id);
if (menu != this._activeMenu)
return;
let focus = global.stage.key_focus;
if (!focus || this._activeMenuContains(focus))
return;
if (focus._delegate && this._findMenu(focus._delegate.menu) != -1)
return;
menu.close(true);
}));
},
_onMenuDestroy: function(menu) {
this.removeMenu(menu);
},
_eventIsOnActiveMenu: function(event) {
let src = event.get_source();
_activeMenuContains: function(actor) {
return this._activeMenu != null
&& (this._activeMenu.actor.contains(src) ||
(this._activeMenu.sourceActor && this._activeMenu.sourceActor.contains(src)));
&& (this._activeMenu.actor.contains(actor) ||
(this._activeMenu.sourceActor && this._activeMenu.sourceActor.contains(actor)));
},
_eventIsOnActiveMenu: function(event) {
return this._activeMenuContains(event.get_source());
},
_eventIsOnAnyMenuSource: function(event) {
@ -1128,6 +1194,18 @@ PopupMenuManager.prototype = {
return -1;
},
_nextMenu: function(pos, direction) {
for (let i = 1; i < this._menus.length; i++) {
let candidate = mod(pos + i * direction, this._menus.length);
let menu = this._menus[candidate].menu;
if (!menu.sourceActor || menu.sourceActor.visible)
return menu;
}
// no menu is found? this should not happen
// anyway stay on current menu
return this._menus[pos];
},
_onEventCapture: function(actor, event) {
if (!this.grabbed)
return false;
@ -1166,12 +1244,9 @@ PopupMenuManager.prototype = {
if (symbol == Clutter.Left || symbol == Clutter.Right) {
let direction = symbol == Clutter.Right ? 1 : -1;
let pos = this._findMenu(this._activeMenu);
let next = this._menus[mod(pos + direction, this._menus.length)].menu;
let next = this._nextMenu(pos, direction);
if (next != this._activeMenu) {
let oldMenu = this._activeMenu;
this._activeMenu = next;
oldMenu.close();
next.open();
this._changeMenu(next);
next.activateFirst();
}
return true;
@ -1182,6 +1257,6 @@ PopupMenuManager.prototype = {
_closeMenu: function() {
if (this._activeMenu != null)
this._activeMenu.close();
this._activeMenu.close(true);
}
};

View File

@ -11,16 +11,18 @@ const Signals = imports.signals;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Lightbox = imports.ui.lightbox;
const FileUtils = imports.misc.fileUtils;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const Util = imports.misc.util;
const MAX_FILE_DELETED_BEFORE_INVALID = 10;
const HISTORY_KEY = 'command-history';
const HISTORY_LIMIT = 512;
const DIALOG_FADE_TIME = 0.1;
const DIALOG_GROW_TIME = 0.1;
function CommandCompleter() {
this._init();
@ -62,25 +64,6 @@ CommandCompleter.prototype = {
this._update(0);
},
_onGetEnumerateComplete : function(obj, res) {
this._enumerator = obj.enumerate_children_finish(res);
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete));
},
_onNextFileComplete : function(obj, res) {
let files = obj.next_files_finish(res);
for (let i = 0; i < files.length; i++) {
this._childs[this._i].push(files[i].get_name());
}
if (files.length) {
this._enumerator.next_files_async(100, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onNextFileComplete));
} else {
this._enumerator.close(null);
this._enumerator = null;
this._update(this._i + 1);
}
},
update : function() {
if (this._valid)
return;
@ -100,7 +83,12 @@ CommandCompleter.prototype = {
}
let file = Gio.file_new_for_path(this._paths[i]);
this._childs[this._i] = [];
file.enumerate_children_async(Gio.FILE_ATTRIBUTE_STANDARD_NAME, Gio.FileQueryInfoFlags.NONE, GLib.PRIORITY_LOW, null, Lang.bind(this, this._onGetEnumerateComplete));
FileUtils.listDirAsync(file, Lang.bind(this, function (files) {
for (let i = 0; i < files.length; i++) {
this._childs[this._i].push(files[i].get_name());
}
this._update(this._i + 1);
}));
},
_onChanged : function(m, f, of, type) {
@ -175,8 +163,9 @@ function RunDialog() {
}
RunDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init : function() {
this._isOpen = false;
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: 'run-dialog' });
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
this._enableInternalCommands = global.settings.get_boolean('development-tools');
@ -207,41 +196,32 @@ RunDialog.prototype = {
'debugexit': Lang.bind(this, function() {
Meta.exit(Meta.ExitCode.ERROR);
}),
// rt is short for "reload theme"
'rt': Lang.bind(this, function() {
Main.loadTheme();
})
};
// All actors are inside _group. We create it initially
// hidden then show it in show()
this._group = new Clutter.Group({ visible: false,
x: 0, y: 0 });
Main.uiGroup.add_actor(this._group);
this._lightbox = new Lightbox.Lightbox(this._group,
{ inhibitEvents: true });
this._box = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._group.add_actor(this._box);
this._lightbox.highlight(this._box);
let dialogBox = new St.BoxLayout({ style_class: 'run-dialog', vertical: true });
this._box.set_child(dialogBox);
let label = new St.Label({ style_class: 'run-dialog-label',
text: _("Please enter a command:") });
dialogBox.add(label, { expand: true, y_fill: false });
this.contentLayout.add(label, { y_align: St.Align.START });
let entry = new St.Entry({ style_class: 'run-dialog-entry' });
this._entryText = entry.clutter_text;
dialogBox.add(entry, { expand: true });
this.contentLayout.add(entry, { y_align: St.Align.START });
this.connect('opened',
Lang.bind(this, function() {
this._entryText.grab_key_focus();
}));
this._errorBox = new St.BoxLayout();
dialogBox.add(this._errorBox, { expand: true });
this.contentLayout.add(this._errorBox, { expand: true });
let errorIcon = new St.Button({ style_class: 'run-dialog-error-icon' });
@ -275,10 +255,10 @@ RunDialog.prototype = {
else
this._run(o.get_text(), false);
if (!this._commandError)
this.close();
this.close(global.get_current_time());
}
if (symbol == Clutter.Escape) {
this.close();
this.close(global.get_current_time());
return true;
}
if (symbol == Clutter.slash) {
@ -349,9 +329,7 @@ RunDialog.prototype = {
try {
if (inTerminal)
command = 'gnome-terminal -x ' + input;
let [ok, len, args] = GLib.shell_parse_argv(command);
let p = new Shell.Process({ 'args' : args });
p.run();
Util.trySpawnCommandLine(command);
} catch (e) {
// Mmmh, that failed - see if @input matches an existing file
let path = null;
@ -369,16 +347,25 @@ RunDialog.prototype = {
global.create_app_launch_context());
} else {
this._commandError = true;
// The exception contains an error string like:
// Error invoking Shell.run: Failed to execute child
// process "foo" (No such file or directory)
// We are only interested in the actual error, so parse
//that out.
let m = /.+\((.+)\)/.exec(e);
let errorStr = _("Execution of '%s' failed:").format(command) + '\n' + m[1];
let errorStr = _("Execution of '%s' failed:").format(command) + '\n' + e.message;
this._errorMessage.set_text(errorStr);
if (!this._errorBox.visible) {
let [errorBoxMinHeight, errorBoxNaturalHeight] = this._errorBox.get_preferred_height(-1);
let parentActor = this._errorBox.get_parent();
Tweener.addTween(parentActor,
{ height: parentActor.height + errorBoxNaturalHeight,
time: DIALOG_GROW_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
parentActor.set_height(-1);
this._errorBox.show();
})
});
}
}
}
}
@ -400,53 +387,14 @@ RunDialog.prototype = {
this._entryText.set_text('');
},
open : function() {
if (this._isOpen) // Already shown
return;
if (!Main.pushModal(this._group))
return;
// Position the dialog on the current monitor
let monitor = global.get_focus_monitor();
open: function() {
this._historyIndex = this._history.length;
this._box.set_position(monitor.x, monitor.y);
this._box.set_size(monitor.width, monitor.height);
this._isOpen = true;
this._lightbox.show();
this._group.opacity = 0;
this._group.show();
Tweener.addTween(this._group,
{ opacity: 255,
time: DIALOG_FADE_TIME,
transition: 'easeOutQuad'
});
global.stage.set_key_focus(this._entryText);
},
close : function() {
if (!this._isOpen)
return;
this._isOpen = false;
this._errorBox.hide();
this._entryText.set_text('');
this._commandError = false;
Main.popModal(this._group);
ModalDialog.ModalDialog.prototype.open.call(this);
},
Tweener.addTween(this._group,
{ opacity: 0,
time: DIALOG_FADE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this._errorBox.hide();
this._group.hide();
this._entryText.set_text('');
})
});
}
};
Signals.addSignalMethods(RunDialog.prototype);

View File

@ -1,6 +1,19 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Signals = imports.signals;
const Shell = imports.gi.Shell;
const Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const FileUtils = imports.misc.fileUtils;
const Main = imports.ui.main;
const DISABLED_OPEN_SEARCH_PROVIDERS_KEY = 'disabled-open-search-providers';
const RESULT_ICON_SIZE = 48;
@ -211,6 +224,107 @@ SearchProvider.prototype = {
};
Signals.addSignalMethods(SearchProvider.prototype);
function OpenSearchSystem(title) {
this._init(title);
}
OpenSearchSystem.prototype = {
_init: function() {
this._providers = [];
global.settings.connect('changed::' + DISABLED_OPEN_SEARCH_PROVIDERS_KEY, Lang.bind(this, this._refresh));
this._refresh();
},
getProviders: function() {
let res = [];
for (let i = 0; i < this._providers.length; i++)
res.push({ id: i, name: this._providers[i].name });
return res;
},
setSearchTerms: function(terms) {
this._terms = terms;
},
_checkSupportedProviderLanguage: function(provider) {
if (provider.url.search(/{language}/) == -1)
return true;
let langs = GLib.get_language_names();
langs.push('en');
let lang = null;
for (let i = 0; i < langs.length; i++) {
for (let k = 0; k < provider.langs.length; k++) {
if (langs[i] == provider.langs[k])
lang = langs[i];
}
if (lang)
break;
}
provider.lang = lang;
return lang != null;
},
activateResult: function(id) {
let searchTerms = this._terms.join(' ');
let url = this._providers[id].url.replace('{searchTerms}', encodeURIComponent(searchTerms));
if (url.match('{language}'))
url = url.replace('{language}', this._providers[id].lang);
try {
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context());
} catch (e) {
// TODO: remove this after glib will be removed from moduleset
// In the default jhbuild, gio is in our prefix but gvfs is not
Util.spawn(['gvfs-open', url])
}
Main.overview.hide();
},
_addProvider: function(fileName) {
let file = Gio.file_new_for_path(global.datadir + '/search_providers/' + fileName);
let source = '';
file.load_contents_async(null, Lang.bind(this, function (obj, res) {
let [success, source] = file.load_contents_finish(res);
if (source) {
let [success, name, url, langs, icon_uri] = global.parse_search_provider(source);
let provider ={ name: name,
url: url,
id: this._providers.length,
icon_uri: icon_uri,
langs: langs };
if (this._checkSupportedProviderLanguage(provider)) {
this._providers.push(provider);
this.emit('changed');
}
}
}));
},
_refresh: function() {
this._providers = [];
let names = global.settings.get_strv(DISABLED_OPEN_SEARCH_PROVIDERS_KEY);
let file = Gio.file_new_for_path(global.datadir + '/search_providers');
FileUtils.listDirAsync(file, Lang.bind(this, function(files) {
for (let i = 0; i < files.length; i++) {
let enabled = true;
let name = files[i].get_name();
for (let k = 0; k < names.length; k++)
if (names[k] == name)
enabled = false;
if (enabled)
this._addProvider(name);
}
}));
}
}
Signals.addSignalMethods(OpenSearchSystem.prototype);
function SearchSystem() {
this._init();
}

View File

@ -149,18 +149,18 @@ GridSearchResults.prototype = {
};
function SearchResults(searchSystem) {
this._init(searchSystem);
function SearchResults(searchSystem, openSearchSystem) {
this._init(searchSystem, openSearchSystem);
}
SearchResults.prototype = {
_init: function(searchSystem) {
_init: function(searchSystem, openSearchSystem) {
this._searchSystem = searchSystem;
this._openSearchSystem = openSearchSystem;
this.actor = new St.BoxLayout({ name: 'searchResults',
vertical: true });
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 });
@ -170,7 +170,11 @@ SearchResults.prototype = {
scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
scrollView.add_actor(this._content);
this.actor.set_child(scrollView);
this.actor.add(scrollView, { x_fill: true,
y_fill: false,
expand: true,
x_align: St.Align.START,
y_align: St.Align.START });
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._content.add(this._statusText);
@ -179,6 +183,51 @@ SearchResults.prototype = {
this._providerMeta = [];
for (let i = 0; i < this._providers.length; i++)
this.createProviderMeta(this._providers[i]);
this._searchProvidersBox = new St.BoxLayout({ style_class: 'search-providers-box' });
this.actor.add(this._searchProvidersBox);
this._openSearchProviders = [];
this._openSearchSystem.connect('changed', Lang.bind(this, this._updateOpenSearchProviderButtons));
this._updateOpenSearchProviderButtons();
},
_updateOpenSearchProviderButtons: function() {
this._selectedOpenSearchButton = -1;
for (let i = 0; i < this._openSearchProviders.length; i++)
this._openSearchProviders[i].actor.destroy();
this._openSearchProviders = this._openSearchSystem.getProviders();
for (let i = 0; i < this._openSearchProviders.length; i++)
this._createOpenSearchProviderButton(this._openSearchProviders[i]);
},
_updateOpenSearchButtonState: function() {
for (let i = 0; i < this._openSearchProviders.length; i++) {
if (i == this._selectedOpenSearchButton)
this._openSearchProviders[i].actor.add_style_pseudo_class('selected');
else
this._openSearchProviders[i].actor.remove_style_pseudo_class('selected');
}
},
_createOpenSearchProviderButton: function(provider) {
let clickable = new St.Clickable({ style_class: 'dash-search-button',
reactive: true,
x_fill: true,
y_align: St.Align.MIDDLE });
let bin = new St.Bin({ x_fill: false,
x_align:St.Align.MIDDLE });
clickable.connect('clicked', Lang.bind(this, function() {
this._openSearchSystem.activateResult(provider.id);
}));
let title = new St.Label({ text: provider.name,
style_class: 'dash-search-button-label' });
bin.set_child(title);
clickable.set_child(bin);
provider.actor = clickable;
this._searchProvidersBox.add(clickable);
},
createProviderMeta: function(provider) {
@ -227,6 +276,8 @@ SearchResults.prototype = {
this._searchSystem.reset();
this._statusText.hide();
this._clearDisplay();
this._selectedOpenSearchButton = -1;
this._updateOpenSearchButtonState();
},
startingSearch: function() {
@ -247,12 +298,12 @@ SearchResults.prototype = {
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();
this._openSearchSystem.setSearchTerms(terms);
for (let i = 0; i < results.length; i++) {
let [provider, providerResults] = results[i];
@ -262,6 +313,7 @@ SearchResults.prototype = {
meta.count.set_text('' + providerResults.length);
}
if (this._selectedOpenSearchButton == -1)
this.selectDown(false);
return true;
@ -284,6 +336,7 @@ SearchResults.prototype = {
},
selectUp: function(recursing) {
if (this._selectedOpenSearchButton == -1) {
for (let i = this._selectedProvider; i >= 0; i--) {
let meta = this._providerMeta[i];
if (!meta.actor.visible)
@ -294,6 +347,15 @@ SearchResults.prototype = {
return;
}
}
}
if (this._selectedOpenSearchButton == -1)
this._selectedOpenSearchButton = this._openSearchProviders.length;
this._selectedOpenSearchButton--;
this._updateOpenSearchButtonState();
if (this._selectedOpenSearchButton >= 0)
return;
if (this._providerMeta.length > 0 && !recursing) {
this._selectedProvider = this._providerMeta.length - 1;
this.selectUp(true);
@ -302,6 +364,7 @@ SearchResults.prototype = {
selectDown: function(recursing) {
let current = this._selectedProvider;
if (this._selectedOpenSearchButton == -1) {
if (current == -1)
current = 0;
for (let i = current; i < this._providerMeta.length; i++) {
@ -314,6 +377,17 @@ SearchResults.prototype = {
return;
}
}
}
this._selectedOpenSearchButton++;
if (this._selectedOpenSearchButton < this._openSearchProviders.length) {
this._updateOpenSearchButtonState();
return;
}
this._selectedOpenSearchButton = -1;
this._updateOpenSearchButtonState();
if (this._providerMeta.length > 0 && !recursing) {
this._selectedProvider = 0;
this.selectDown(true);
@ -321,6 +395,13 @@ SearchResults.prototype = {
},
activateSelected: function() {
if (this._selectedOpenSearchButton != -1) {
let provider = this._openSearchProviders[this._selectedOpenSearchButton];
this._openSearchSystem.activateResult(provider.id);
Main.overview.hide();
return;
}
let current = this._selectedProvider;
if (current < 0)
return;

View File

@ -12,6 +12,7 @@ const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
@ -108,8 +109,7 @@ ATIndicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Universal Access Settings"), function() {
let p = new Shell.Process({ args: ['gnome-control-center','universal-access'] });
p.run();
Util.spawnDesktop('gnome-universal-access-panel');
});
},

View File

@ -65,16 +65,17 @@ Indicator.prototype = {
this.menu.addMenuItem(this._discoverable);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this._fullMenuItems = [new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
new PopupMenu.PopupSeparatorMenuItem(),
new PopupMenu.PopupSeparatorMenuItem(),
new PopupMenu.PopupMenuItem(_("Setup a New Device..."))];
this._deviceSep = this._fullMenuItems[1]; // hidden if no device exists
this._fullMenuItems = [new PopupMenu.PopupSeparatorMenuItem(),
new PopupMenu.PopupMenuItem(_("Send Files to Device...")),
new PopupMenu.PopupMenuItem(_("Setup a New Device...")),
new PopupMenu.PopupSeparatorMenuItem()];
this._hasDevices = false;
this._deviceSep = this._fullMenuItems[0]; // hidden if no device exists
this._fullMenuItems[0].connect('activate', function() {
this._fullMenuItems[1].connect('activate', function() {
GLib.spawn_command_line_async('bluetooth-sendto');
});
this._fullMenuItems[3].connect('activate', function() {
this._fullMenuItems[2].connect('activate', function() {
GLib.spawn_command_line_async('bluetooth-wizard');
});
@ -83,7 +84,7 @@ Indicator.prototype = {
this.menu.addMenuItem(item);
}
this._deviceItemPosition = 5;
this._deviceItemPosition = 3;
this._deviceItems = [];
this._applet.connect('devices-changed', Lang.bind(this, this._updateDevices));
this._updateDevices();
@ -104,12 +105,18 @@ Indicator.prototype = {
_updateKillswitch: function() {
let current_state = this._applet.killswitch_state;
let on = current_state == GnomeBluetoothApplet.KillswitchState.UNBLOCKED;
let has_adapter = current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER;
let can_toggle = current_state != GnomeBluetoothApplet.KillswitchState.NO_ADAPTER &&
current_state != GnomeBluetoothApplet.KillswitchState.HARD_BLOCKED;
this._killswitch.setToggleState(on);
this._killswitch.actor.reactive = can_toggle;
if (has_adapter)
this.actor.show();
else
this.actor.hide();
if (on) {
this._discoverable.actor.show();
this.setIcon('bluetooth-active');
@ -119,22 +126,56 @@ Indicator.prototype = {
}
},
_updateDevices: function() {
this._destroyAll(this._deviceItems);
this._deviceItems = [];
_deviceCompare: function(d1, d2) {
return d1.device_path == d2.device_path &&
d1.bdaddr == d2.bdaddr &&
d1.can_connect == d2.can_connect &&
d1.capabilities == d2.capabilities;
},
_updateDevices: function() {
let devices = this._applet.get_devices();
let anydevice = false;
for (let i = 0; i < this._deviceItems.length; i++) {
let item = this._deviceItems[i];
let destroy = true;
for (let j = 0; j < devices.length; j++) {
// we need to deep compare because BluetoothSimpleDevice is a boxed type
// (but we take advantage of that, because _skip will disappear the next
// time get_devices() is called)
if (this._deviceCompare(item._device, devices[i])) {
item.label.text = devices[i].alias;
devices[i]._skip = true;
destroy = false;
}
}
if (destroy) {
item.destroy();
item._destroyed = true;
}
}
let newlist = [ ];
for (let i = 0; i < this._deviceItems.length; i++) {
let item = this._deviceItems[i];
if (!item._destroyed)
newlist.push(item);
}
this._deviceItems = newlist;
this._hasDevices = newlist.length > 0;
for (let i = 0; i < devices.length; i++) {
let d = devices[i];
if (d._skip)
continue;
let item = this._createDeviceItem(d);
if (item) {
this.menu.addMenuItem(item, this._deviceItemPosition + this._deviceItems.length);
this._deviceItems.push(item);
anydevice = true;
this._hasDevices = true;
}
}
if (anydevice)
if (this._hasDevices)
this._deviceSep.actor.show();
else
this._deviceSep.actor.hide();
@ -233,7 +274,10 @@ Indicator.prototype = {
_updateFullMenu: function() {
if (this._applet.show_full_menu) {
this._showAll(this._fullMenuItems);
if (this._hasDevices)
this._showAll(this._deviceItems);
else
this._deviceSep.actor.hide();
} else {
this._hideAll(this._fullMenuItems);
this._hideAll(this._deviceItems);
@ -422,7 +466,7 @@ PinNotification.prototype = {
}));
this.addActor(this._entry);
this.addButton('ok', _("Ok"));
this.addButton('ok', _("OK"));
this.addButton('cancel', _("Cancel"));
this.connect('action-invoked', Lang.bind(this, function(self, action) {

206
js/ui/status/keyboard.js Normal file
View File

@ -0,0 +1,206 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const GdkPixbuf = imports.gi.GdkPixbuf;
const Gkbd = imports.gi.Gkbd;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const INDICATOR_SCHEMA = 'org.gnome.settings-daemon.plugins.keyboard';
function LayoutMenuItem() {
this._init.apply(this, arguments);
}
LayoutMenuItem.prototype = {
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
_init: function(config, id, indicator, long_name) {
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
this._config = config;
this._id = id;
this.label = new St.Label({ text: long_name });
this.indicator = indicator;
this.addActor(this.label);
this.addActor(this.indicator);
},
activate: function(event) {
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this);
this._config.lock_group(this._id);
}
};
function XKBIndicator() {
this._init.apply(this, arguments);
}
XKBIndicator.prototype = {
__proto__: PanelMenu.Button.prototype,
_init: function() {
PanelMenu.Button.prototype._init.call(this, St.Align.START);
this._container = new Shell.GenericContainer();
this._container.connect('get-preferred-width', Lang.bind(this, this._get_preferred_width));
this._container.connect('get-preferred-height', Lang.bind(this, this._get_preferred_height));
this._container.connect('allocate', Lang.bind(this, this._allocate));
this.actor.set_child(this._container);
this._iconActor = new St.Icon({ icon_name: 'keyboard', icon_type: St.IconType.SYMBOLIC, style_class: 'system-status-icon' });
this._container.add_actor(this._iconActor);
this._labelActors = [ ];
this._layoutItems = [ ];
this._indicatorSettings = new Gio.Settings({ schema: INDICATOR_SCHEMA });
this._indicatorSettings.connect('changed::disable-indicator', Lang.bind(this, this._sync_config));
this._disableIndicator = false;
this._showFlags = false;
this._config = Gkbd.Configuration.get();
this._config.connect('changed', Lang.bind(this, this._sync_config));
this._config.connect('group-changed', Lang.bind(this, this._sync_group));
this._config.start_listen();
this._sync_config();
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Keyboard Settings"), function() {
GLib.spawn_command_line_async('gnome-control-center region');
});
},
_sync_config: function() {
this._disableIndicator = this._indicatorSettings.get_boolean('disable-indicator');
this._showFlags = this._config.if_flags_shown();
if (this._showFlags) {
this._container.set_skip_paint(this._iconActor, false);
} else {
this._container.set_skip_paint(this._iconActor, true);
}
let groups = this._config.get_group_names();
if (groups.length > 1 && !this._disableIndicator) {
this.actor.show();
} else {
this.menu.close();
this.actor.hide();
}
for (let i = 0; i < this._layoutItems.length; i++)
this._layoutItems[i].destroy();
for (let i = 0; i < this._labelActors.length; i++)
this._labelActors[i].destroy();
let short_names = this._config.get_short_group_names();
this._selectedLayout = null;
this._layoutItems = [ ];
this._selectedLabel = null;
this._labelActors = [ ];
for (let i = 0; i < groups.length; i++) {
let icon_name = this._config.get_group_name(i);
let actor;
if (this._showFlags)
actor = new St.Icon({ icon_name: icon_name, icon_type: St.IconType.SYMBOLIC, style_class: 'popup-menu-icon' });
else
actor = new St.Label({ text: short_names[i] });
let item = new LayoutMenuItem(this._config, i, actor, groups[i]);
item._short_group_name = short_names[i];
item._icon_name = icon_name;
this._layoutItems.push(item);
this.menu.addMenuItem(item, i);
let shortLabel = new St.Label({ text: short_names[i] });
this._labelActors.push(shortLabel);
this._container.add_actor(shortLabel);
this._container.set_skip_paint(shortLabel, true);
}
this._sync_group();
},
_sync_group: function() {
let selected = this._config.get_current_group();
if (this._selectedLayout) {
this._selectedLayout.setShowDot(false);
this._selectedLayout = null;
}
if (this._selectedLabel) {
this._container.set_skip_paint(this._selectedLabel, true);
this._selectedLabel = null;
}
let item = this._layoutItems[selected];
item.setShowDot(true);
this._iconActor.icon_name = item._icon_name;
this._selectedLabel = this._labelActors[selected];
this._container.set_skip_paint(this._selectedLabel, this._showFlags);
this._selectedLayout = item;
},
_get_preferred_width: function(container, for_height, alloc) {
/* Here, and in _get_preferred_height, we need to query for the
height of all children, but we ignore the results for those
we don't actually display. */
let max_min_width = 0, max_natural_width = 0;
if (this._showFlags)
[max_min_width, max_natural_width] = this._iconActor.get_preferred_width(for_height);
for (let i = 0; i < this._labelActors.length; i++) {
let [min_width, natural_width] = this._labelActors[i].get_preferred_width(for_height);
if (!this._showFlags) {
max_min_width = Math.max(max_min_width, min_width);
max_natural_width = Math.max(max_natural_width, natural_width);
}
}
alloc.min_size = max_min_width;
alloc.natural_size = max_natural_width;
},
_get_preferred_height: function(container, for_width, alloc) {
let max_min_height = 0, max_natural_height = 0;
if (this._showFlags)
[max_min_height, max_natural_height] = this._iconActor.get_preferred_height(for_width);
for (let i = 0; i < this._labelActors.length; i++) {
let [min_height, natural_height] = this._labelActors[i].get_preferred_height(for_width);
if (!this._showFlags) {
max_min_height = Math.max(max_min_height, min_height);
max_natural_height = Math.max(max_natural_height, natural_height);
}
}
alloc.min_size = max_min_height;
alloc.natural_size = max_natural_height;
},
_allocate: function(container, box, flags) {
// translate box to (0, 0)
box.x2 -= box.x1;
box.x1 = 0;
box.y2 -= box.y1;
box.y1 = 0;
this._iconActor.allocate_align_fill(box, 0.5, 0, false, false, flags);
for (let i = 0; i < this._labelActors.length; i++)
this._labelActors[i].allocate_align_fill(box, 0.5, 0, false, false, flags);
}
};

View File

@ -1,7 +1,6 @@
/* -*- 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;
@ -10,6 +9,7 @@ const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
@ -83,7 +83,7 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Power Settings"),function() {
GLib.spawn_command_line_async('gnome-control-center power');
Util.spawnDesktop('gnome-power-panel');
});
this._proxy.connect('Changed', Lang.bind(this, this._devicesChanged));
@ -134,8 +134,7 @@ Indicator.prototype = {
this._batteryItem.actor.reactive = true;
this._batteryItem.actor.can_focus = true;
this._batteryItem.connect('activate', function(item) {
let p = new Shell.Process({ args: ['gnome-power-statistics', '--device', device_id] });
p.run();
Util.spawn(['gnome-power-statistics', '--device', device_id]);
});
} else {
// virtual device
@ -164,8 +163,7 @@ Indicator.prototype = {
let item = new DeviceItem (devices[i]);
item.connect('activate', function() {
let p = new Shell.Process({ args: ['gnome-power-statistics', '--device', device_id] });
p.run();
Util.spawn(['gnome-power-statistics', '--device', device_id]);
});
this._deviceItems.push(item);
this.menu.addMenuItem(item, this._otherDevicePosition + position);
@ -197,8 +195,8 @@ Indicator.prototype = {
_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');
Util.killall('gnome-power-manager');
Util.spawn(['gnome-power-manager']);
this._restarted = true;
}
}

View File

@ -11,6 +11,7 @@ const St = imports.gi.St;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
@ -60,8 +61,7 @@ Indicator.prototype = {
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Sound Settings"), function() {
let p = new Shell.Process({ args: ['gnome-control-center', 'sound'] });
p.run();
Util.spawnDesktop('gnome-sound-panel');
});
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));

View File

@ -6,6 +6,7 @@ const Signals = imports.signals;
const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const Util = imports.misc.util;
const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'bluetooth-applet': 'bluetooth',
@ -33,8 +34,7 @@ StatusIconDispatcher.prototype = {
// app-indicators, so that applications fall back to normal
// status icons
// http://bugzilla.gnome.org/show_bug.cgi=id=621382
let p = new Shell.Process({ args: ['pkill', '-f', '^([^ ]*/)?indicator-application-service$']});
p.run();
Util.killall('indicator-application-service');
},
_onTrayIconAdded: function(o, icon) {

View File

@ -12,6 +12,7 @@ const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util;
// Adapted from gdm/gui/user-switch-applet/applet.c
//
@ -31,7 +32,7 @@ StatusMenuButton.prototype = {
this.actor.set_child(box);
this._gdm = Gdm.UserManager.ref_default();
this._gdm.queue_load()
this._gdm.queue_load();
this._user = this._gdm.get_user(GLib.get_user_name());
this._presence = new GnomeSession.Presence();
@ -153,17 +154,17 @@ StatusMenuButton.prototype = {
_onMyAccountActivate: function() {
Main.overview.hide();
this._spawn(['gnome-control-center', 'user-accounts']);
Util.spawnDesktop('gnome-user-accounts-panel');
},
_onPreferencesActivate: function() {
Main.overview.hide();
this._spawn(['gnome-control-center', '-o']);
Util.spawnDesktop('gnome-control-center');
},
_onLockScreenActivate: function() {
Main.overview.hide();
this._spawn(['gnome-screensaver-command', '--lock']);
Util.spawn(['gnome-screensaver-command', '--lock']);
},
_onLoginScreenActivate: function() {
@ -174,19 +175,11 @@ StatusMenuButton.prototype = {
_onQuitSessionActivate: function() {
Main.overview.hide();
this._spawn(['gnome-session-save', '--logout-dialog']);
Util.spawn(['gnome-session-save', '--logout-dialog']);
},
_onShutDownActivate: function() {
Main.overview.hide();
this._spawn(['gnome-session-save', '--shutdown-dialog']);
},
_spawn: function(args) {
// FIXME: once Shell.Process gets support for signalling
// errors we should pop up an error dialog or something here
// on failure
let p = new Shell.Process({'args' : args});
p.run();
Util.spawn(['gnome-session-save', '--shutdown-dialog']);
}
};

View File

@ -476,6 +476,7 @@ Source.prototype = {
}
this._notification = new Notification(this);
this._notification.setUrgency(MessageTray.Urgency.HIGH);
// Since we only create sources when receiving a message, this
// is a plausible default
@ -593,6 +594,7 @@ Notification.prototype = {
_init: function(source) {
MessageTray.Notification.prototype._init.call(this, source, source.title, null, { customContent: true });
this.setResident(true);
this._responseEntry = new St.Entry({ style_class: 'chat-response' });
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));

View File

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

View File

@ -497,6 +497,8 @@ WindowManager.prototype = {
for (let i = 0; i < switchData.windows.length; i++) {
let w = switchData.windows[i];
if (w.window.is_destroyed()) // Window gone
continue;
if (w.window.get_parent() == switchData.outGroup) {
w.window.reparent(w.parent);
w.window.hide();

View File

@ -644,6 +644,9 @@ WorkspacesView.prototype = {
},
_onDragMotion: function(dragEvent) {
if (Main.overview.animationInProgress)
return DND.DragMotionResult.CONTINUE;
let primary = global.get_primary_monitor();
let activeWorkspaceIndex = global.screen.get_active_workspace_index();

130
js/ui/xdndHandler.js Normal file
View File

@ -0,0 +1,130 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
const Mainloop = imports.mainloop;
const DND = imports.ui.dnd;
function XdndHandler() {
this._init();
}
XdndHandler.prototype = {
_init: function() {
// Used to display a clone of the cursor window when the
// window group is hidden (like it happens in the overview)
this._cursorWindowClone = null;
// Used as a drag actor in case we don't have a cursor window clone
this._dummy = new Clutter.Rectangle({ width: 1, height: 1, opacity: 0 });
global.stage.add_actor(this._dummy);
this._dummy.hide();
// Mutter delays the creation of the output window as long
// as possible to avoid flicker. In case a plugin wants to
// access it directly it has to connect to the stage's show
// signal. (see comment in compositor.c:meta_compositor_manage_screen)
global.stage.connect('show', function () {
global.init_xdnd();
return false;
});
global.connect('xdnd-enter', Lang.bind(this, this._onEnter));
global.connect('xdnd-position-changed', Lang.bind(this, this._onPositionChanged));
global.connect('xdnd-leave', Lang.bind(this, this._onLeave));
this._windowGroupVisibilityHandlerId = 0;
},
// Called when the user cancels the drag (i.e release the button)
_onLeave: function() {
if (this._windowGroupVisibilityHandlerId != 0) {
Mainloop.source_remove(this._windowGroupVisibilityHandlerId);
this._windowGroupVisibilityHandlerId = 0;
}
this.emit('drag-end');
},
_onEnter: function() {
this._windowGroupVisibilityHandlerId =
global.window_group.connect('notify::visible',
Lang.bind(this, this._onWindowGroupVisibilityChanged));
this.emit('drag-begin', global.get_current_time());
},
_onWindowGroupVisibilityChanged: function() {
if (!global.window_group.visible) {
if (this._cursorWindowClone)
return;
let windows = global.get_window_actors();
let cursorWindow = windows[windows.length - 1];
// FIXME: more reliable way?
if (!cursorWindow.is_override_redirect())
return;
let constraint_x = new Clutter.BindConstraint({ coordinate : Clutter.BindCoordinate.X,
source: cursorWindow});
let constraint_y = new Clutter.BindConstraint({ coordinate : Clutter.BindCoordinate.Y,
source: cursorWindow});
this._cursorWindowClone = new Clutter.Clone({ source: cursorWindow });
global.overlay_group.add_actor(this._cursorWindowClone);
Shell.util_set_hidden_from_pick(this._cursorWindowClone, true);
// Make sure that the clone has the same position as the source
this._cursorWindowClone.add_constraint(constraint_x);
this._cursorWindowClone.add_constraint(constraint_y);
} else {
if (this._cursorWindowClone)
{
this._cursorWindowClone.destroy();
this._cursorWindowClone = null;
}
}
},
_onPositionChanged: function(obj, x, y) {
let pickedActor = global.stage.get_actor_at_pos(Clutter.PickMode.ALL, x, y);
// Make sure that the cursor window is on top
if (this._cursorWindowClone)
this._cursorWindowClone.raise_top();
let dragEvent = {
x: x,
y: y,
dragActor: this._cursorWindowClone ? this._cursorWindowClone : this._dummy,
source: this,
targetActor: pickedActor
};
for (let i = 0; i < DND.dragMonitors.length; i++) {
let motionFunc = DND.dragMonitors[i].dragMotion;
if (motionFunc) {
let result = motionFunc(dragEvent);
if (result != DND.DragMotionResult.CONTINUE)
return;
}
}
while (pickedActor) {
if (pickedActor._delegate && pickedActor._delegate.handleDragOver) {
let result = pickedActor._delegate.handleDragOver(this,
dragEvent.dragActor,
x,
y,
global.get_current_time());
if (result != DND.DragMotionResult.CONTINUE)
return;
}
pickedActor = pickedActor.get_parent();
}
}
}
Signals.addSignalMethods(XdndHandler.prototype);

View File

@ -1,13 +1,14 @@
data/gnome-shell.desktop.in.in
data/gnome-shell-clock-preferences.desktop.in.in
data/org.gnome.shell.gschema.xml.in
data/org.gnome.accessibility.magnifier.gschema.xml.in
[type: gettext/glade]data/clock-preferences.ui
js/misc/util.js
js/ui/appDisplay.js
js/ui/appFavorites.js
js/ui/dash.js
js/ui/docDisplay.js
js/ui/endSessionDialog.js
js/ui/lookingGlass.js
js/ui/messageTray.js
js/ui/overview.js
js/ui/panel.js
js/ui/placeDisplay.js
@ -15,6 +16,8 @@ js/ui/popupMenu.js
js/ui/runDialog.js
js/ui/statusMenu.js
js/ui/status/accessibility.js
js/ui/status/bluetooth.js
js/ui/status/keyboard.js
js/ui/status/power.js
js/ui/status/volume.js
js/ui/telepathyClient.js

595
po/ar.po
View File

@ -1,13 +1,13 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010.
# Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-30 13:30+0200\n"
"PO-Revision-Date: 2010-10-30 13:30+0300\n"
"POT-Creation-Date: 2011-01-12 11:29+0200\n"
"PO-Revision-Date: 2011-01-12 11:29+0300\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"MIME-Version: 1.0\n"
@ -26,14 +26,6 @@ msgstr "صدفة جنوم"
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 "
@ -41,60 +33,44 @@ msgid ""
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
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:5
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:6
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "If true, display date in the clock, in addition to time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgid "If true, display seconds in time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:12
#: ../data/org.gnome.shell.gschema.xml.in.h:10
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
#: ../data/org.gnome.shell.gschema.xml.in.h:11
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 "
@ -106,48 +82,42 @@ msgid ""
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show date in clock"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Show the week date in the calendar"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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 "
@ -155,29 +125,11 @@ msgid ""
"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 ""
#: ../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 ""
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Uuids of extensions to disable"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "Whether to collect stats about applications usage"
msgstr ""
@ -306,90 +258,46 @@ msgstr ""
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "تنسيق الساعة"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "الكل"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "تفضيلات الساعة"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "عرض اللوحة"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "أظهر ال_ثواني"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "أظهر ال_تاريخ"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "نسق _12 ساعة"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "نسق _24 ساعة"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "التفضيلات"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "أضيف %s إلى مفضلتك."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "أزيل %s من مفضّلتك."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "ابحث"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "أزِل"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "يبحث..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "لا نتائج مطابقة."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
msgid "PLACES & DEVICES"
msgstr "الأماكن والأجهزة"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "العناصر الحديثة"
@ -423,63 +331,67 @@ msgstr "اعرض المصدر"
msgid "Web Page"
msgstr "صفحة الوب"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:101
msgid "Undo"
msgstr "تراجع"
#: ../js/ui/overview.js:166
msgid "Windows"
msgstr "النوافذ"
#: ../js/ui/overview.js:169
msgid "Applications"
msgstr "التطبيقات"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:469
#: ../js/ui/panel.js:478
#, c-format
msgid "Quit %s"
msgstr "أغلق %s"
#: ../js/ui/panel.js:494
msgid "Preferences"
msgstr "التفضيلات"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:563
msgid "%a %b %e, %R:%S"
msgstr "%A %e %B، %R:%S"
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:564
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:568
msgid "%a %R:%S"
msgstr "%A %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:569
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:576
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:577
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:581
msgid "%a %l:%M:%S %p"
msgstr "%A %l:%M:%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:582
msgid "%a %l:%M %p"
msgstr "%A %Ol:%OM %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:727
msgid "Activities"
msgstr "الأنشطة"
@ -496,6 +408,10 @@ msgstr "أعد المحاولة"
msgid "Connect to..."
msgstr "اتّصل ب‍..."
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "الأماكن والأجهزة"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -503,13 +419,13 @@ msgstr "اتّصل ب‍..."
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
msgid "toggle-switch-us"
msgstr ""
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
#: ../js/ui/runDialog.js:238
msgid "Please enter a command:"
msgstr "من فضلك اكتب أمرا:"
#: ../js/ui/runDialog.js:378
#: ../js/ui/runDialog.js:383
#, c-format
msgid "Execution of '%s' failed:"
msgstr "فشل تنفيذ '%s':"
@ -522,42 +438,38 @@ msgstr "متاح"
msgid "Busy"
msgstr "مشغول"
#: ../js/ui/statusMenu.js:111
msgid "Invisible"
msgstr "خفي"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "حسابي"
#: ../js/ui/statusMenu.js:119
msgid "My Account..."
msgstr "حسابي..."
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "إعدادات النظام"
#: ../js/ui/statusMenu.js:123
msgid "System Preferences..."
msgstr "تفضيلات النظام..."
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "أوصد الشاشة"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "بدّل المستخدم"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "اخرج..."
#: ../js/ui/statusMenu.js:146
msgid "Suspend"
msgstr "علّق"
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "علّق..."
#: ../js/ui/statusMenu.js:150
msgid "Restart..."
msgstr "أعد التشغيل..."
#: ../js/ui/statusMenu.js:154
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "أطفئ..."
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "تقريب"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "قارئ الشاشة"
@ -594,13 +506,269 @@ msgstr "إعدادات الإتاحة"
msgid "High Contrast"
msgstr "تباين عال"
#: ../js/ui/status/accessibility.js:202
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "نص كبير"
#: ../js/ui/status/accessibility.js:223
msgid "Zoom"
msgstr "تقريب"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:240
msgid "Bluetooth"
msgstr "بلوتوث"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "الرؤية"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "أرسِل ملفات للجهاز..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "اضبط جهازا جديدا..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "إعدادات بلوتوث"
#: ../js/ui/status/bluetooth.js:191
msgid "Connection"
msgstr "الاتصال"
#: ../js/ui/status/bluetooth.js:227
msgid "Send Files..."
msgstr "أرسل ملفات..."
#: ../js/ui/status/bluetooth.js:232
msgid "Browse Files..."
msgstr "تصفح الملفات..."
#: ../js/ui/status/bluetooth.js:241
msgid "Error browsing device"
msgstr "عطل أثناء تصفّح الجهاز"
#: ../js/ui/status/bluetooth.js:242
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "تعذّر تصفح الجهاز، رسالة العطل '%s'"
#: ../js/ui/status/bluetooth.js:250
msgid "Keyboard Settings"
msgstr "إعدادات لوحة المفاتيح"
#: ../js/ui/status/bluetooth.js:255
msgid "Mouse Settings"
msgstr "إعدادات الفأرة"
#: ../js/ui/status/bluetooth.js:262 ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "إعدادات الصوت"
#: ../js/ui/status/bluetooth.js:336 ../js/ui/status/bluetooth.js:370
#: ../js/ui/status/bluetooth.js:410 ../js/ui/status/bluetooth.js:443
msgid "Bluetooth Agent"
msgstr "عميل بلوتوث"
#: ../js/ui/status/bluetooth.js:371
#, c-format
msgid "Authorization request from %s"
msgstr "طلب تخويل من %s"
#: ../js/ui/status/bluetooth.js:377
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "يريد الجهاز %s صلاحية الوصول للخدمة '%s'"
#: ../js/ui/status/bluetooth.js:379
msgid "Always grant access"
msgstr "امنح الصلاحية دائما"
#: ../js/ui/status/bluetooth.js:380
msgid "Grant this time only"
msgstr "امنح هذه المرة فقط"
#: ../js/ui/status/bluetooth.js:381
msgid "Reject"
msgstr "أخرج"
#: ../js/ui/status/bluetooth.js:411
#, c-format
msgid "Pairing confirmation for %s"
msgstr "تأكيد مزاوجة %s"
#: ../js/ui/status/bluetooth.js:417 ../js/ui/status/bluetooth.js:451
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "يريد الجهاز %s المزاوجة مع هذا الحاسوب"
#: ../js/ui/status/bluetooth.js:418
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "من فضلك أكد تطابق الرقم '%s' مع الموجود على الجهاز."
#: ../js/ui/status/bluetooth.js:420
msgid "Matches"
msgstr "مطابقات"
#: ../js/ui/status/bluetooth.js:421
msgid "Does not match"
msgstr "لا تتطابق"
#: ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Pairing request for %s"
msgstr "طلب مزاوجة من %s"
#: ../js/ui/status/bluetooth.js:452
msgid "Please enter the PIN mentioned on the device."
msgstr "من فضلك أدخل الرقم المذكور على الجهاز."
#: ../js/ui/status/bluetooth.js:468
msgid "OK"
msgstr "حسنا"
#: ../js/ui/status/bluetooth.js:469
msgid "Cancel"
msgstr "ألغِ"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "إعدادات الطاقة"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "بقي أقل من ساعة"
msgstr[1] "بقي ساعة"
msgstr[2] "بقي ساعتين"
msgstr[3] "بقي %d ساعات"
msgstr[4] "بقي %d ساعة"
msgstr[5] "بقي %d ساعة"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "بقي %d %s و %d %s"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "أقل من ساعة"
msgstr[1] "ساعة"
msgstr[2] "ساعتين"
msgstr[3] "ساعات"
msgstr[4] "ساعة"
msgstr[5] "ساعة"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "أقل من دقيقة"
msgstr[1] "دقيقة"
msgstr[2] "دقيقتين"
msgstr[3] "دقائق"
msgstr[4] "دقيقة"
msgstr[5] "دقيقة"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "بقي أقل من دقيقة"
msgstr[1] "بقي دقيقة"
msgstr[2] "بقي دقيقتين"
msgstr[3] "بقي %d دقائق"
msgstr[4] "بقي %d دقيقة"
msgstr[5] "بقي %d دقيقة"
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "مقبس طاقة"
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "بطارية حاسوب محمول"
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "مزود طاقة لا منقطعة"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "شاشة"
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "فأرة"
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "لوحة المفاتيح"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "مساعد رقمي"
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "هاتف محمول"
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "مشغل وسائط"
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "لوحة"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "حاسوب"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "مجهول"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "جزء"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "ميكروفون"
#: ../js/ui/telepathyClient.js:561
#, c-format
msgid "%s is online."
msgstr "%s متّصل."
#: ../js/ui/telepathyClient.js:566
#, c-format
msgid "%s is offline."
msgstr "%s غير متّصل."
#: ../js/ui/telepathyClient.js:569
#, c-format
msgid "%s is away."
msgstr "%s غائب."
#: ../js/ui/telepathyClient.js:572
#, c-format
msgid "%s is busy."
msgstr "%s مشغول."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:666
#, no-c-format
msgid "Sent at %X on %A"
msgstr "أُرسلت الساعة %l:%M:%S في %A"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "ابحث في حاسوبك"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -612,12 +780,12 @@ msgstr "انتهى %s من البدء"
msgid "'%s' is ready"
msgstr "'%s' جاهز"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "تعذّر إضافة مساحة عمل جديدة، لتجاوز أقصى عدد من مساحات العمل."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "لا يمكن حذف مساحة العمل الأولى."
@ -651,11 +819,11 @@ msgstr[5] "%u مدخل"
msgid "System Sounds"
msgstr "أصوات النظام"
#: ../src/shell-global.c:1219
#: ../src/shell-global.c:1233
msgid "Less than a minute ago"
msgstr "منذ أقل من دقيقة"
#: ../src/shell-global.c:1223
#: ../src/shell-global.c:1237
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -666,7 +834,7 @@ msgstr[3] "منذ %d دقائق"
msgstr[4] "منذ %d دقيقة"
msgstr[5] "منذ %d دقيقة"
#: ../src/shell-global.c:1228
#: ../src/shell-global.c:1242
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -677,7 +845,7 @@ msgstr[3] "منذ %d ساعات"
msgstr[4] "منذ %d ساعة"
msgstr[5] "منذ %d ساعة"
#: ../src/shell-global.c:1233
#: ../src/shell-global.c:1247
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -688,7 +856,7 @@ msgstr[3] "منذ %d أيام"
msgstr[4] "منذ %d يوما"
msgstr[5] "منذ %d يوم"
#: ../src/shell-global.c:1238
#: ../src/shell-global.c:1252
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -699,17 +867,17 @@ msgstr[3] "منذ %d أسابيع"
msgstr[4] "منذ %d أسبوعا"
msgstr[5] "منذ %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 "ابحث"
@ -718,20 +886,68 @@ msgstr "ابحث"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Clock"
#~ msgstr "الساعة"
#~ msgid "Customize the panel clock"
#~ msgstr "طوّع ساعة اللوحة"
#~ msgid "Clock Format"
#~ msgstr "تنسيق الساعة"
#~ msgid "Clock Preferences"
#~ msgstr "تفضيلات الساعة"
#~ msgid "Panel Display"
#~ msgstr "عرض اللوحة"
#~ msgid "Show seco_nds"
#~ msgstr "أظهر ال_ثواني"
#~ msgid "Show the _date"
#~ msgstr "أظهر ال_تاريخ"
#~ msgid "_12 hour format"
#~ msgstr "نسق _12 ساعة"
#~ msgid "_24 hour format"
#~ msgstr "نسق _24 ساعة"
#~ msgid "Drag here to add favorites"
#~ msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
#~ msgid "Find"
#~ msgstr "ابحث"
#~ msgid "Searching..."
#~ msgstr "يبحث..."
#~ msgid "No matching results."
#~ msgstr "لا نتائج مطابقة."
#~ msgid "Preferences"
#~ msgstr "التفضيلات"
#~ msgid "Invisible"
#~ msgstr "خفي"
#~ msgid "System Preferences..."
#~ msgstr "تفضيلات النظام..."
#~ msgid "Restart..."
#~ msgstr "أعد التشغيل..."
#~ msgid "Account Information..."
#~ msgstr "معلومات الحساب..."
#~ msgid "%H:%M"
#~ msgstr "%OH:%OM"
#~ msgid "Applications"
#~ msgstr "التطبيقات"
#~ msgid "Recent Documents"
#~ msgstr "المستندات الحديثة"
@ -750,9 +966,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "نتائج البحث"
#~ msgid "Unknown"
#~ msgstr "مجهول"
#~ msgid "Can't lock screen: %s"
#~ msgstr "تعذّر إيصاد الشاشة: %s"

567
po/de.po
View File

@ -6,19 +6,21 @@
#
# Hendrik Brandt <heb@gnome-de.org>, 2009.
# Hendrik Richter <hendrikr@gnome.org>, 2009.
# Mario Blättermann <mariobl@gnome.org>, 2009, 2010.
# Mario Blättermann <mariobl@gnome.org>, 2009, 2010, 2011.
# Mario Klug <mario@klug.me>, 2010.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2010.
# Jakob Kramer <jakob.kramer@gmx.de>, 2010.
# Paul Seyfert <pseyfert@mathphys.fsk.uni-heidelberg.de>, 2010.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-10-10 03:14+0000\n"
"PO-Revision-Date: 2010-10-10 20:23+0200\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-01-01 23:21+0100\n"
"PO-Revision-Date: 2011-01-01 16:25+0100\n"
"Last-Translator: Christian Kirbach <Christian.Kirbach@googlemail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@ -105,12 +107,8 @@ msgstr ""
msgid "List of desktop file IDs for favorite applications"
msgstr "Liste der Kennungen der Desktop-Dateien für bevorzugte Anwendungen"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "Modus des Arbeitsflächen-Überblicks"
# Hier blicke ich überhaupt nicht durch.
#: ../data/org.gnome.shell.gschema.xml.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -130,22 +128,22 @@ msgstr ""
"Das kann zum Senden der Ausgabe über shout2send an einen Icecast-Server oder "
"Ähnliches verwendet werden. Falls nicht (oder auf einen leeren Wert) "
"gesetzt, so wird die vorgegebene Weiterleitung verwendet, welche derzeit "
"»videorate ! theoraenc ! oggmux« lautet und die Aufnahme im Ogg-Theora-Format "
"speichert."
"»videorate ! theoraenc ! oggmux« lautet und die Aufnahme im Ogg-Theora-"
"Format speichert."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "Datum in der Uhr anzeigen"
#: ../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 "Wochentag im Kalender anzeigen"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "Zeit sekundengenau anzeigen"
#: ../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."
@ -153,7 +151,7 @@ msgstr ""
"Programme, welche auf diese Bezeichner zutreffen, werden im Favoriten-"
"Bereich angezeigt."
#: ../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 "
@ -164,7 +162,7 @@ msgstr ""
"Dateiname sollte geändert werden, wenn Sie in einem anderen Containerformat "
"aufnehmen."
#: ../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."
@ -173,19 +171,11 @@ msgstr ""
"der GNOME-Shell aufgezeichnet werden soll, in Einzelbildern pro Sekunde."
# hmm Enkodieren oder Kodieren?
#: ../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 "Die GStreamer-Weiterleitung zur Enkodierung des Screencasts"
#: ../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 ""
"Die gewählte Ansicht des Arbeitsflächen-Überblicks. Mögliche Werte sind "
"»single« (einfach) und »grid« (Raster)."
#: ../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 "
@ -198,7 +188,7 @@ msgstr ""
"deaktivieren, um Ihre Privatsphäre zu schützen. Bitte beachten Sie, dass "
"bereits gespeicherte Daten hiervon nicht beeinflusst werden."
#: ../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"
@ -211,7 +201,7 @@ msgstr ""
"Format zu erhalten. Weitere Informationen finden Sie in der Handbuchseite zu "
"strftime()."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -221,18 +211,18 @@ msgid ""
"the show_date and show_seconds keys are ignored."
msgstr ""
"Dieser Schlüssel legt das Stundenformat für die Anzeige der Panel-Uhr fest. "
"Mögliche Werte sind »12-hour«, »24-hour«, »unix« und »custom«. Wenn Sie »unix« "
"verwenden, zeigt die Uhr die Sekunden seit Epoch, dem Beginn der Unix-"
"Mögliche Werte sind »12-hour«, »24-hour«, »unix« und »custom«. Wenn Sie "
"»unix« verwenden, zeigt die Uhr die Sekunden seit Epoch, dem Beginn der Unix-"
"Zeitrechnung am 1. Januar 1970 an. Wenn Sie »custom« (benutzerdefiniert) "
"verwenden, zeigt die Uhr die Zeit gemäß dem im Schlüssel »custom_format« "
"angegebenen Format an. Beachten Sie, dass bei »unix« oder »custom« die "
"Schlüssel »show_date« und »show_seconds« ignoriert werden."
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "UUIDs der zu deaktivierenden Erweiterungen"
#: ../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 "Legt fest, ob der Status der Anwendungsnutzung erfasst werden soll"
@ -266,14 +256,14 @@ msgid ""
msgstr ""
"Legt die Position des vergrößerten Bildes der Maus innerhalb der "
"vergrößerten Ansicht fest, und wie die Maus auf die Mausbewegungen des "
"Systems reagiert. Folgende Werte sind möglich: »none« - keine Mausverfolgung; "
"»centered« - das Mausbild wird in der Mitte des vergrößerten Bereiches "
"dargestellt (welche auch den Zeiger der Systemmaus darstellt), wobei der "
"vergrößerte Inhalt gerollt wird, sobald die Systemmaus bewegt wird; "
"»proportional« - die Position der vergrößerten Maus im vergrößerten Bereich "
"ist proportional zur Position der Systemmaus auf dem Bildschirm; »push« - "
"wenn die vergrößerte Maus einen der Ränder des vergrößerten Bereichs "
"berührt, wird der entsprechende Inhalt in die Ansicht geschoben."
"Systems reagiert. Folgende Werte sind möglich: »none« - keine "
"Mausverfolgung; »centered« - das Mausbild wird in der Mitte des vergrößerten "
"Bereiches dargestellt (welche auch den Zeiger der Systemmaus darstellt), "
"wobei der vergrößerte Inhalt gerollt wird, sobald die Systemmaus bewegt "
"wird; »proportional« - die Position der vergrößerten Maus im vergrößerten "
"Bereich ist proportional zur Position der Systemmaus auf dem Bildschirm; "
"»push« - wenn die vergrößerte Maus einen der Ränder des vergrößerten "
"Bereichs berührt, wird der entsprechende Inhalt in die Ansicht geschoben."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
msgid ""
@ -422,62 +412,46 @@ msgstr "_12-Stunden-Format"
msgid "_24 hour format"
msgstr "_24-Stunden-Format"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "Alle"
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "ANWENDUNGEN"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "EINSTELLUNGEN"
#: ../js/ui/appDisplay.js:648
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "Neues Fenster"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: ../js/ui/appDisplay.js:653
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: ../js/ui/appDisplay.js:830
msgid "Drag here to add favorites"
msgstr "Hier ablegen, um zu Favoriten hinzuzufügen"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s wurde zu Ihren Favoriten hinzugefügt"
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s wurde aus Ihren Favoriten entfernt"
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "Suchen"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "Entfernen"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "Suche läuft …"
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "Keine passenden Ergebnisse."
#. **** 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 "ORTE UND GERÄTE"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "ZULETZT GEÖFFNETE DOKUMENTE"
@ -489,7 +463,9 @@ msgstr "Keine Erweiterungen installiert"
msgid "Enabled"
msgstr "Aktiviert"
#: ../js/ui/lookingGlass.js:591
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Deaktiviert"
@ -509,63 +485,71 @@ msgstr "Quelle zeigen"
msgid "Web Page"
msgstr "Webseite"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "Rückgängig"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "Fenster"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "Anwendungen"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:468
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "%s beenden"
#: ../js/ui/panel.js:493
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "Einstellungen"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:579
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%a, %e. %b, %R:%S"
#: ../js/ui/panel.js:580
#: ../js/ui/panel.js:586
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:584
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:592
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a, %e. %b, %H:%M:%S"
#: ../js/ui/panel.js:593
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%a, %e. %b, %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:597
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:604
msgid "%a %l:%M %p"
msgstr "%a %H:%M"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:743
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "Aktivitäten"
@ -582,6 +566,10 @@ msgstr "Erneut versuchen"
msgid "Connect to..."
msgstr "Verbinden mit …"
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "ORTE UND GERÄTE"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -600,42 +588,332 @@ msgstr "Bitte geben Sie einen Befehl ein:"
msgid "Execution of '%s' failed:"
msgstr "Ausführung von »%s« ist gescheitert:"
#: ../js/ui/statusMenu.js:91
#: ../js/ui/statusMenu.js:101
msgid "Available"
msgstr "Verfügbar"
#: ../js/ui/statusMenu.js:95
#: ../js/ui/statusMenu.js:106
msgid "Busy"
msgstr "Beschäftigt"
#: ../js/ui/statusMenu.js:99
msgid "Invisible"
msgstr "Unsichtbar"
#: ../js/ui/statusMenu.js:114
msgid "My Account"
msgstr "Eigenes Konto"
#: ../js/ui/statusMenu.js:106
msgid "Account Information..."
msgstr "Benutzerinformationen …"
#: ../js/ui/statusMenu.js:118
msgid "System Settings"
msgstr "Systemeinstellungen"
#: ../js/ui/statusMenu.js:110
msgid "System Settings..."
msgstr "Systemeinstellungen …"
#: ../js/ui/statusMenu.js:117
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
msgstr "Bildschirm sperren"
#: ../js/ui/statusMenu.js:121
#: ../js/ui/statusMenu.js:129
msgid "Switch User"
msgstr "Benutzer wechseln"
#: ../js/ui/statusMenu.js:126
#: ../js/ui/statusMenu.js:134
msgid "Log Out..."
msgstr "Abmelden …"
#: ../js/ui/statusMenu.js:130
#: ../js/ui/statusMenu.js:141
msgid "Suspend..."
msgstr "Bereitschaft …"
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "Ausschalten …"
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "Vergrößern"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "Bildschirmleser"
#: ../js/ui/status/accessibility.js:91
msgid "Screen Keyboard"
msgstr "Bildschirmtastatur"
#: ../js/ui/status/accessibility.js:94
msgid "Visual Alerts"
msgstr "Visuelle Warnungen"
#: ../js/ui/status/accessibility.js:97
msgid "Sticky Keys"
msgstr "Klebrige Tasten"
#: ../js/ui/status/accessibility.js:100
msgid "Slow Keys"
msgstr "Tastenverzögerung"
#: ../js/ui/status/accessibility.js:103
msgid "Bounce Keys"
msgstr "Springende Tasten"
#: ../js/ui/status/accessibility.js:106
msgid "Mouse Keys"
msgstr "Maustasten"
#: ../js/ui/status/accessibility.js:110
msgid "Universal Access Settings"
msgstr "Einstellungen zur Barrierefreiheit"
#: ../js/ui/status/accessibility.js:163
msgid "High Contrast"
msgstr "Hoher Kontrast"
#: ../js/ui/status/accessibility.js:205
msgid "Large Text"
msgstr "Große Schrift"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:234
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Sichtbarkeit"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "Dateien an Gerät senden …"
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "Ein neues Gerät einrichten …"
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "Bluetooth-Einstellungen"
#: ../js/ui/status/bluetooth.js:185
msgid "Connection"
msgstr "Verbindung"
#: ../js/ui/status/bluetooth.js:221
msgid "Send Files..."
msgstr "Dateien senden …"
#: ../js/ui/status/bluetooth.js:226
msgid "Browse Files..."
msgstr "Dateien durchsuchen …"
#: ../js/ui/status/bluetooth.js:235
msgid "Error browsing device"
msgstr "Fehler beim Durchsuchen des Geräts"
#: ../js/ui/status/bluetooth.js:236
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr ""
"Das angesprochene Gerät kann nicht durchsucht werden. Der Fehler lautet »%s«"
#: ../js/ui/status/bluetooth.js:244
msgid "Keyboard Settings"
msgstr "Tastatureinstellungen"
#: ../js/ui/status/bluetooth.js:249
msgid "Mouse Settings"
msgstr "Maus-Einstellungen"
#: ../js/ui/status/bluetooth.js:256 ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Klangeinstellungen"
#: ../js/ui/status/bluetooth.js:327 ../js/ui/status/bluetooth.js:361
#: ../js/ui/status/bluetooth.js:401 ../js/ui/status/bluetooth.js:434
msgid "Bluetooth Agent"
msgstr "Bluetooth-Agent"
#: ../js/ui/status/bluetooth.js:362
#, c-format
msgid "Authorization request from %s"
msgstr "Legitimierungsanfrage von %s"
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Gerät »%s« bittet um Zugriff auf den Dienst »%s«"
#: ../js/ui/status/bluetooth.js:370
msgid "Always grant access"
msgstr "Immer Zugriff gewähren"
#: ../js/ui/status/bluetooth.js:371
msgid "Grant this time only"
msgstr "Nur dieses Mal gewähren"
#: ../js/ui/status/bluetooth.js:372
msgid "Reject"
msgstr "Abweisen"
#: ../js/ui/status/bluetooth.js:402
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Koppelungsbestätigung für %s"
#: ../js/ui/status/bluetooth.js:408 ../js/ui/status/bluetooth.js:442
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Gerät »%s« möchte mit diesem Rechner gekoppelt werden"
#: ../js/ui/status/bluetooth.js:409
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr ""
"Bitte bestätigen Sie, ob die PIN »%s« mit der des Gerätes übereinstimmt."
#: ../js/ui/status/bluetooth.js:411
msgid "Matches"
msgstr "Stimmt überein"
#: ../js/ui/status/bluetooth.js:412
msgid "Does not match"
msgstr "Stimmt nicht überein"
#: ../js/ui/status/bluetooth.js:435
#, c-format
msgid "Pairing request for %s"
msgstr "Koppelungsanfrage für %s"
#: ../js/ui/status/bluetooth.js:443
msgid "Please enter the PIN mentioned on the device."
msgstr "Bitte geben Sie die auf dem Gerät angezeigte PIN ein."
#: ../js/ui/status/bluetooth.js:459
msgid "OK"
msgstr "OK"
#: ../js/ui/status/bluetooth.js:460
msgid "Cancel"
msgstr "Abbrechen"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Energieeinstellungen"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "%d Stunde verbleibend"
msgstr[1] "%d Stunden verbleibend"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s verbleibend"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "Stunde"
msgstr[1] "Stunden"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "Minute"
msgstr[1] "Minuten"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d Minute verbleibend"
msgstr[1] "%d Minuten verbleibend"
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "Netzteil"
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "Laptop-Akku"
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "Notstromversorgung"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "Bildschirm"
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "Maus"
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "Medienwiedergabegerät"
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "Rechner"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Unbekannt"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "Lautstärke"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s ist angemeldet."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s ist abgemeldet."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "»%s« ist abwesend."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s ist beschäftigt."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:665
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Gesendet am %A um %X "
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Ihren Rechner durchsuchen"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
@ -646,60 +924,82 @@ msgstr "Start von %s ist abgeschlossen"
msgid "'%s' is ready"
msgstr "»%s« ist bereit"
#: ../js/ui/workspacesView.js:230
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr ""
"Es kann keine weitere Arbeitsfläche hinzugefügt werden, weil das Maximum an "
"Arbeitsflächen erreicht worden ist."
#: ../js/ui/workspacesView.js:247
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "Die erste Arbeitsfläche kann nicht entfernt werden."
#: ../src/shell-global.c:1196
#. translators:
#. * The number of sound outputs on a particular device
#: ../src/gvc/gvc-mixer-control.c:1094
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] "%u Ausgang"
msgstr[1] "%u Ausgänge"
#. 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 Eingang"
msgstr[1] "%u Eingänge"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr "Systemklänge"
#: ../src/shell-global.c:1156
msgid "Less than a minute ago"
msgstr "Vor weniger als einer Minute"
#: ../src/shell-global.c:1200
#: ../src/shell-global.c:1160
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Vor %d Minute"
msgstr[1] "Vor %d Minuten"
#: ../src/shell-global.c:1205
#: ../src/shell-global.c:1165
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Vor %d Stunde"
msgstr[1] "Vor %d Stunden"
#: ../src/shell-global.c:1210
#: ../src/shell-global.c:1170
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Vor %d Tag"
msgstr[1] "Vor %d Tagen"
#: ../src/shell-global.c:1215
#: ../src/shell-global.c:1175
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] "Vor %d Woche"
msgstr[1] "Vor %d Wochen"
#: ../src/shell-uri-util.c:89
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr "Persönlicher Ordner"
#. 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 "Dateisystem"
#: ../src/shell-uri-util.c:250
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Suchen"
@ -708,11 +1008,42 @@ msgstr "Suchen"
#. * example, "Trash: some-directory". It means that the
#. * directory called "some-directory" is in the trash.
#.
#: ../src/shell-uri-util.c:300
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "What's using power..."
#~ msgstr "Energieverbraucher …"
#~ msgid "Overview workspace view mode"
#~ msgstr "Modus des Arbeitsflächen-Überblicks"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "Die gewählte Ansicht des Arbeitsflächen-Überblicks. Mögliche Werte sind "
#~ "»single« (einfach) und »grid« (Raster)."
#~ msgid "Drag here to add favorites"
#~ msgstr "Hier ablegen, um zu Favoriten hinzuzufügen"
#~ msgid "Find"
#~ msgstr "Suchen"
#~ msgid "Searching..."
#~ msgstr "Suche läuft …"
#~ msgid "No matching results."
#~ msgstr "Keine passenden Ergebnisse."
#~ msgid "Invisible"
#~ msgstr "Unsichtbar"
#~ msgid "Account Information..."
#~ msgstr "Benutzerinformationen …"
#~ msgid "ON"
#~ msgstr "EIN"
@ -725,9 +1056,6 @@ msgstr "%1$s: %2$s"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Applications"
#~ msgstr "Anwendungen"
#~ msgid "Recent Documents"
#~ msgstr "Zuletzt geöffnete Dokumente"
@ -746,9 +1074,6 @@ msgstr "%1$s: %2$s"
#~ msgid "SEARCH RESULTS"
#~ msgstr "SUCHERGEBNISSE"
#~ msgid "Unknown"
#~ msgstr "Unbekannt"
#~ msgid "Can't lock screen: %s"
#~ msgstr "Bildschirm kann nicht gesperrt werden: %s"

915
po/el.po

File diff suppressed because it is too large Load Diff

583
po/es.po
View File

@ -2,15 +2,16 @@
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-12-18 19:25+0000\n"
"PO-Revision-Date: 2010-12-19 13:12+0100\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"POT-Creation-Date: 2011-01-15 00:23+0000\n"
"PO-Revision-Date: 2011-01-16 13:26+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -25,14 +26,6 @@ msgstr "GNOME Shell"
msgid "Window management and application launching"
msgstr "Gestión de ventanas e inicio de aplicaciones"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
msgstr "Reloj"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "Personalizar el reloj del panel"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
@ -42,24 +35,20 @@ msgstr ""
"usando el diálogo Alt+F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "Formato personalizado del reloj"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Activar las herramientas internas, útiles para desarrolladores y probadores, "
"desde Alt+F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr "Extensión de archivo que usar para almacenar los «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Tasa de fotogramas usada para grabar «screencast»."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
@ -67,39 +56,27 @@ msgstr ""
"Las extensiones de GNOME Shell tienen una propiedad uuid; esta clave lista "
"las extensiones que no se deben cargar."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog"
msgstr "Histórico del diálogo de comandos (Alt+F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "If true, display date in the clock, in addition to time."
msgstr "Si es cierta, muestra la fecha en el reloj, además de la hora."
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "Formato de la hora"
msgid "If true, display seconds in time."
msgstr "Si es cierta, muestra los segundos en la hora."
#: ../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 ""
"Si es cierta y el formato es «12-horas» o «24-horas», muestra la fecha en el "
"reloj, además de la hora."
#: ../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 ""
"Si es cierta y el formato es «12-horas» o «24-horas», muestra los segundos "
"en la hora."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "Si es cierta muestra la fecha de semana ISO en el calendario."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "List of desktop file IDs for favorite applications"
msgstr "Lista de ID de archivos de escritorio para las aplicaciones favoritas"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -121,19 +98,19 @@ msgstr ""
"predeterminada. Actualmente es «videorate ! theoraenc ! oggmux» y greba en "
"Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show date in clock"
msgstr "Mostrar la fecha en el reloj"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Show the week date in the calendar"
msgstr "Mostrar la fecha de la semana en el calendario"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Mostrar la hora con segundos"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -141,7 +118,7 @@ msgstr ""
"Las aplicaciones correspondientes con esos identificadores se mostrarán en "
"el área de favoritos."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:16
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 "
@ -151,7 +128,7 @@ msgstr ""
"basado en la fecha actual y usará esta extensión. Se debería cambiar al "
"grabar en otro formato contenedor diferente."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -159,11 +136,11 @@ msgstr ""
"La tasa de fotogramas de la grabación resultante grabada por el grabador de "
"«screencast» de GNOME Shell, en fotogramas por segundo."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La tubería de gstreamer usada para codificar el «screencast»"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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 "
@ -175,41 +152,11 @@ msgstr ""
"mantienen de forma privada, puede querer desactivarlo por razones de "
"privacidad. Note que haciéndolo no eliminará los datos ya guardados."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"Esta clave especifica el formato usado por el reloj del panel cuando la "
"clave del formato se establece a «custom» (personalizado). Puede usar "
"especificadores de conversión que entienda strftime() para obtener un "
"formato específico. Consulte el manual de strftime() para obtener más "
"información."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"Esta clave especifica el formato de la hora especificado por el reloj del "
"panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 horas), "
"«unix» y «custom» (personalizado).Si se establece a «unix» el reloj mostrará "
"la hora en segundos desde la época (1 de enero de 1970). Si se establece a "
"«custom» el reloj mostrará la hora según el formato especificado en la clave "
"«custom_format». Note que si se establece a «unix» o «custom» se ignoran las "
"claves «show_date» y «show_seconds»."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Uuids of extensions to disable"
msgstr "Uuid de las extensiones que desactivar"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "Whether to collect stats about applications usage"
msgstr ""
"Indica si se deben recolectar estadísticas acerca del uso de las aplicaciones"
@ -371,55 +318,45 @@ msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
"Anchura de las líneas verticales y horizontales que conforman las cruces."
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "Formato del reloj"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:108
#| msgid "Please enter a command:"
msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "Preferencias del reloj"
#: ../js/misc/util.js:130
#| msgid "Applications"
msgid "No such application"
msgstr "No existe la aplicación"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "Panel de visualización"
#: ../js/misc/util.js:143 ../js/ui/runDialog.js:364
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "Mostrar los segu_ndos"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "Mostrar la _fecha"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "Formato _12 horas"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "Formato _24 horas"
#: ../js/ui/appDisplay.js:154
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:235
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:265
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "PREFERENCIAS"
#: ../js/ui/appDisplay.js:562
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:566
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:567
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -437,122 +374,199 @@ msgstr "Se ha quitado %s de sus favoritos."
msgid "Remove"
msgstr "Quitar"
#: ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:18
msgid "RECENT ITEMS"
msgstr "ELEMENTOS RECIENTES"
#: ../js/ui/lookingGlass.js:552
#: ../js/ui/endSessionDialog.js:63
#, c-format
#| msgid "Log Out..."
msgid "Log Out %s"
msgstr "Cerrar la sesión %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
#| msgid "Log Out..."
msgid "Log Out"
msgstr "Cerrar la sesión"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
"Pulse «Cerrar la sesión» para salir de esas aplicaciones y cerrar la sesión "
"del sistema."
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr "La sesión de %s se cerrará automáticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:67
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr "Su sesión se cerrará automáticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system."
msgstr "Cerrando la sesión."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
#| msgid "Shut Down..."
msgid "Shut Down"
msgstr "Apagar"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "Pulse «Apagar» para salir de esas aplicaciones y apagar el sistema."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "El sistema se apagará automáticamente en %d segundo."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "Apagando el sistema."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
#| msgid "Restart..."
msgid "Restart"
msgstr "Reiniciar"
#: ../js/ui/endSessionDialog.js:85
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Pulse «Reiniciar» para salir de esas aplicaciones y reiniciar el sistema."
#: ../js/ui/endSessionDialog.js:86
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "El sistema se reiniciará automáticamente en %d segundos."
#: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system."
msgstr "Reiniciando el sistema."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Confirmar"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:469
msgid "Cancel"
msgstr "Cancelar"
#: ../js/ui/lookingGlass.js:556
msgid "No extensions installed"
msgstr "No hay extensiones instaladas"
#: ../js/ui/lookingGlass.js:589
#: ../js/ui/lookingGlass.js:593
msgid "Enabled"
msgstr "Activado"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:595 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:593
#: ../js/ui/lookingGlass.js:597
msgid "Error"
msgstr "Error"
#: ../js/ui/lookingGlass.js:595
#: ../js/ui/lookingGlass.js:599
msgid "Out of date"
msgstr "Caducado"
#: ../js/ui/lookingGlass.js:620
#: ../js/ui/lookingGlass.js:624
msgid "View Source"
msgstr "Ver fuente"
#: ../js/ui/lookingGlass.js:626
#: ../js/ui/lookingGlass.js:630
msgid "Web Page"
msgstr "Página web"
#: ../js/ui/overview.js:96
#: ../js/ui/messageTray.js:1748
#| msgid "Account Information..."
msgid "System Information"
msgstr "Información del sistema"
#: ../js/ui/overview.js:75
msgid "Undo"
msgstr "Deshacer"
#: ../js/ui/overview.js:158
#: ../js/ui/overview.js:140
msgid "Windows"
msgstr "Ventanas"
#: ../js/ui/overview.js:161
#: ../js/ui/overview.js:143
msgid "Applications"
msgstr "Aplicaciones"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:474
#: ../js/ui/panel.js:479
#, c-format
msgid "Quit %s"
msgstr "Salir de %s"
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "Preferencias"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:564
msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:565
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:590
#: ../js/ui/panel.js:569
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:591
#: ../js/ui/panel.js:570
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:577
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %H:%M:%S"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:578
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:603
#: ../js/ui/panel.js:582
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/panel.js:604
#: ../js/ui/panel.js:583
msgid "%a %l:%M %p"
msgstr "%a %H:%M"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:749
#: ../js/ui/panel.js:728
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/placeDisplay.js:111
#: ../js/ui/placeDisplay.js:112
#, c-format
msgid "Failed to unmount '%s'"
msgstr "Falló al desmontar «%s»"
#: ../js/ui/placeDisplay.js:114
#: ../js/ui/placeDisplay.js:115
msgid "Retry"
msgstr "Reintentar"
#: ../js/ui/placeDisplay.js:159
#: ../js/ui/placeDisplay.js:160
msgid "Connect to..."
msgstr "Conectar a…"
#: ../js/ui/placeDisplay.js:558
#: ../js/ui/placeDisplay.js:559
msgid "PLACES & DEVICES"
msgstr "LUGARES Y DISPOSITIVOS"
@ -565,84 +579,79 @@ msgstr "LUGARES Y DISPOSITIVOS"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
#: ../js/ui/runDialog.js:222
msgid "Please enter a command:"
msgstr "Introduzca un comando:"
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:"
#: ../js/ui/statusMenu.js:101
#: ../js/ui/statusMenu.js:102
msgid "Available"
msgstr "Disponible"
#: ../js/ui/statusMenu.js:106
#: ../js/ui/statusMenu.js:107
msgid "Busy"
msgstr "Ocupado"
#: ../js/ui/statusMenu.js:114
#: ../js/ui/statusMenu.js:115
msgid "My Account"
msgstr "Mi cuenta"
#: ../js/ui/statusMenu.js:118
#: ../js/ui/statusMenu.js:119
msgid "System Settings"
msgstr "Configuración del sistema"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:126
msgid "Lock Screen"
msgstr "Bloquear la pantalla"
#: ../js/ui/statusMenu.js:129
#: ../js/ui/statusMenu.js:130
msgid "Switch User"
msgstr "Cambiar de usuario"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:135
msgid "Log Out..."
msgstr "Salir…"
msgstr "Cerrar la sesión…"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Suspend..."
msgstr "Suspender…"
#: ../js/ui/statusMenu.js:145
#: ../js/ui/statusMenu.js:146
msgid "Shut Down..."
msgstr "Apagar…"
#: ../js/ui/status/accessibility.js:82
#: ../js/ui/status/accessibility.js:83
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:89
msgid "Screen Reader"
msgstr "Lector de pantalla"
#: ../js/ui/status/accessibility.js:91
#: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard"
msgstr "Teclado en pantalla"
#: ../js/ui/status/accessibility.js:94
#: ../js/ui/status/accessibility.js:95
msgid "Visual Alerts"
msgstr "Alertas visuales"
#: ../js/ui/status/accessibility.js:97
#: ../js/ui/status/accessibility.js:98
msgid "Sticky Keys"
msgstr "Teclas persistentes"
#: ../js/ui/status/accessibility.js:100
#: ../js/ui/status/accessibility.js:101
msgid "Slow Keys"
msgstr "Teclas lentas"
#: ../js/ui/status/accessibility.js:103
#: ../js/ui/status/accessibility.js:104
msgid "Bounce Keys"
msgstr "Rechazo de teclas"
#: ../js/ui/status/accessibility.js:106
#: ../js/ui/status/accessibility.js:107
msgid "Mouse Keys"
msgstr "Teclas del ratón"
#: ../js/ui/status/accessibility.js:110
#: ../js/ui/status/accessibility.js:111
msgid "Universal Access Settings"
msgstr "Preferencias del acceso universal"
@ -654,6 +663,122 @@ msgstr "Contraste alto"
msgid "Large Text"
msgstr "<b>Texto:</b>"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:240
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Visibilidad"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "Enviar archivos al dispositivo…"
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "Configurar un dispositivo nuevo…"
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "Configuración de Bluetooth"
#: ../js/ui/status/bluetooth.js:191
msgid "Connection"
msgstr "Conexión"
#: ../js/ui/status/bluetooth.js:227
msgid "Send Files..."
msgstr "Enviar archivos…"
#: ../js/ui/status/bluetooth.js:232
msgid "Browse Files..."
msgstr "Examinar archivos…"
#: ../js/ui/status/bluetooth.js:241
msgid "Error browsing device"
msgstr "Error al examinar el dispositivo"
#: ../js/ui/status/bluetooth.js:242
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "No se puede examinar el dispositivo solicitado, el error es «%s»"
#: ../js/ui/status/bluetooth.js:250 ../js/ui/status/keyboard.js:78
msgid "Keyboard Settings"
msgstr "Configuración del teclado"
#: ../js/ui/status/bluetooth.js:255
msgid "Mouse Settings"
msgstr "Ajustes del ratón…"
#: ../js/ui/status/bluetooth.js:262 ../js/ui/status/volume.js:63
msgid "Sound Settings"
msgstr "Configuración del sonido"
#: ../js/ui/status/bluetooth.js:336 ../js/ui/status/bluetooth.js:370
#: ../js/ui/status/bluetooth.js:410 ../js/ui/status/bluetooth.js:443
msgid "Bluetooth Agent"
msgstr "Agente Bluetooth"
#: ../js/ui/status/bluetooth.js:371
#, c-format
msgid "Authorization request from %s"
msgstr "Solicitud de autorización de %s"
#: ../js/ui/status/bluetooth.js:377
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "El dispositivo %s quiere acceder al servicio «%s»"
#: ../js/ui/status/bluetooth.js:379
msgid "Always grant access"
msgstr "Conceder acceso siempre"
#: ../js/ui/status/bluetooth.js:380
msgid "Grant this time only"
msgstr "Conceder sólo esta vez"
#: ../js/ui/status/bluetooth.js:381
msgid "Reject"
msgstr "Rechazar"
#: ../js/ui/status/bluetooth.js:411
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Confirmación de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:417 ../js/ui/status/bluetooth.js:451
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "El dispositivo «%s» quiere emparejarse con este equipo"
#: ../js/ui/status/bluetooth.js:418
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confirme que el PIN mostrado en «%s» coincide con el del dispositivo."
#: ../js/ui/status/bluetooth.js:420
msgid "Matches"
msgstr "Coincide"
#: ../js/ui/status/bluetooth.js:421
msgid "Does not match"
msgstr "No coincide"
#: ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Pairing request for %s"
msgstr "Solicitud de emparejamiento para «%s»"
#: ../js/ui/status/bluetooth.js:452
msgid "Please enter the PIN mentioned on the device."
msgstr "Introduzca el PIN mencionado en el dispositivo."
#: ../js/ui/status/bluetooth.js:468
msgid "OK"
msgstr "Aceptar"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Configuración de energía"
@ -690,82 +815,78 @@ msgid_plural "%d minutes remaining"
msgstr[0] "Queda %d minuto"
msgstr[1] "Queda %d minutos"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:235
msgid "AC adapter"
msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:237
msgid "Laptop battery"
msgstr "Batería del portátil"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:239
msgid "UPS"
msgstr "SAI"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:241
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:243
msgid "Mouse"
msgstr "Ratón"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:245
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:247
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:249
msgid "Cell phone"
msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:251
msgid "Media player"
msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:253
msgid "Tablet"
msgstr "Tableta"
#: ../js/ui/status/power.js:257
#: ../js/ui/status/power.js:255
msgid "Computer"
msgstr "Equipo"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Desconocido"
#: ../js/ui/status/volume.js:41
#: ../js/ui/status/volume.js:42
msgid "Volume"
msgstr "Volumen"
#: ../js/ui/status/volume.js:54
#: ../js/ui/status/volume.js:55
msgid "Microphone"
msgstr "Micrófono"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Configuración del sonido"
#: ../js/ui/telepathyClient.js:560
#: ../js/ui/telepathyClient.js:561
#, c-format
msgid "%s is online."
msgstr "%s está conectado/a."
#: ../js/ui/telepathyClient.js:565
#: ../js/ui/telepathyClient.js:566
#, c-format
msgid "%s is offline."
msgstr "%s está desconectado/a."
#: ../js/ui/telepathyClient.js:568
#: ../js/ui/telepathyClient.js:569
#, c-format
msgid "%s is away."
msgstr "%s está ausente."
#: ../js/ui/telepathyClient.js:571
#: ../js/ui/telepathyClient.js:572
#, c-format
msgid "%s is busy."
msgstr "%s está ocupado/a."
@ -773,7 +894,7 @@ msgstr "%s está ocupado/a."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#: ../js/ui/telepathyClient.js:666
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Enviado a las %X el %A"
@ -825,32 +946,32 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
msgstr "Sonidos del sistema"
#: ../src/shell-global.c:1155
#: ../src/shell-global.c:1233
msgid "Less than a minute ago"
msgstr "Hace menos de un minuto"
#: ../src/shell-global.c:1159
#: ../src/shell-global.c:1237
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos"
#: ../src/shell-global.c:1164
#: ../src/shell-global.c:1242
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: ../src/shell-global.c:1169
#: ../src/shell-global.c:1247
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días"
#: ../src/shell-global.c:1174
#: ../src/shell-global.c:1252
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -881,6 +1002,78 @@ msgstr "Buscar"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Clock"
#~ msgstr "Reloj"
#~ msgid "Customize the panel clock"
#~ msgstr "Personalizar el reloj del panel"
#~ msgid "Custom format of the clock"
#~ msgstr "Formato personalizado del reloj"
#~ msgid "Hour format"
#~ msgstr "Formato de la hora"
#~ msgid ""
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time."
#~ msgstr ""
#~ "Si es cierta y el formato es «12-horas» o «24-horas», muestra los "
#~ "segundos en la hora."
#~ 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 ""
#~ "Esta clave especifica el formato usado por el reloj del panel cuando la "
#~ "clave del formato se establece a «custom» (personalizado). Puede usar "
#~ "especificadores de conversión que entienda strftime() para obtener un "
#~ "formato específico. Consulte el manual de strftime() para obtener más "
#~ "información."
#~ 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 ""
#~ "Esta clave especifica el formato de la hora especificado por el reloj del "
#~ "panel. Los valores posibles son «12-hour» (12 horas), «24-hour» (24 "
#~ "horas), «unix» y «custom» (personalizado).Si se establece a «unix» el "
#~ "reloj mostrará la hora en segundos desde la época (1 de enero de 1970). "
#~ "Si se establece a «custom» el reloj mostrará la hora según el formato "
#~ "especificado en la clave «custom_format». Note que si se establece a "
#~ "«unix» o «custom» se ignoran las claves «show_date» y «show_seconds»."
#~ msgid "Clock Format"
#~ msgstr "Formato del reloj"
#~ msgid "Clock Preferences"
#~ msgstr "Preferencias del reloj"
#~ msgid "Panel Display"
#~ msgstr "Panel de visualización"
#~ msgid "Show seco_nds"
#~ msgstr "Mostrar los segu_ndos"
#~ msgid "Show the _date"
#~ msgstr "Mostrar la _fecha"
#~ msgid "_12 hour format"
#~ msgstr "Formato _12 horas"
#~ msgid "_24 hour format"
#~ msgstr "Formato _24 horas"
#~ msgid "Preferences"
#~ msgstr "Preferencias"
#~ msgid "What's using power..."
#~ msgstr "Lo que está usando energía…"
@ -909,12 +1102,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Invisible"
#~ msgstr "Invisible"
#~ msgid "Restart..."
#~ msgstr "Reiniciar…"
#~ msgid "Account Information..."
#~ msgstr "Información de la cuenta…"
#~ msgid "ON"
#~ msgstr "ENCENDIDO"

320
po/et.po
View File

@ -1,21 +1,26 @@
# GNOME kesta eesti keele tõlge.
# Estonian translation for gnome-shell.
# Copyright (C) 2010 The Gnome Project
#
# Copyright (C) 2010, 2011 The Gnome Project
#
# This file is distributed under the same license as the gnome-shell package.
# Mattias Põldaru <mahfiaz gmail com>, 2010.
#
# Mattias Põldaru <mahfiaz gmail com>, 2010, 2011.
# Ivar Smolin <okul linux ee>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Project-Id-Version: gnome-shell MASTER\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-12-18 23:05+0000\n"
"PO-Revision-Date: 2010-12-18 11:47+0200\n"
"POT-Creation-Date: 2011-01-15 00:23+0000\n"
"PO-Revision-Date: 2011-01-15 15:45+0200\n"
"Last-Translator: Ivar Smolin <okul@linux.ee>\n"
"Language-Team: Estonian <gnome-et@linux.ee>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: et\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-Language: Estonian\n"
"X-Poedit-Country: Estonia\n"
@ -26,12 +31,6 @@ msgstr "GNOME kest"
msgid "Window management and application launching"
msgstr "Aknahaldur ja rakenduste käivitaja"
msgid "Clock"
msgstr "Kell"
msgid "Customize the panel clock"
msgstr "Paneelikella kohandamine"
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
@ -39,15 +38,12 @@ msgstr ""
"Lubab ligipääsu sisemistele silumise ja monitoorimise tööriistadele Alt-F2 "
"dialoogi kaudu."
msgid "Custom format of the clock"
msgstr "Kellaaaja kohandatud vorming"
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Arendajate ja testijate jaoks sisemiste tööriistade lubamine Alt-F2 alt"
msgid "File extension used for storing the screencast"
msgstr "Faililaiend, mida kasutatakse ekraanivideo salvestamisel"
msgstr "Ekraanivideo salvestamisel kasutatav faililaiend"
msgid "Framerate used for recording screencasts."
msgstr "Ekraanivideo lindistamisel kasutatav kaadrikiirus."
@ -56,29 +52,20 @@ msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
"GNOME Shelli laiendustel on omadus UUID. Selle võtmega määratakse "
"laiendused, mida ei peaks laaditama."
msgid "History for command (Alt-F2) dialog"
msgstr "Käsudialoogi (Alt-F2) ajalugu"
msgid "Hour format"
msgstr "Tundide vorming"
msgid "If true, display date in the clock, in addition to time."
msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva."
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
"Kui tõene ja vorming on kas \"12-tundi\" või \"24-tundi\", kuvatakse "
"kellaaja kõrval ka kuupäeva."
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr ""
"Kui tõene ja vorming on kas \"12-tundi\" või \"24-tundi\", kuvatakse "
"kellaaega koos sekunditega."
msgid "If true, display seconds in time."
msgstr "Kui määratud, siis kuvatakse aja juures ka sekundeid."
msgid "If true, display the ISO week date in the calendar."
msgstr "Kui tõene, kuvatakse kalendris kuupäeva ISO nädalate järgi."
msgstr "Kui määratud, kuvatakse kalendris kuupäeva ISO nädalavormingus."
msgid "List of desktop file IDs for favorite applications"
msgstr "Lemmikrakenduste töölauafailide ID-de loend"
@ -98,7 +85,7 @@ msgid "Show date in clock"
msgstr "Kell näitab kuupäeva"
msgid "Show the week date in the calendar"
msgstr "Kalendris näidatakse nädala kuupäeva"
msgstr "Kalendris näidatakse kuupäeva nädalavormingus"
msgid "Show time with seconds"
msgstr "Kellaaega näidatakse sekunditega"
@ -113,6 +100,10 @@ msgid ""
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"Ekraanivideo jaoks kasutatav failinimi on unikaalne, see sisaldab "
"salvestamise kuupäeva ja ka käesoleva võtmega määratud laiendit. Mõnda teise "
"konteinervormingusse salvestades tuleks ka sellele vormingule vastav laiend "
"määrata."
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
@ -129,22 +120,6 @@ msgid ""
"remove already saved data."
msgstr ""
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 ""
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 ""
msgid "Uuids of extensions to disable"
msgstr "Keelatavate laienduste UUID-d"
@ -261,29 +236,21 @@ msgstr ""
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr "Niitristi moodustavate püst- ja rõhtjoone laius"
msgid "Clock Format"
msgstr "Kellaaja vorming"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
msgid "Could not parse command:"
msgstr "Käsku pole võimalik analüüsida:"
msgid "Clock Preferences"
msgstr "Kella eelistused"
msgid "No such application"
msgstr "Sellist rakendust ei ole"
msgid "Panel Display"
msgstr "Paneelikuva"
msgid "Show seco_nds"
msgstr "_Sekundeid näidatakse"
msgid "Show the _date"
msgstr "_Kuupäeva näidatakse"
msgid "_12 hour format"
msgstr "_12 tunni vorming"
msgid "_24 hour format"
msgstr "_24 tunni vorming"
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' käivitamine nurjus:"
#. Translators: Filter to display all applications
msgid "All"
msgstr ""
msgstr "Kõik"
msgid "APPLICATIONS"
msgstr "Rakendused"
@ -309,11 +276,66 @@ msgid "%s has been removed from your favorites."
msgstr "%s eemaldati lemmikutest."
msgid "Remove"
msgstr ""
msgstr "Eemalda"
msgid "RECENT ITEMS"
msgstr "Hiljutised dokumendid"
#, c-format
msgid "Log Out %s"
msgstr "Logi %s välja"
msgid "Log Out"
msgstr "Logi välja"
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr ""
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr ""
msgid "Logging out of the system."
msgstr "Süsteemist väljalogimine"
msgid "Shut Down"
msgstr "Lülita välja"
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr ""
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr ""
msgid "Shutting down the system."
msgstr "Süsteemi seiskamine."
msgid "Restart"
msgstr "Taaskäivita"
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"Nende rakenduste sulgemiseks ja süsteemi taaskäivitamiseks klõpsa "
"\"Taaskäivita\"."
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Süsteem taaskäivitatakse automaatselt %d sekundi pärast."
msgid "Restarting the system."
msgstr "Süsteemi taaskäivitamine."
msgid "Confirm"
msgstr "Kinnita"
msgid "Cancel"
msgstr "Katkesta"
msgid "No extensions installed"
msgstr "Ühtegi laiendust pole paigaldatud"
@ -337,6 +359,9 @@ msgstr "Kuva lähtekoodi"
msgid "Web Page"
msgstr "Veebileht"
msgid "System Information"
msgstr "Süsteemi andmed"
msgid "Undo"
msgstr "Võta tagasi"
@ -351,9 +376,6 @@ msgstr "Rakendused"
msgid "Quit %s"
msgstr "Lõpeta %s"
msgid "Preferences"
msgstr "Eelistused"
#. Translators: This is the time format with date used
#. in 24-hour mode.
msgid "%a %b %e, %R:%S"
@ -415,10 +437,6 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Palun sisesta käsk:"
#, c-format
msgid "Execution of '%s' failed:"
msgstr "'%s' käivitamine nurjus:"
msgid "Available"
msgstr "Saadaval"
@ -441,7 +459,7 @@ msgid "Log Out..."
msgstr "Logi välja..."
msgid "Suspend..."
msgstr ""
msgstr "Peata..."
msgid "Shut Down..."
msgstr "Lülita välja..."
@ -465,7 +483,7 @@ msgid "Slow Keys"
msgstr "Aeglased klahvid"
msgid "Bounce Keys"
msgstr ""
msgstr "Põrkeklahvid"
msgid "Mouse Keys"
msgstr "Hiireklahvid"
@ -479,19 +497,107 @@ msgstr ""
msgid "Large Text"
msgstr ""
msgid "Bluetooth"
msgstr "Bluetooth"
msgid "Visibility"
msgstr "Nähtavus"
msgid "Send Files to Device..."
msgstr "Failide saatmine seadmesse..."
msgid "Setup a New Device..."
msgstr ""
msgid "Bluetooth Settings"
msgstr "Bluetoothi sätted"
msgid "Connection"
msgstr "Ühendus"
msgid "Send Files..."
msgstr "Failide saatmine..."
msgid "Browse Files..."
msgstr "Failide sirvimine..."
msgid "Error browsing device"
msgstr "Viga seadme sirvimisel"
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr ""
msgid "Keyboard Settings"
msgstr "Klaviatuurisätted"
msgid "Mouse Settings"
msgstr "Hiiresätted"
msgid "Sound Settings"
msgstr "Helisätted"
msgid "Bluetooth Agent"
msgstr "Bluetoothi agent"
#, c-format
msgid "Authorization request from %s"
msgstr "Autoriseerimise päring seadmelt %s"
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Seade %s soovib ligipääsu teenusele '%s'"
msgid "Always grant access"
msgstr "Luba alati"
msgid "Grant this time only"
msgstr "Luba ainult seekord"
msgid "Reject"
msgstr "Lükka tagasi"
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Paardumise kinnitus seadmele %s"
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Seade '%s' tahab selle arvutiga paarduda"
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Palun kontrolli, et PIN-kood '%s' kattuks seadme parooliga."
msgid "Matches"
msgstr "Kattub"
msgid "Does not match"
msgstr "Ei kattu"
#, c-format
msgid "Pairing request for %s"
msgstr "Seadmega %s paardumise päring"
msgid "Please enter the PIN mentioned on the device."
msgstr "Palun sisesta seadme poolt öeldav PIN-kood."
msgid "OK"
msgstr "Olgu"
msgid "Power Settings"
msgstr "Toitesätted..."
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "jäänud %d tund"
msgstr[1] "jäänud %d tundi"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#, c-format
msgid "%d %s %d %s remaining"
msgstr ""
msgstr "jäänud %d %s ja %d %s"
msgid "hour"
msgid_plural "hours"
@ -506,8 +612,8 @@ msgstr[1] "minutit"
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "jäänud %d minut"
msgstr[1] "jäänud %d minutit"
msgid "AC adapter"
msgstr "Võrgutoite adapter"
@ -528,7 +634,7 @@ msgid "Keyboard"
msgstr "Klaviatuur"
msgid "PDA"
msgstr ""
msgstr "Elektronmärkmik"
msgid "Cell phone"
msgstr "Mobiiltelefon"
@ -537,7 +643,7 @@ msgid "Media player"
msgstr "Meediaesitaja"
msgid "Tablet"
msgstr ""
msgstr "Graafikalaud"
msgid "Computer"
msgstr "Arvuti"
@ -551,9 +657,6 @@ msgstr "Helivaljus"
msgid "Microphone"
msgstr "Mikrofon"
msgid "Sound Settings"
msgstr "Helisätted"
#, c-format
msgid "%s is online."
msgstr "%s on ühendatud."
@ -575,7 +678,7 @@ msgstr "%s on hõivatud."
#. locale, without seconds.
#, no-c-format
msgid "Sent at %X on %A"
msgstr ""
msgstr "Saadetud: %a, kell %X"
msgid "Search your computer"
msgstr ""
@ -661,6 +764,42 @@ msgstr "Otsing"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Clock"
#~ msgstr "Kell"
#~ msgid "Customize the panel clock"
#~ msgstr "Paneelikella kohandamine"
#~ msgid "Custom format of the clock"
#~ msgstr "Kellaaaja kohandatud vorming"
#~ msgid "Hour format"
#~ msgstr "Tundide vorming"
#~ msgid "Clock Format"
#~ msgstr "Kellaaja vorming"
#~ msgid "Clock Preferences"
#~ msgstr "Kella eelistused"
#~ msgid "Panel Display"
#~ msgstr "Paneelikuva"
#~ msgid "Show seco_nds"
#~ msgstr "_Sekundeid näidatakse"
#~ msgid "Show the _date"
#~ msgstr "_Kuupäeva näidatakse"
#~ msgid "_12 hour format"
#~ msgstr "_12 tunni vorming"
#~ msgid "_24 hour format"
#~ msgstr "_24 tunni vorming"
#~ msgid "Preferences"
#~ msgstr "Eelistused"
#~ msgid "Drag here to add favorites"
#~ msgstr "Lemmikute lisamiseks lohista need siia"
@ -675,6 +814,3 @@ msgstr "%1$s: %2$s"
#~ msgid "Invisible"
#~ msgstr "Nähtamatu"
#~ msgid "Account Information..."
#~ msgstr "Konto andmed..."

614
po/gl.po

File diff suppressed because it is too large Load Diff

603
po/he.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-19 01:04+0200\n"
"PO-Revision-Date: 2010-12-19 01:04+0200\n"
"POT-Creation-Date: 2011-01-18 13:02+0200\n"
"PO-Revision-Date: 2011-01-18 13:05+0200\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"Language-Team: Hebrew <he@li.org>\n"
"MIME-Version: 1.0\n"
@ -25,14 +25,6 @@ msgstr "מעטפת GNOME"
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 "
@ -42,22 +34,18 @@ msgstr ""
"dialog."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "Custom format of the clock"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "Enable internal tools useful for developers and testers from Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr "File extension used for storing the screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Framerate used for recording screencasts."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
@ -65,39 +53,27 @@ msgstr ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog"
msgstr "History for command (Alt-F2) dialog"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "If true, display date in the clock, in addition to time."
msgstr "If true, display date in the clock, in addition to time."
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "Hour format"
msgid "If true, display seconds in time."
msgstr "If true, display seconds in time."
#: ../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 ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
#: ../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 ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "If true, display the ISO week date in the calendar."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "List of desktop file IDs for favorite applications"
msgstr "List of desktop file IDs for favorite applications"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#: ../data/org.gnome.shell.gschema.xml.in.h:11
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 "
@ -117,49 +93,49 @@ msgstr ""
"to an empty value, the default pipeline will be used. This is currently "
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show date in clock"
msgstr "Show date in clock"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Show the week date in the calendar"
msgstr "Show the week date in the calendar"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Show time with seconds"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "The gstreamer pipeline used to encode the screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
@ -171,42 +147,18 @@ msgstr ""
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Uuids of extensions to disable"
msgstr "Uuids of extensions to disable"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "Whether to collect stats about applications usage"
msgstr "Whether to collect stats about applications usage"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "disabled OpenSearch providers"
msgstr "disabled OpenSearch providers"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
msgid "Clip the crosshairs at the center"
msgstr "Clip the crosshairs at the center"
@ -362,55 +314,43 @@ msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
"Width of the vertical and horizontal lines that make up the crosshairs."
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "מבנה השעון"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:108
msgid "Could not parse command:"
msgstr "לא ניתן לפענח את הפקודה:"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "העדפות השעון"
#: ../js/misc/util.js:130
msgid "No such application"
msgstr "אין כזה יישום"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "תצוגת הלוח"
#: ../js/misc/util.js:143 ../js/ui/runDialog.js:351
#, c-format
msgid "Execution of '%s' failed:"
msgstr "ההרצה של '%s' נכשלה:"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "הצגת ש_ניות"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "הצגת ה_תאריך"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "מבנה _12 שעות"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "מבנה _24 שעות"
#: ../js/ui/appDisplay.js:154
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "הכול"
#: ../js/ui/appDisplay.js:235
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "יישומים"
#: ../js/ui/appDisplay.js:265
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "העדפות"
#: ../js/ui/appDisplay.js:562
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "חלון חדש"
#: ../js/ui/appDisplay.js:566
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "הסרה מהמועדפים"
#: ../js/ui/appDisplay.js:567
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "הוספה למועדפים"
@ -428,122 +368,191 @@ msgstr "%s הוסר מהמועדפים שלך."
msgid "Remove"
msgstr "הסרה"
#: ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:18
msgid "RECENT ITEMS"
msgstr "פריטים אחרונים"
#: ../js/ui/lookingGlass.js:552
#: ../js/ui/endSessionDialog.js:63
#, c-format
msgid "Log Out %s"
msgstr "הוצאת %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
msgid "Log Out"
msgstr "יציאה"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולצאת מהמערכת."
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr "המשתמש %s ייצא אוטומטית בעוד %d שניות."
#: ../js/ui/endSessionDialog.js:67
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr "המערכת תוציא אותך אוטומטית בעוד %d שניות."
#: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system."
msgstr "מתבצעת יציאה מהמערכת."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "כיבוי"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולכבות את המערכת."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "המערכת תכבה אוטומטית בעוד %d שניות."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "המערכת נכבית."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
msgid "Restart"
msgstr "הפעלה מחדש"
#: ../js/ui/endSessionDialog.js:85
msgid "Click Restart to quit these applications and restart the system."
msgstr "יש ללחוץ על יציאה כדי לסגור יישומים אלה ולהפעיל את המערכת מחדש."
#: ../js/ui/endSessionDialog.js:86
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "המערכת תופעל מחדש בעוד %d שניות."
#: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system."
msgstr "המערכת מופעלת מחדש"
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "אישור"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
msgid "Cancel"
msgstr "ביטול"
#: ../js/ui/lookingGlass.js:556
msgid "No extensions installed"
msgstr "לא מותקנות הרחבות"
#: ../js/ui/lookingGlass.js:589
#: ../js/ui/lookingGlass.js:593
msgid "Enabled"
msgstr "פעיל"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:595 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "מנוטרל"
#: ../js/ui/lookingGlass.js:593
#: ../js/ui/lookingGlass.js:597
msgid "Error"
msgstr "שגיאה"
#: ../js/ui/lookingGlass.js:595
#: ../js/ui/lookingGlass.js:599
msgid "Out of date"
msgstr "לא בתוקף"
#: ../js/ui/lookingGlass.js:620
#: ../js/ui/lookingGlass.js:624
msgid "View Source"
msgstr "צפייה במקור"
#: ../js/ui/lookingGlass.js:626
#: ../js/ui/lookingGlass.js:630
msgid "Web Page"
msgstr "דף אינטרנט"
#: ../js/ui/overview.js:96
#: ../js/ui/messageTray.js:1748
msgid "System Information"
msgstr "פרטי המערכת"
#: ../js/ui/overview.js:75
msgid "Undo"
msgstr "ביטול"
#: ../js/ui/overview.js:158
#: ../js/ui/overview.js:140
msgid "Windows"
msgstr "חלונות"
#: ../js/ui/overview.js:161
#: ../js/ui/overview.js:143
msgid "Applications"
msgstr "יישומים"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:474
#: ../js/ui/panel.js:479
#, c-format
msgid "Quit %s"
msgstr "יציאה מ־%s"
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "העדפות"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:585
#: ../js/ui/panel.js:564
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e, %R:%S"
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:565
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:590
#: ../js/ui/panel.js:569
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:591
#: ../js/ui/panel.js:570
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:598
#: ../js/ui/panel.js:577
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e, %l:%M:%S %p"
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:578
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:603
#: ../js/ui/panel.js:582
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:604
#: ../js/ui/panel.js:583
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:749
#: ../js/ui/panel.js:728
msgid "Activities"
msgstr "פעילויות"
#: ../js/ui/placeDisplay.js:111
#: ../js/ui/placeDisplay.js:106
#, c-format
msgid "Failed to unmount '%s'"
msgstr "אירע כשל בניתוק '%s'"
#: ../js/ui/placeDisplay.js:114
#: ../js/ui/placeDisplay.js:109
msgid "Retry"
msgstr "ניסיון חוזר"
#: ../js/ui/placeDisplay.js:159
#: ../js/ui/placeDisplay.js:150
msgid "Connect to..."
msgstr "התחברות אל..."
#: ../js/ui/placeDisplay.js:558
#: ../js/ui/placeDisplay.js:386
msgid "PLACES & DEVICES"
msgstr "מקומות והתקנים"
@ -556,84 +565,79 @@ msgstr "מקומות והתקנים"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
#: ../js/ui/runDialog.js:209
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
#: ../js/ui/statusMenu.js:102
msgid "Available"
msgstr "זמין"
#: ../js/ui/statusMenu.js:106
#: ../js/ui/statusMenu.js:107
msgid "Busy"
msgstr "עסוק"
#: ../js/ui/statusMenu.js:114
#: ../js/ui/statusMenu.js:115
msgid "My Account"
msgstr "החשבון שלי"
#: ../js/ui/statusMenu.js:118
#: ../js/ui/statusMenu.js:119
msgid "System Settings"
msgstr "הגדרות המערכת"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:126
msgid "Lock Screen"
msgstr "נעילת המסך"
#: ../js/ui/statusMenu.js:129
#: ../js/ui/statusMenu.js:130
msgid "Switch User"
msgstr "החלפת משתמש"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:135
msgid "Log Out..."
msgstr "ניתוק..."
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Suspend..."
msgstr "השהיה..."
#: ../js/ui/statusMenu.js:145
#: ../js/ui/statusMenu.js:146
msgid "Shut Down..."
msgstr "כיבוי..."
#: ../js/ui/status/accessibility.js:82
#: ../js/ui/status/accessibility.js:83
msgid "Zoom"
msgstr "תקריב"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:89
msgid "Screen Reader"
msgstr "מקריא מסך"
#: ../js/ui/status/accessibility.js:91
#: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard"
msgstr "מקלדת מסך"
#: ../js/ui/status/accessibility.js:94
#: ../js/ui/status/accessibility.js:95
msgid "Visual Alerts"
msgstr "התראות חזותיות"
#: ../js/ui/status/accessibility.js:97
#: ../js/ui/status/accessibility.js:98
msgid "Sticky Keys"
msgstr "מקשים דביקים"
#: ../js/ui/status/accessibility.js:100
#: ../js/ui/status/accessibility.js:101
msgid "Slow Keys"
msgstr "מקשים אטיים"
#: ../js/ui/status/accessibility.js:103
#: ../js/ui/status/accessibility.js:104
msgid "Bounce Keys"
msgstr "מקשים קופצים"
#: ../js/ui/status/accessibility.js:106
#: ../js/ui/status/accessibility.js:107
msgid "Mouse Keys"
msgstr "מקשי עכבר"
#: ../js/ui/status/accessibility.js:110
#: ../js/ui/status/accessibility.js:111
msgid "Universal Access Settings"
msgstr "הגדרות גישה אוניברסלית"
@ -645,6 +649,122 @@ msgstr "ניגודיות גבוהה"
msgid "Large Text"
msgstr "טקסט גדול"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "הצגה"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "שליחת קובץ להתקן..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "הגדרת התקן חדש..."
#: ../js/ui/status/bluetooth.js:95
msgid "Bluetooth Settings"
msgstr "הגדרות Bluetooth"
#: ../js/ui/status/bluetooth.js:192
msgid "Connection"
msgstr "חיבור"
#: ../js/ui/status/bluetooth.js:228
msgid "Send Files..."
msgstr "שליחת קבצים..."
#: ../js/ui/status/bluetooth.js:233
msgid "Browse Files..."
msgstr "עיון בקבצים..."
#: ../js/ui/status/bluetooth.js:242
msgid "Error browsing device"
msgstr "שגיאה בעיון בהתקן"
#: ../js/ui/status/bluetooth.js:243
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/keyboard.js:78
msgid "Keyboard Settings"
msgstr "הגדרות מקלדת"
#: ../js/ui/status/bluetooth.js:256
msgid "Mouse Settings"
msgstr "הגדרות עכבר"
#: ../js/ui/status/bluetooth.js:263 ../js/ui/status/volume.js:63
msgid "Sound Settings"
msgstr "הגדרות שמע"
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
#: ../js/ui/status/bluetooth.js:411 ../js/ui/status/bluetooth.js:444
msgid "Bluetooth Agent"
msgstr "סוכן Bluetooth"
#: ../js/ui/status/bluetooth.js:372
#, c-format
msgid "Authorization request from %s"
msgstr "בקשת אישור מאת %s"
#: ../js/ui/status/bluetooth.js:378
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
#: ../js/ui/status/bluetooth.js:380
msgid "Always grant access"
msgstr "תמיד להעניק גישה"
#: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only"
msgstr "הענקת גישה הפעם בלבד"
#: ../js/ui/status/bluetooth.js:382
msgid "Reject"
msgstr "סירוב"
#: ../js/ui/status/bluetooth.js:412
#, c-format
msgid "Pairing confirmation for %s"
msgstr "אישור צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
#: ../js/ui/status/bluetooth.js:419
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "נא לאשר האם קוד ה־PIN '%s' תואם את זה שמופיע בהתקן."
#: ../js/ui/status/bluetooth.js:421
msgid "Matches"
msgstr "התאמות"
#: ../js/ui/status/bluetooth.js:422
msgid "Does not match"
msgstr "אינו תואם"
#: ../js/ui/status/bluetooth.js:445
#, c-format
msgid "Pairing request for %s"
msgstr "בקשת צימוד עבור %s"
#: ../js/ui/status/bluetooth.js:453
msgid "Please enter the PIN mentioned on the device."
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
#: ../js/ui/status/bluetooth.js:469
msgid "OK"
msgstr "אישור"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "הגדרות צריכת החשמל"
@ -685,82 +805,78 @@ msgstr[0] "דקה אחת נותרה"
msgstr[1] "%d דקות נותרו"
msgstr[2] "שתי דקות נותרו"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:235
msgid "AC adapter"
msgstr "מתאם חשמל"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:237
msgid "Laptop battery"
msgstr "סוללת נייד"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:239
msgid "UPS"
msgstr "אל־פסק"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:241
msgid "Monitor"
msgstr "צג"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:243
msgid "Mouse"
msgstr "עכבר"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:245
msgid "Keyboard"
msgstr "מקלדת"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:247
msgid "PDA"
msgstr "מחשב כף יד"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:249
msgid "Cell phone"
msgstr "טלפון סלולרי"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:251
msgid "Media player"
msgstr "נגן מדיה"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:253
msgid "Tablet"
msgstr "טבלת שליטה"
#: ../js/ui/status/power.js:257
#: ../js/ui/status/power.js:255
msgid "Computer"
msgstr "מחשב"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "לא ידוע"
#: ../js/ui/status/volume.js:41
#: ../js/ui/status/volume.js:42
msgid "Volume"
msgstr "עצמה"
#: ../js/ui/status/volume.js:54
#: ../js/ui/status/volume.js:55
msgid "Microphone"
msgstr "מיקרופון"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "הגדרות שמע"
#: ../js/ui/telepathyClient.js:560
#: ../js/ui/telepathyClient.js:561
#, c-format
msgid "%s is online."
msgstr "%s התחבר/ה."
#: ../js/ui/telepathyClient.js:565
#: ../js/ui/telepathyClient.js:566
#, c-format
msgid "%s is offline."
msgstr "%s התנתק/ה."
#: ../js/ui/telepathyClient.js:568
#: ../js/ui/telepathyClient.js:569
#, c-format
msgid "%s is away."
msgstr "'%s' מרוחק/ת."
#: ../js/ui/telepathyClient.js:571
#: ../js/ui/telepathyClient.js:572
#, c-format
msgid "%s is busy."
msgstr "%s עסוק/ה."
@ -768,7 +884,7 @@ msgstr "%s עסוק/ה."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#: ../js/ui/telepathyClient.js:666
#, no-c-format
msgid "Sent at %X on %A"
msgstr "נשלח ב־%X בשעה %A"
@ -820,11 +936,11 @@ msgstr[2] "2 קלטים"
msgid "System Sounds"
msgstr "צלילי מערכת"
#: ../src/shell-global.c:1155
#: ../src/shell-global.c:1366
msgid "Less than a minute ago"
msgstr "לפני פחות מדקה"
#: ../src/shell-global.c:1159
#: ../src/shell-global.c:1370
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -832,7 +948,7 @@ msgstr[0] "לפני דקה"
msgstr[1] "לפני %d דקות"
msgstr[2] "לפני 2 דקות"
#: ../src/shell-global.c:1164
#: ../src/shell-global.c:1375
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -840,7 +956,7 @@ msgstr[0] "לפני שעה"
msgstr[1] "לפני %d שעות"
msgstr[2] "לפני שעתיים"
#: ../src/shell-global.c:1169
#: ../src/shell-global.c:1380
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -848,7 +964,7 @@ msgstr[0] "לפני יום"
msgstr[1] "לפני %d ימים"
msgstr[2] "לפני יומיים"
#: ../src/shell-global.c:1174
#: ../src/shell-global.c:1385
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -880,6 +996,75 @@ msgstr "חיפוש"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "Clock"
#~ msgstr "שעון"
#~ msgid "Customize the panel clock"
#~ msgstr "התאמת לוח השעון"
#~ msgid "Custom format of the clock"
#~ msgstr "Custom format of the clock"
#~ msgid "Hour format"
#~ msgstr "Hour format"
#~ msgid ""
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time."
#~ msgstr ""
#~ "If true and format is either \"12-hour\" or \"24-hour\", display seconds "
#~ "in time."
#~ msgid ""
#~ "This key specifies the format used by the panel clock when the format key "
#~ "is set to \"custom\". You can use conversion specifiers understood by "
#~ "strftime() to obtain a specific format. See the strftime() manual for "
#~ "more information."
#~ msgstr ""
#~ "This key specifies the format used by the panel clock when the format key "
#~ "is set to \"custom\". You can use conversion specifiers understood by "
#~ "strftime() to obtain a specific format. See the strftime() manual for "
#~ "more information."
#~ msgid ""
#~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "format specified in the custom_format key. Note that if set to either "
#~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ msgstr ""
#~ "This key specifies the hour format used by the panel clock. Possible "
#~ "values are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to "
#~ "\"unix\", the clock will display time in seconds since Epoch, i.e. 1970-"
#~ "01-01. If set to \"custom\", the clock will display time according to the "
#~ "format specified in the custom_format key. Note that if set to either "
#~ "\"unix\" or \"custom\", the show_date and show_seconds keys are ignored."
#~ msgid "Clock Format"
#~ msgstr "מבנה השעון"
#~ msgid "Clock Preferences"
#~ msgstr "העדפות השעון"
#~ msgid "Panel Display"
#~ msgstr "תצוגת הלוח"
#~ msgid "Show seco_nds"
#~ msgstr "הצגת ש_ניות"
#~ msgid "Show the _date"
#~ msgstr "הצגת ה_תאריך"
#~ msgid "_12 hour format"
#~ msgstr "מבנה _12 שעות"
#~ msgid "_24 hour format"
#~ msgstr "מבנה _24 שעות"
#~ msgid "Preferences"
#~ msgstr "העדפות"
#~ msgid "What's using power..."
#~ msgstr "מה צורך חשמל..."
@ -908,12 +1093,6 @@ msgstr "%1$s: %2$s"
#~ msgid "Invisible"
#~ msgstr "בלתי נראה"
#~ msgid "Restart..."
#~ msgstr "הפעלה מחדש..."
#~ msgid "Account Information..."
#~ msgstr "פרטי המשתמש..."
#~ msgid "ON"
#~ msgstr "1"

568
po/it.po
View File

@ -3,19 +3,19 @@
# This file is distributed under the same license as the gnome-shell package.
#
# Milo Casagrande <milo@ubuntu.com>, 2009, 2010.
# Luca Ferretti <lferrett@gnome.org>, 2010.
# Luca Ferretti <lferrett@gnome.org>, 2010, 2011.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-13 21:30+0100\n"
"PO-Revision-Date: 2010-12-13 22:40+0100\n"
"POT-Creation-Date: 2011-01-15 01:10+0100\n"
"PO-Revision-Date: 2011-01-15 01:19+0100\n"
"Last-Translator: Luca Ferretti <lferrett@gnome.org>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: ../data/gnome-shell.desktop.in.in.h:1
@ -26,14 +26,6 @@ msgstr "GNOME Shell"
msgid "Window management and application launching"
msgstr "Gestisce finestre e avvia applicazioni"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
msgstr "Orologio"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "Personalizza l'orologio sul pannello"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
@ -43,24 +35,20 @@ msgstr ""
"utilizzando il dialogo Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "Formato personalizzato dell'orologio"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Abilita gli strumenti interni utili a sviluppatori e beta-tester attraverso "
"Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr "Estensione del file utilizzato per salvare lo screencast"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr "Framerate per la registrazione di screencast."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
@ -68,39 +56,27 @@ msgstr ""
"Le estensioni per la GNOME Shell dispongono di una proprietà UUID: questa "
"chiave elenca le estensioni che non dovrebbero essere caricate."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog"
msgstr "Cronologia per il dialogo dei comandi (Alt-F2)"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "If true, display date in the clock, in addition to time."
msgstr "Se VERO, mostra nell'orologio la data, oltre all'orario."
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "Formato orario"
msgid "If true, display seconds in time."
msgstr "Se VERO, mostra i secondi nell'orario."
#: ../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 ""
"Se VERO e il formato è \"12-hour\" oppure \"24-hour\", visualizza anche la "
"data nell'orologio oltre all'orario."
msgid "If true, display the ISO week date in the calendar."
msgstr "Se VERO, mostra il giorno della settimana ISO nel calendario."
#: ../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 ""
"Se VERO e il formato è \"12-hour\" oppure \"24-hour\", visualizza i secondi "
"nell'ora."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr "Se VERO, visualizza il giorno della settimana ISO nel calendario."
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr "Elenco di ID di file desktop per le applicazioni preferite"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid ""
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
"used for gst-launch. The pipeline should have an unconnected sink pad where "
@ -121,19 +97,19 @@ msgstr ""
"alcun valore, viene usata la pipeline predefinita il cui valore è "
"\"videorate ! theoraenc ! oggmux\" e che registra nel formato Ogg Theora."
#: ../data/org.gnome.shell.gschema.xml.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show date in clock"
msgstr "Mostra la data nell'orologio"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Show the week date in the calendar"
msgstr "Mostra il giorno della settimana nel calendario"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Mostra l'ora con i secondi"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
@ -141,7 +117,7 @@ msgstr ""
"Le applicazioni che corrispondono a questi identificatori vengono "
"visualizzate nell'area dei preferiti."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:16
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 "
@ -151,7 +127,7 @@ msgstr ""
"data corrente e utilizza questa estensione. Dovrebbe essere modificato "
"quando si registra utilizzando un diverso formato contenitore."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
@ -159,12 +135,12 @@ msgstr ""
"Il framerate in fotogrammi al secondo dello screencast registrato attraverso "
"il registratore della GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "La pipeline di gstreamer utilizzata per codificare lo screencast"
# (ndt) quel "in launchers" non mi convince...
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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 "
@ -176,40 +152,11 @@ msgstr ""
"disabilitare questa funzionalità per motivi di privacy. I dati già salvati "
"non verranno comunque rimossi."
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"Questa chiave indica il formato usato dall'orologio nel pannello quando la "
"chiave specifica è impostata a \"custom\". È possibile utilizzare gli "
"specificatori di formato compatibili con strftime(). Per maggiori "
"informazioni, consultare il manuale di strftime()."
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"Questa chiave indica il formato orario usato dall'orologio. I possibili "
"valori sono \"12-hour\", \"24-hour\", \"unix\" e \"custom\". Se impostata a "
"\"unix\", l'orologio visualizza l'ora in secondi a partire dall'era Epoch, "
"cioè dal 1970-01-01. Se impostata a \"custom\", l'orologio visualizza l'ora "
"in base al formato specificato nella chiave custom_format. Notare che se "
"impostata a \"unix\" o \"custom\", le chiavi show_date e show_seconds non "
"vengono considerate."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Uuids of extensions to disable"
msgstr "UUID delle estensioni da disabilitare"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "Whether to collect stats about applications usage"
msgstr ""
"Indica se raccogliere statistiche riguardo l'utilizzo delle applicazioni"
@ -339,51 +286,43 @@ msgstr ""
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "Formato ora"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:108
msgid "Could not parse command:"
msgstr "Impossibile analizzare il comando:"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "Preferenze di Orologio"
#: ../js/misc/util.js:130
msgid "No such application"
msgstr "Applicazione inesistente"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "Visualizzazione sul pannello"
#: ../js/misc/util.js:143 ../js/ui/runDialog.js:364
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "Mostrare i _secondi"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "Tutte"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "Mostrare la _data"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "Formato _12 ore"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "Formato _24 ore"
#: ../js/ui/appDisplay.js:215
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "Applicazioni"
msgstr "APPLICAZIONI"
#: ../js/ui/appDisplay.js:245
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "Preferenze"
msgstr "PREFERENZE"
#: ../js/ui/appDisplay.js:542
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "Nuova finestra"
#: ../js/ui/appDisplay.js:546
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "Rimuovi dai preferiti"
#: ../js/ui/appDisplay.js:547
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "Aggiungi ai preferiti"
@ -403,118 +342,197 @@ msgstr "%s è stato rimosso dai preferiti."
msgid "Remove"
msgstr "Rimuovi"
#: ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:18
msgid "RECENT ITEMS"
msgstr "Elementi recenti"
#: ../js/ui/lookingGlass.js:552
#: ../js/ui/endSessionDialog.js:63
#, c-format
msgid "Log Out %s"
msgstr "Termina sessione di %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
msgid "Log Out"
msgstr "Termina sessione"
# oddio... abbandonare il sistema sembra la nave che affonda... (LF)
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr "Fare clic su «Termina sessione» per chiudere queste applicazioni e abbandonare il sistema."
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr "La sessione di %s verrà terminata automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:67
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr "La sessione verrà terminata automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system."
msgstr "Chiusura della sessione."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "Arresta"
# usato un termine diverso, magari si capisce meglio (LF)
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "Fare clic su «Arresta» per chiudere queste applicazioni e spegnere il sistema."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Il sistema verrà arrestato automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "Arresto del sistema."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
msgid "Restart"
msgstr "Riavvia"
#: ../js/ui/endSessionDialog.js:85
msgid "Click Restart to quit these applications and restart the system."
msgstr "Fare clic su «Riavvia» per chiudere queste applicazioni e riavviare il sistema."
#: ../js/ui/endSessionDialog.js:86
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Il sistema verrà riavviato automaticamente tra %d secondi."
#: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system."
msgstr "Riavvio del sistema."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Conferma"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:469
msgid "Cancel"
msgstr "Annulla"
#: ../js/ui/lookingGlass.js:556
msgid "No extensions installed"
msgstr "Nessuna estensione installata"
# (ndt) o abilitata?
#: ../js/ui/lookingGlass.js:589
#: ../js/ui/lookingGlass.js:593
msgid "Enabled"
msgstr "Abilitato"
# (ndt) o disabilitata?
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:595 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Disabilitato"
#: ../js/ui/lookingGlass.js:593
#: ../js/ui/lookingGlass.js:597
msgid "Error"
msgstr "Errore"
#: ../js/ui/lookingGlass.js:595
#: ../js/ui/lookingGlass.js:599
msgid "Out of date"
msgstr "Non aggiornato"
#: ../js/ui/lookingGlass.js:620
#: ../js/ui/lookingGlass.js:624
msgid "View Source"
msgstr "Visualizza sorgente"
#: ../js/ui/lookingGlass.js:626
#: ../js/ui/lookingGlass.js:630
msgid "Web Page"
msgstr "Pagina web"
#: ../js/ui/overview.js:112
#: ../js/ui/messageTray.js:1748
msgid "System Information"
msgstr "Informazione di sistema"
#: ../js/ui/overview.js:75
msgid "Undo"
msgstr "Annulla"
#: ../js/ui/overview.js:140
msgid "Windows"
msgstr "Finestre"
#: ../js/ui/overview.js:143
msgid "Applications"
msgstr "Applicazioni"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#: ../js/ui/panel.js:479
#, c-format
msgid "Quit %s"
msgstr "Chiudi %s"
#: ../js/ui/panel.js:495
msgid "Preferences"
msgstr "Preferenze"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:564
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %k.%M.%S"
# (ndt) proviamo col k, se non funge, sappiamo il perché...
#: ../js/ui/panel.js:582
#: ../js/ui/panel.js:565
msgid "%a %b %e, %R"
msgstr "%a %e %b, %k.%M"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:569
msgid "%a %R:%S"
msgstr "%a %k.%M.%S"
#: ../js/ui/panel.js:587
#: ../js/ui/panel.js:570
msgid "%a %R"
msgstr "%a %k.%M"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:577
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %P"
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:578
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:599
#: ../js/ui/panel.js:582
msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %P"
#: ../js/ui/panel.js:600
#: ../js/ui/panel.js:583
msgid "%a %l:%M %p"
msgstr "%a %l.%M %P"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:745
#: ../js/ui/panel.js:728
msgid "Activities"
msgstr "Attività"
# (ndt) libera, ma unmount non si può proprio vedere...
#: ../js/ui/placeDisplay.js:111
#: ../js/ui/placeDisplay.js:112
#, c-format
msgid "Failed to unmount '%s'"
msgstr "Impossibile scollegare «%s»"
#: ../js/ui/placeDisplay.js:114
#: ../js/ui/placeDisplay.js:115
msgid "Retry"
msgstr "Riprova"
#: ../js/ui/placeDisplay.js:159
#: ../js/ui/placeDisplay.js:160
msgid "Connect to..."
msgstr "Connetti a..."
#: ../js/ui/placeDisplay.js:558
#: ../js/ui/placeDisplay.js:559
msgid "PLACES & DEVICES"
msgstr "Risorse e dispositivi"
@ -527,84 +545,79 @@ msgstr "Risorse e dispositivi"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
#: ../js/ui/runDialog.js:222
msgid "Please enter a command:"
msgstr "Inserire un comando:"
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:"
#: ../js/ui/statusMenu.js:101
#: ../js/ui/statusMenu.js:102
msgid "Available"
msgstr "Disponibile"
#: ../js/ui/statusMenu.js:106
#: ../js/ui/statusMenu.js:107
msgid "Busy"
msgstr "Non disponibile"
#: ../js/ui/statusMenu.js:114
#: ../js/ui/statusMenu.js:115
msgid "My Account"
msgstr "Account personale"
#: ../js/ui/statusMenu.js:118
#: ../js/ui/statusMenu.js:119
msgid "System Settings"
msgstr "Impostazioni di sistema"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:126
msgid "Lock Screen"
msgstr "Blocca schermo"
#: ../js/ui/statusMenu.js:129
#: ../js/ui/statusMenu.js:130
msgid "Switch User"
msgstr "Cambia utente"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:135
msgid "Log Out..."
msgstr "Termina sessione..."
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Suspend..."
msgstr "Sospendi..."
#: ../js/ui/statusMenu.js:145
#: ../js/ui/statusMenu.js:146
msgid "Shut Down..."
msgstr "Arresta..."
#: ../js/ui/status/accessibility.js:82
#: ../js/ui/status/accessibility.js:83
msgid "Zoom"
msgstr "Ingrandimento"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:89
msgid "Screen Reader"
msgstr "Lettore schermo"
#: ../js/ui/status/accessibility.js:91
#: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard"
msgstr "Tastiera a schermo"
#: ../js/ui/status/accessibility.js:94
#: ../js/ui/status/accessibility.js:95
msgid "Visual Alerts"
msgstr "Allerte visive"
#: ../js/ui/status/accessibility.js:97
#: ../js/ui/status/accessibility.js:98
msgid "Sticky Keys"
msgstr "Permanenza tasti"
#: ../js/ui/status/accessibility.js:100
#: ../js/ui/status/accessibility.js:101
msgid "Slow Keys"
msgstr "Rallentamento tasti"
#: ../js/ui/status/accessibility.js:103
#: ../js/ui/status/accessibility.js:104
msgid "Bounce Keys"
msgstr "Pressione ravvicinata tasti"
#: ../js/ui/status/accessibility.js:106
#: ../js/ui/status/accessibility.js:107
msgid "Mouse Keys"
msgstr "Mouse da tastiera"
#: ../js/ui/status/accessibility.js:110
#: ../js/ui/status/accessibility.js:111
msgid "Universal Access Settings"
msgstr "Impostazioni accesso universale"
@ -616,16 +629,130 @@ msgstr "Contrasto elevato"
msgid "Large Text"
msgstr "Caratteri grandi"
# Sarebbe da vedere uhmmm...
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "Consumi energetici..."
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:240
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/power.js:90
# as on Android :P
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Rilevabile"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "Invia file al dispositivo..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "Imposta un nuovo dispositivo..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "Impostazioni Bluetooth"
# indica lo stato del device BT, per esempio gli auricolari
# credo sia meglio l'aggettivo che il sostantivo
#: ../js/ui/status/bluetooth.js:191
msgid "Connection"
msgstr "Collegato"
#: ../js/ui/status/bluetooth.js:227
msgid "Send Files..."
msgstr "Invia file..."
#: ../js/ui/status/bluetooth.js:232
msgid "Browse Files..."
msgstr "Esplora file..."
#: ../js/ui/status/bluetooth.js:241
msgid "Error browsing device"
msgstr "Errore nell'esplorare il dispositivo"
#: ../js/ui/status/bluetooth.js:242
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Non è possibile esplorare il dispositivo richiesto, l'errore è «%s»"
#: ../js/ui/status/bluetooth.js:250 ../js/ui/status/keyboard.js:78
msgid "Keyboard Settings"
msgstr "Impostazioni tastiera"
#: ../js/ui/status/bluetooth.js:255
msgid "Mouse Settings"
msgstr "Impostazioni mouse"
#: ../js/ui/status/bluetooth.js:262 ../js/ui/status/volume.js:63
msgid "Sound Settings"
msgstr "Impostazioni audio"
#: ../js/ui/status/bluetooth.js:336 ../js/ui/status/bluetooth.js:370
#: ../js/ui/status/bluetooth.js:410 ../js/ui/status/bluetooth.js:443
msgid "Bluetooth Agent"
msgstr ""
#: ../js/ui/status/bluetooth.js:371
#, c-format
msgid "Authorization request from %s"
msgstr "Richesta autorizzazione da %s"
#: ../js/ui/status/bluetooth.js:377
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Il dispositivo %s vuole accedere al servizio «%s»"
#: ../js/ui/status/bluetooth.js:379
msgid "Always grant access"
msgstr "Consenti sempre accesso"
#: ../js/ui/status/bluetooth.js:380
msgid "Grant this time only"
msgstr "Consenti solo stavolta"
#: ../js/ui/status/bluetooth.js:381
msgid "Reject"
msgstr "Rifiuta"
#: ../js/ui/status/bluetooth.js:411
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Conferma associazione per %s"
#: ../js/ui/status/bluetooth.js:417 ../js/ui/status/bluetooth.js:451
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Il dispositivo %s vuole associarsi con questo computer"
#: ../js/ui/status/bluetooth.js:418
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Confermare la corrispondenza del PIN «%s» con quello sul dispositivo."
#: ../js/ui/status/bluetooth.js:420
msgid "Matches"
msgstr "Corrisponde"
#: ../js/ui/status/bluetooth.js:421
msgid "Does not match"
msgstr "Non corrisponde"
#: ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Pairing request for %s"
msgstr "Richiesta associazione per %s"
#: ../js/ui/status/bluetooth.js:452
msgid "Please enter the PIN mentioned on the device."
msgstr "Inserire il PIN indicato sul dispositivo."
#: ../js/ui/status/bluetooth.js:468
msgid "OK"
msgstr "OK"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Impostazioni alimentazione"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -633,125 +760,120 @@ msgstr[0] "%d ora rimanente"
msgstr[1] "%d ore rimanenti"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s e %d %s rimanenti"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "ora"
msgstr[1] "ore"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minuto"
msgstr[1] "minuti"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minuto rimanente"
msgstr[1] "%d minuti rimanenti"
#: ../js/ui/status/power.js:244
#: ../js/ui/status/power.js:235
msgid "AC adapter"
msgstr "Alimentatore di corrente"
#: ../js/ui/status/power.js:246
#: ../js/ui/status/power.js:237
msgid "Laptop battery"
msgstr "Batteria del portatile"
#: ../js/ui/status/power.js:248
#: ../js/ui/status/power.js:239
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
#: ../js/ui/status/power.js:241
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:252
#: ../js/ui/status/power.js:243
msgid "Mouse"
msgstr "Mouse"
#: ../js/ui/status/power.js:254
#: ../js/ui/status/power.js:245
msgid "Keyboard"
msgstr "Tastiera"
#: ../js/ui/status/power.js:256
#: ../js/ui/status/power.js:247
msgid "PDA"
msgstr "PDS"
# c'era una discussione su tp...
#: ../js/ui/status/power.js:258
#: ../js/ui/status/power.js:249
msgid "Cell phone"
msgstr "Cellulare"
#: ../js/ui/status/power.js:260
#: ../js/ui/status/power.js:251
msgid "Media player"
msgstr "Lettore multimediale"
#: ../js/ui/status/power.js:262
#: ../js/ui/status/power.js:253
msgid "Tablet"
msgstr "Tablet"
#: ../js/ui/status/power.js:264
#: ../js/ui/status/power.js:255
msgid "Computer"
msgstr "Computer"
#: ../js/ui/status/power.js:266 ../src/shell-app-system.c:1012
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Sconosciuto"
#: ../js/ui/status/volume.js:41
#: ../js/ui/status/volume.js:42
msgid "Volume"
msgstr "Volume"
#: ../js/ui/status/volume.js:54
#: ../js/ui/status/volume.js:55
msgid "Microphone"
msgstr "Microfono"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Impostazioni audio"
#: ../js/ui/telepathyClient.js:561
#, c-format
msgid "%s is online."
msgstr "%s è disponibile."
#: ../js/ui/telepathyClient.js:566
#, c-format
msgid "%s is offline."
msgstr "%s è fuori rete."
#: ../js/ui/telepathyClient.js:569
#, c-format
msgid "%s is away."
msgstr "%s è assente."
#: ../js/ui/telepathyClient.js:572
#, c-format
msgid "%s is busy."
msgstr "%s non è disponibile."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:666
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Inviato alle %-H.%M.%S di %A"
# FIXME ma ha senso in inglese???
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr "Cerca nel computer"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s è disponibile."
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s è furi rete."
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "%s è assente."
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s non è disponibile."
# FIXME -- Da rifinire..
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:663
#, c-format, fuzzy
msgid "Sent at %X on %A"
msgstr "Inviato alle %-H.%M.%S di %A"
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
@ -797,32 +919,32 @@ msgstr[1] "%u ingressi"
msgid "System Sounds"
msgstr "Audio di sistema"
#: ../src/shell-global.c:1155
#: ../src/shell-global.c:1233
msgid "Less than a minute ago"
msgstr "Meno di un minuto fa"
#: ../src/shell-global.c:1159
#: ../src/shell-global.c:1237
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minuto fa"
msgstr[1] "%d minuti fa"
#: ../src/shell-global.c:1164
#: ../src/shell-global.c:1242
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ora fa"
msgstr[1] "%d ore fa"
#: ../src/shell-global.c:1169
#: ../src/shell-global.c:1247
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d giorno fa"
msgstr[1] "%d giorni fa"
#: ../src/shell-global.c:1174
#: ../src/shell-global.c:1252
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"

504
po/nb.po
View File

@ -1,21 +1,23 @@
# Norwegian bokmål translation of gnome-shell.
# Copyright (C) 2009 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package.
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2010.
#
# Kjartan Maraas <kmaraas@gnome.org>, 2009-2010.
# Torstein Adolf Winterseth <kvikende@fsfe.org>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 2.91.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-17 14:18+0100\n"
"PO-Revision-Date: 2010-12-17 14:19+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
"POT-Creation-Date: 2011-01-15 12:41+0100\n"
"PO-Revision-Date: 2011-01-15 12:44+0100\n"
"Last-Translator: Torstein Adolf Winterseth <kvikende@fsfe.org>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Lokalize 1.1\n"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
@ -25,14 +27,6 @@ msgstr "GNOME Shell"
msgid "Window management and application launching"
msgstr "Vindushåndtering og oppstart av programmer"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
msgid "Clock"
msgstr "Klokke"
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
msgid "Customize the panel clock"
msgstr "Tilpass klokken på panelet"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
@ -42,56 +36,44 @@ msgstr ""
"F2-dialogen."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Custom format of the clock"
msgstr "Egendefinert format for klokken"
#: ../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
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:5
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:6
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "If true, display date in the clock, in addition to time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "Hour format"
msgstr "Timeformat"
msgid "If true, display seconds in time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:12
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "List of desktop file IDs for favorite applications"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#: ../data/org.gnome.shell.gschema.xml.in.h:11
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 "
@ -103,42 +85,42 @@ msgid ""
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "Show date in clock"
msgstr "Vis dato i klokken"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Show the week date in the calendar"
msgstr "Vis dato for uken i kalender"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show time with seconds"
msgstr "Vis tid med sekunder"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:19
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 "
@ -146,29 +128,11 @@ msgid ""
"remove already saved data."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "Uuids of extensions to disable"
msgstr "Uuider på utvidelser som skal slås av"
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "Whether to collect stats about applications usage"
msgstr "Om det skal samles statistikk om bruk av programmer"
@ -297,51 +261,43 @@ msgstr ""
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
msgstr ""
#: ../data/clock-preferences.ui.h:1
msgid "Clock Format"
msgstr "Klokkeformat"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:108
msgid "Could not parse command:"
msgstr "Klarte ikke å lese kommando:"
#: ../data/clock-preferences.ui.h:2
msgid "Clock Preferences"
msgstr "Brukervalg for klokke"
#: ../js/misc/util.js:130
msgid "No such application"
msgstr "Programmet finnes ikke"
#: ../data/clock-preferences.ui.h:3
msgid "Panel Display"
msgstr "Panelvisning"
#: ../js/misc/util.js:143 ../js/ui/runDialog.js:364
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:"
#: ../data/clock-preferences.ui.h:4
msgid "Show seco_nds"
msgstr "Vis seku_nder"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "Alle"
#: ../data/clock-preferences.ui.h:5
msgid "Show the _date"
msgstr "Vis _dato"
#: ../data/clock-preferences.ui.h:6
msgid "_12 hour format"
msgstr "_12-timers format"
#: ../data/clock-preferences.ui.h:7
msgid "_24 hour format"
msgstr "_24-timers format"
#: ../js/ui/appDisplay.js:215
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:245
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "BRUKERVALG"
#: ../js/ui/appDisplay.js:542
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:546
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:547
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
@ -359,122 +315,191 @@ msgstr "%s ble fjernet fra dine favoritter."
msgid "Remove"
msgstr "Fjern"
#: ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:18
msgid "RECENT ITEMS"
msgstr "SISTE OPPFØRINGER"
#: ../js/ui/lookingGlass.js:552
#: ../js/ui/endSessionDialog.js:63
#, c-format
msgid "Log Out %s"
msgstr "Logg ut %s"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
msgid "Log Out"
msgstr "Logg ut …"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr "%s vil bli logget ut automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:67
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr "Du vil bli logget ut automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system."
msgstr "Logger ut av systemet"
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr "Avslutt"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr ""
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr "Systemet vil slås av automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr "Slår av systemet."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
msgid "Restart"
msgstr "Start på nytt"
#: ../js/ui/endSessionDialog.js:85
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
#: ../js/ui/endSessionDialog.js:86
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr "Systemet vil starte på nytt automatisk om %d sekunder."
#: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system."
msgstr "Starter systemet på nytt."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr "Bekreft"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:469
msgid "Cancel"
msgstr "Avbryt"
#: ../js/ui/lookingGlass.js:556
msgid "No extensions installed"
msgstr "Ingen utvidelser installert"
#: ../js/ui/lookingGlass.js:589
#: ../js/ui/lookingGlass.js:593
msgid "Enabled"
msgstr "Aktivert"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
#: ../js/ui/lookingGlass.js:595 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr "Deaktivert"
#: ../js/ui/lookingGlass.js:593
#: ../js/ui/lookingGlass.js:597
msgid "Error"
msgstr "Feil"
#: ../js/ui/lookingGlass.js:595
#: ../js/ui/lookingGlass.js:599
msgid "Out of date"
msgstr "Utdatert"
#: ../js/ui/lookingGlass.js:620
#: ../js/ui/lookingGlass.js:624
msgid "View Source"
msgstr "Vis kildekode"
#: ../js/ui/lookingGlass.js:626
#: ../js/ui/lookingGlass.js:630
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/overview.js:96
#: ../js/ui/messageTray.js:1748
msgid "System Information"
msgstr "Systeminformasjon"
#: ../js/ui/overview.js:75
msgid "Undo"
msgstr "Angre"
#: ../js/ui/overview.js:158
#: ../js/ui/overview.js:140
msgid "Windows"
msgstr "Vinduer"
#: ../js/ui/overview.js:161
#: ../js/ui/overview.js:143
msgid "Applications"
msgstr "Programmer"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#: ../js/ui/panel.js:479
#, c-format
msgid "Quit %s"
msgstr "Avslutt %s"
#: ../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:581
#: ../js/ui/panel.js:564
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S"
#: ../js/ui/panel.js:582
#: ../js/ui/panel.js:565
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:586
#: ../js/ui/panel.js:569
msgid "%a %R:%S"
msgstr "%a %R.%S"
#: ../js/ui/panel.js:587
#: ../js/ui/panel.js:570
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:577
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %p"
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:578
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:599
#: ../js/ui/panel.js:582
msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %p"
#: ../js/ui/panel.js:600
#: ../js/ui/panel.js:583
msgid "%a %l:%M %p"
msgstr "%a %l.%M %p"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:745
#: ../js/ui/panel.js:728
msgid "Activities"
msgstr "Aktiviteter"
#: ../js/ui/placeDisplay.js:111
#: ../js/ui/placeDisplay.js:112
#, c-format
msgid "Failed to unmount '%s'"
msgstr "Klarte ikke å avmontere «%s»"
#: ../js/ui/placeDisplay.js:114
#: ../js/ui/placeDisplay.js:115
msgid "Retry"
msgstr "Prøv igjen"
#: ../js/ui/placeDisplay.js:159
#: ../js/ui/placeDisplay.js:160
msgid "Connect to..."
msgstr "Koble til..."
msgstr "Koble til"
#: ../js/ui/placeDisplay.js:558
#: ../js/ui/placeDisplay.js:559
msgid "PLACES & DEVICES"
msgstr "STEDER & ENHETER"
@ -487,84 +512,79 @@ msgstr "STEDER & ENHETER"
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
#: ../js/ui/runDialog.js:233
#: ../js/ui/runDialog.js:222
msgid "Please enter a command:"
msgstr "Oppgi en kommando:"
#: ../js/ui/runDialog.js:378
#, c-format
msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:"
#: ../js/ui/statusMenu.js:101
#: ../js/ui/statusMenu.js:102
msgid "Available"
msgstr "Tilgjengelig"
#: ../js/ui/statusMenu.js:106
#: ../js/ui/statusMenu.js:107
msgid "Busy"
msgstr "Opptatt"
#: ../js/ui/statusMenu.js:114
#: ../js/ui/statusMenu.js:115
msgid "My Account"
msgstr "Min konto"
#: ../js/ui/statusMenu.js:118
#: ../js/ui/statusMenu.js:119
msgid "System Settings"
msgstr "Systeminnstillinger"
#: ../js/ui/statusMenu.js:125
#: ../js/ui/statusMenu.js:126
msgid "Lock Screen"
msgstr "Lås skjerm"
#: ../js/ui/statusMenu.js:129
#: ../js/ui/statusMenu.js:130
msgid "Switch User"
msgstr "Bytt bruker"
#: ../js/ui/statusMenu.js:134
#: ../js/ui/statusMenu.js:135
msgid "Log Out..."
msgstr "Logg ut..."
msgstr "Logg ut"
#: ../js/ui/statusMenu.js:141
#: ../js/ui/statusMenu.js:142
msgid "Suspend..."
msgstr "Hvilemodus..."
msgstr "Hvilemodus"
#: ../js/ui/statusMenu.js:145
#: ../js/ui/statusMenu.js:146
msgid "Shut Down..."
msgstr "Avslutt..."
msgstr "Avslutt"
#: ../js/ui/status/accessibility.js:82
#: ../js/ui/status/accessibility.js:83
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:89
msgid "Screen Reader"
msgstr "Skjermleser"
#: ../js/ui/status/accessibility.js:91
#: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard"
msgstr "Tastatur på skjermen"
#: ../js/ui/status/accessibility.js:94
#: ../js/ui/status/accessibility.js:95
msgid "Visual Alerts"
msgstr "Synlig varsling"
#: ../js/ui/status/accessibility.js:97
#: ../js/ui/status/accessibility.js:98
msgid "Sticky Keys"
msgstr "Klebrige taster"
#: ../js/ui/status/accessibility.js:100
#: ../js/ui/status/accessibility.js:101
msgid "Slow Keys"
msgstr "Trege taster"
#: ../js/ui/status/accessibility.js:103
#: ../js/ui/status/accessibility.js:104
msgid "Bounce Keys"
msgstr "Spretne taster"
#: ../js/ui/status/accessibility.js:106
#: ../js/ui/status/accessibility.js:107
msgid "Mouse Keys"
msgstr "Mustaster"
#: ../js/ui/status/accessibility.js:110
#: ../js/ui/status/accessibility.js:111
msgid "Universal Access Settings"
msgstr "Innstillinger for tilgjengelighet"
@ -576,15 +596,127 @@ msgstr "Høy kontrast"
msgid "Large Text"
msgstr "Stor tekst"
#: ../js/ui/status/power.js:85
msgid "What's using power..."
msgstr "Hva bruker strøm..."
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:240
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/power.js:88
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "Synlighet"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "Send filer til enhet..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "Sett opp en ny enhet..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "Innstillinger for Bluetooth"
#: ../js/ui/status/bluetooth.js:191
msgid "Connection"
msgstr "Tilkobling"
#: ../js/ui/status/bluetooth.js:227
msgid "Send Files..."
msgstr "Send filer..."
#: ../js/ui/status/bluetooth.js:232
msgid "Browse Files..."
msgstr "Bla gjennom filer..."
#: ../js/ui/status/bluetooth.js:241
msgid "Error browsing device"
msgstr "Feil under lesing av enhet"
#: ../js/ui/status/bluetooth.js:242
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "Kan ikke bla gjennom forespurt enhet. Feilen er «%s»"
#: ../js/ui/status/bluetooth.js:250 ../js/ui/status/keyboard.js:78
msgid "Keyboard Settings"
msgstr "Innstillinger for tastatur"
#: ../js/ui/status/bluetooth.js:255
msgid "Mouse Settings"
msgstr "Innstillinger for mus"
#: ../js/ui/status/bluetooth.js:262 ../js/ui/status/volume.js:63
msgid "Sound Settings"
msgstr "Innstillinger for lyd"
#: ../js/ui/status/bluetooth.js:336 ../js/ui/status/bluetooth.js:370
#: ../js/ui/status/bluetooth.js:410 ../js/ui/status/bluetooth.js:443
msgid "Bluetooth Agent"
msgstr "Bluetooth-agent"
#: ../js/ui/status/bluetooth.js:371
#, c-format
msgid "Authorization request from %s"
msgstr "Forespørsel om autorisering fra %s"
#: ../js/ui/status/bluetooth.js:377
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "Enhet %s vil ha tilgang til tjenesten «%s»"
#: ../js/ui/status/bluetooth.js:379
msgid "Always grant access"
msgstr "Alltid gi tilgang"
#: ../js/ui/status/bluetooth.js:380
msgid "Grant this time only"
msgstr "Gi tilgang kun denne ene gangen"
#: ../js/ui/status/bluetooth.js:381
msgid "Reject"
msgstr "Avvis"
#: ../js/ui/status/bluetooth.js:411
#, c-format
msgid "Pairing confirmation for %s"
msgstr "Bekreftelse for tilkobling for %s"
#: ../js/ui/status/bluetooth.js:417 ../js/ui/status/bluetooth.js:451
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "Enhet %s vil koble seg sammen med denne datamaskinen"
#: ../js/ui/status/bluetooth.js:418
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "Vennligst bekreft om PIN «%s» er lik den som brukes på enheten."
#: ../js/ui/status/bluetooth.js:420
msgid "Matches"
msgstr "Stemmer overens"
#: ../js/ui/status/bluetooth.js:421
msgid "Does not match"
msgstr "Stemmer ikke overens"
#: ../js/ui/status/bluetooth.js:444
#, c-format
msgid "Pairing request for %s"
msgstr "Forespørsel om tilkobling for %s"
#: ../js/ui/status/bluetooth.js:452
msgid "Please enter the PIN mentioned on the device."
msgstr "Vennligst oppgi PIN som oppgitt på enheten."
#: ../js/ui/status/bluetooth.js:468
msgid "OK"
msgstr "OK"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "Innstillinger for strøm"
#: ../js/ui/status/power.js:115
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -592,106 +724,102 @@ msgstr[0] "%d time gjenstår"
msgstr[1] "%d timer gjenstår"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:118
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s gjenstår"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "time"
msgstr[1] "timer"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "minutt"
msgstr[1] "minutter"
#: ../js/ui/status/power.js:123
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:240
#: ../js/ui/status/power.js:235
msgid "AC adapter"
msgstr "Strømadapter"
#: ../js/ui/status/power.js:242
#: ../js/ui/status/power.js:237
msgid "Laptop battery"
msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:244
#: ../js/ui/status/power.js:239
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:246
#: ../js/ui/status/power.js:241
msgid "Monitor"
msgstr "Skjerm"
#: ../js/ui/status/power.js:248
#: ../js/ui/status/power.js:243
msgid "Mouse"
msgstr "Mus"
#: ../js/ui/status/power.js:250
#: ../js/ui/status/power.js:245
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/status/power.js:252
#: ../js/ui/status/power.js:247
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:254
#: ../js/ui/status/power.js:249
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:256
#: ../js/ui/status/power.js:251
msgid "Media player"
msgstr "Medieavspiller"
#: ../js/ui/status/power.js:258
#: ../js/ui/status/power.js:253
msgid "Tablet"
msgstr "Nettbrett"
#: ../js/ui/status/power.js:260
#: ../js/ui/status/power.js:255
msgid "Computer"
msgstr "Datamaskin"
#: ../js/ui/status/power.js:262 ../src/shell-app-system.c:1012
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "Ukjent"
#: ../js/ui/status/volume.js:41
#: ../js/ui/status/volume.js:42
msgid "Volume"
msgstr "Volum"
#: ../js/ui/status/volume.js:54
#: ../js/ui/status/volume.js:55
msgid "Microphone"
msgstr "Mikrofon"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "Innstillinger for lyd"
#: ../js/ui/telepathyClient.js:560
#: ../js/ui/telepathyClient.js:561
#, c-format
msgid "%s is online."
msgstr "%s er tilkoblet."
#: ../js/ui/telepathyClient.js:565
#: ../js/ui/telepathyClient.js:566
#, c-format
msgid "%s is offline."
msgstr "%s er frakoblet."
#: ../js/ui/telepathyClient.js:568
#: ../js/ui/telepathyClient.js:569
#, c-format
msgid "%s is away."
msgstr "«%s» er borte."
#: ../js/ui/telepathyClient.js:571
#: ../js/ui/telepathyClient.js:572
#, c-format
msgid "%s is busy."
msgstr "%s er opptatt."
@ -699,7 +827,7 @@ msgstr "%s er opptatt."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#: ../js/ui/telepathyClient.js:666
#, no-c-format
msgid "Sent at %X on %A"
msgstr "Sendt %X på %A"
@ -751,32 +879,32 @@ msgstr[1] "%u innganger"
msgid "System Sounds"
msgstr "Systemlyder"
#: ../src/shell-global.c:1155
#: ../src/shell-global.c:1233
msgid "Less than a minute ago"
msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1159
#: ../src/shell-global.c:1237
#, 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:1164
#: ../src/shell-global.c:1242
#, 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:1169
#: ../src/shell-global.c:1247
#, 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:1174
#: ../src/shell-global.c:1252
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"

718
po/pa.po

File diff suppressed because it is too large Load Diff

765
po/sv.po

File diff suppressed because it is too large Load Diff

511
po/ug.po
View File

@ -8,9 +8,8 @@
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"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2010-12-20 21:07+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"
@ -47,28 +46,21 @@ msgstr "سائەتنىڭ ئىختىيارىي فورماتى"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق "
"كىرىشىگە قۇلايلىق"
msgstr "ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق كىرىشىگە قۇلايلىق"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "File extension used for storing the screencast"
msgstr ""
"ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن "
"ئاتى "
msgstr "ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن ئاتى"
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "Framerate used for recording screencasts."
msgstr ""
"ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
msgstr "ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
#: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
msgstr ""
"GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا "
"يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
msgstr "GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for command (Alt-F2) dialog"
@ -82,17 +74,13 @@ msgstr "سائەت فورماتى"
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
"clock, in addition to time."
msgstr ""
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
"كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid ""
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
"time."
msgstr ""
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
"كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ. "
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "If true, display the ISO week date in the calendar."
@ -100,13 +88,9 @@ msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپت
#: ../data/org.gnome.shell.gschema.xml.in.h:12
msgid "List of desktop file IDs for favorite applications"
msgstr "ئامراق قوللىنىشچان پروگراممىلارنىڭ ئۈستەل ئۈستى ھۆججەت ID تىزىملىكى"
msgstr "ئامراق پروگراممىلارنىڭ ئۈستەلئۈستى ھۆججەت ID تىزىملىكى"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
msgid "Overview workspace view mode"
msgstr "خىزمەت رايون كۆرۈنۈش ھالىتى ھەققىدە قىسقىچە بايان"
#: ../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 "
@ -116,91 +100,60 @@ msgid ""
"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 شەكلىدە "
"خاتىرىلىنىدۇ."
msgstr "ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان GStreamer ئاقما لىنىيىنى تەڭشەيدۇ. ئۇ gst-launch گرامماتىكىسىغا بوي سۇنىدۇ. بۇ ئاقما لىنىيىدە ئۇلانمىغان sink pad بولۇشى لازىم، خاتىرىلىنىدىغان سىن مۇشۇ جايدا خاتىرىلىنىدۇ. بۇ لىنىيىدە ئادەتتە يەنە بىر ئۇلانمىغان مەنبە pad بولىدۇ؛ بۇ pad چىقارغان ئۇچۇرلار ھۆججەتكە يېزىلىدۇ. ئەمما ئاقما لىنىيە ئۆزىنىڭ چىقىرىشىنى بىر تەرەپ قىلالايدۇ، بۇنداق بولغاندا shout2send ئارقىلىق ياكى شۇنىڭغا ئوخشاش ئۇسۇلدا چىقىرىشنى icecast مۇلازىمېتىرىغا يوللايدۇ. ئاقما لىنىيە تەڭشەلمىگەن ياكى بوش قىممەتكە تەڭشەلگەندە كۆڭۈلدىكى ئاقما لىنىيە قوزغىتىلىدۇ. ئۇنىڭ نۆۋەتتىكى قىممىتى 'videorate ! theoraenc ! oggmux' بولۇپ، فورماتى Ogg شەكلىدە خاتىرىلىنىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:15
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr "سائەت ئىچىدە چېسلا كۆرسەت"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr "يىلنامىدە ھەپتىنى كۆرسىتىدۇ"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr "ۋاقىت ئىچىدە سېكۇنتنى بىللە كۆرسەت"
#: ../data/org.gnome.shell.gschema.xml.in.h:18
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr "مۇناسىپ پروگرامما بەلگىسى يىغقۇچ رايونىدا كۆرسىتىلىدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
"The filename for recorded screencasts will be a unique filename based on the "
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ "
"بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا "
"خاتىرىلەيدۇ."
msgstr "خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا خاتىرىلەيدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:20
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى "
"كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
msgstr "GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
#: ../data/org.gnome.shell.gschema.xml.in.h:21
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr "ئېكران كەسمىسىنى كودلاشتا ئىشلىتىلىدىغان gstreamer ئاقما لىنىيىسى"
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"The selected workspace view mode in the overview. Supported values are "
"\"single\" and \"grid\"."
msgstr ""
"قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە "
"بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
"The shell normally monitors active applications in order to present the most "
"used ones (e.g. in launchers). While this data will be kept private, you may "
"want to disable this for privacy reasons. Please note that doing so won't "
"remove already saved data."
msgstr ""
"چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار"
"(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي "
"ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق "
"قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
msgstr "چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
#: ../data/org.gnome.shell.gschema.xml.in.h:24
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid ""
"This key specifies the format used by the panel clock when the format key is "
"set to \"custom\". You can use conversion specifiers understood by strftime"
"() to obtain a specific format. See the strftime() manual for more "
"information."
msgstr ""
"format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا "
"تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات "
"بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() "
"نىڭ قوللانمىسىدىن كۆرۈڭ."
msgstr "format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() نىڭ قوللانمىسىدىن كۆرۈڭ."
#: ../data/org.gnome.shell.gschema.xml.in.h:25
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid ""
"This key specifies the hour format used by the panel clock. Possible values "
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
@ -208,20 +161,13 @@ msgid ""
"to \"custom\", the clock will display time according to the format specified "
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
"the show_date and show_seconds keys are ignored."
msgstr ""
"بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى "
"بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، "
"\"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت "
"ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. "
"ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە "
"ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە "
"show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
msgstr "بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، \"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
#: ../data/org.gnome.shell.gschema.xml.in.h:26
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "Uuids of extensions to disable"
msgstr "چەكلىنىدىغان كېڭەيتىلمىنىڭ Uuid سى"
#: ../data/org.gnome.shell.gschema.xml.in.h:27
#: ../data/org.gnome.shell.gschema.xml.in.h:25
msgid "Whether to collect stats about applications usage"
msgstr "پروگراممىنىڭ ئىشلىتىلىشى ھەققىدىكى ستاتىستىكىنى توپلامدۇ يوق"
@ -237,8 +183,7 @@ msgstr "نىشانلىغۇچنىڭ رەڭگى"
msgid ""
"Determines the length of the vertical and horizontal lines that make up the "
"crosshairs."
msgstr ""
"نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ ئۇزۇنلۇقى بەلگىلىنىدۇ."
msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ ئۇزۇنلۇقى بەلگىلىنىدۇ."
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
msgid ""
@ -305,7 +250,7 @@ msgstr "ئېكران ئورنى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
msgid "Scroll magnified contents beyond the edges of the desktop"
msgstr "دومىلىما چوڭايتقۇچ ئۈستەل ئۈستى گىرۋەك مەزمۇنىدىن ھالقىپ كەتتى"
msgstr "دومىلىما چوڭايتقۇچ ئۈستەلئۈستى گىرۋەك مەزمۇنىدىن ھالقىپ كەتتى"
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
msgid "Show or hide crosshairs"
@ -379,62 +324,45 @@ msgstr "_12 سائەت فورماتى"
msgid "_24 hour format"
msgstr "_24 سائەت فورماتى"
#. **** Applications ****
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
#: ../js/ui/appDisplay.js:154
msgid "All"
msgstr "ھەممىسى"
#: ../js/ui/appDisplay.js:235
msgid "APPLICATIONS"
msgstr "پروگراممىلار"
#: ../js/ui/appDisplay.js:348
#: ../js/ui/appDisplay.js:265
msgid "PREFERENCES"
msgstr "مايىللىق"
#: ../js/ui/appDisplay.js:647
#: ../js/ui/appDisplay.js:562
msgid "New Window"
msgstr "يېڭى كۆزنەك"
#: ../js/ui/appDisplay.js:651
#: ../js/ui/appDisplay.js:566
msgid "Remove from Favorites"
msgstr "يىغقۇچتىن چىقىرىۋەت"
#: ../js/ui/appDisplay.js:652
#: ../js/ui/appDisplay.js:567
msgid "Add to Favorites"
msgstr "يىغقۇچقا قوش"
#: ../js/ui/appDisplay.js:829
msgid "Drag here to add favorites"
msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش"
#: ../js/ui/appFavorites.js:88
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
#: ../js/ui/appFavorites.js:107
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr "%s يىغقۇچىڭىزدىن چىقىرىۋېتىلىدۇ."
#: ../js/ui/dash.js:142
msgid "Find"
msgstr "ئىزدە"
#: ../js/ui/dash.js:27
msgid "Remove"
msgstr "چىقىرىۋەت"
#: ../js/ui/dash.js:473
msgid "Searching..."
msgstr "ئىزدەۋاتىدۇ..."
#: ../js/ui/dash.js:487
msgid "No matching results."
msgstr "ماس كېلىدىغان نەتىجە يوق."
#. **** Places ****
#. Translators: This is in the sense of locations for documents,
#. network locations, etc.
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
#. **** Documents ****
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
#: ../js/ui/docDisplay.js:494
msgid "RECENT ITEMS"
msgstr "يېقىنقى تۈرلەر"
@ -468,63 +396,72 @@ msgstr "مەنبەنى كۆرسەت"
msgid "Web Page"
msgstr "توربەت"
#: ../js/ui/overview.js:160
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "يېنىۋال"
#: ../js/ui/overview.js:158
#| msgid "New Window"
msgid "Windows"
msgstr "كۆزنەكلەر"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "پروگراممىلار"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "%s چېكىن"
#: ../js/ui/panel.js:495
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "مايىللىق"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%a %b %e، %R:%S"
#: ../js/ui/panel.js:582
#: ../js/ui/panel.js:586
msgid "%a %b %e, %R"
msgstr "%a %b %e، %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/panel.js:587
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %b %e، %l:%M:%S %p"
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%a %b %e، %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p"
#: ../js/ui/panel.js:600
#: ../js/ui/panel.js:604
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
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "پائالىيەتلەر"
@ -541,6 +478,10 @@ msgstr "قايتا سىنا"
msgid "Connect to..."
msgstr "باغلىنىش…"
#: ../js/ui/placeDisplay.js:558
msgid "PLACES & DEVICES"
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
@ -568,16 +509,14 @@ msgid "Busy"
msgstr "ئالدىراش"
#: ../js/ui/statusMenu.js:114
#, fuzzy
#| msgid "My Account..."
msgid "My Account"
msgstr "ھېساباتىم"
msgstr "ھېساباتىم"
#: ../js/ui/statusMenu.js:118
#, fuzzy
#| msgid "System Settings..."
msgid "System Settings"
msgstr "سىستېما تەڭشەكلىرى..."
msgstr "سىستېما تەڭشىكى"
#: ../js/ui/statusMenu.js:125
msgid "Lock Screen"
@ -592,15 +531,18 @@ msgid "Log Out..."
msgstr "تىزىمدىن چىقىش…"
#: ../js/ui/statusMenu.js:141
#, fuzzy
#| msgid "Suspend"
msgid "Suspend..."
msgstr "توڭلات"
msgstr ""
#: ../js/ui/statusMenu.js:145
msgid "Shut Down..."
msgstr "تاقا…"
#: ../js/ui/status/accessibility.js:82
msgid "Zoom"
msgstr "كېڭەيت تارايت"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr "ئېكران ئوقۇغۇچ"
@ -641,9 +583,262 @@ msgstr "يۇقىرى ئاق-قارىلىقى"
msgid "Large Text"
msgstr "چوڭ تېكىست"
#: ../js/ui/status/accessibility.js:224
msgid "Zoom"
msgstr "كېڭەيت تارايت"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:200
msgid "Bluetooth"
msgstr "كۆكچىش"
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "كۆرۈشچانلىقى"
#: ../js/ui/status/bluetooth.js:68
msgid "Send Files to Device..."
msgstr ""
#: ../js/ui/status/bluetooth.js:71
msgid "Setup a New Device..."
msgstr ""
#: ../js/ui/status/bluetooth.js:94
#| msgid "System Settings..."
msgid "Bluetooth Settings"
msgstr ""
#: ../js/ui/status/bluetooth.js:151
#| msgid "Connect to..."
msgid "Connection"
msgstr "باغلىنىش"
#: ../js/ui/status/bluetooth.js:187
#| msgid "Suspend"
msgid "Send Files..."
msgstr ""
#: ../js/ui/status/bluetooth.js:192
msgid "Browse Files..."
msgstr ""
#: ../js/ui/status/bluetooth.js:201
msgid "Error browsing device"
msgstr ""
#: ../js/ui/status/bluetooth.js:202
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr ""
#: ../js/ui/status/bluetooth.js:210
#| msgid "System Settings..."
msgid "Keyboard Settings"
msgstr ""
#: ../js/ui/status/bluetooth.js:215
#| msgid "System Settings..."
msgid "Mouse Settings"
msgstr ""
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/volume.js:62
#| msgid "System Settings..."
msgid "Sound Settings"
msgstr ""
#: ../js/ui/status/bluetooth.js:293 ../js/ui/status/bluetooth.js:327
#: ../js/ui/status/bluetooth.js:367 ../js/ui/status/bluetooth.js:400
msgid "Bluetooth Agent"
msgstr ""
#: ../js/ui/status/bluetooth.js:328
#, c-format
msgid "Authorization request from %s"
msgstr ""
#: ../js/ui/status/bluetooth.js:334
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr ""
#: ../js/ui/status/bluetooth.js:336
msgid "Always grant access"
msgstr ""
#: ../js/ui/status/bluetooth.js:337
msgid "Grant this time only"
msgstr ""
#: ../js/ui/status/bluetooth.js:338
msgid "Reject"
msgstr "رەت قىل"
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Pairing confirmation for %s"
msgstr ""
#: ../js/ui/status/bluetooth.js:374 ../js/ui/status/bluetooth.js:408
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr ""
#: ../js/ui/status/bluetooth.js:375
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr ""
#: ../js/ui/status/bluetooth.js:377
msgid "Matches"
msgstr "جۈپلەش تۈرى"
#: ../js/ui/status/bluetooth.js:378
msgid "Does not match"
msgstr "جۈپلىمە"
#: ../js/ui/status/bluetooth.js:401
#, c-format
msgid "Pairing request for %s"
msgstr ""
#: ../js/ui/status/bluetooth.js:409
msgid "Please enter the PIN mentioned on the device."
msgstr ""
#: ../js/ui/status/bluetooth.js:425
msgid "OK"
msgstr "جەزملە"
#: ../js/ui/status/bluetooth.js:426
msgid "Cancel"
msgstr "ۋاز كەچ"
#: ../js/ui/status/power.js:85
#| msgid "System Settings..."
msgid "Power Settings"
msgstr ""
#: ../js/ui/status/power.js:112
#, c-format
#| msgid "%d hour ago"
#| msgid_plural "%d hours ago"
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] ""
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr ""
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "سائەت"
#: ../js/ui/status/power.js:117
#| msgid "%d minute ago"
#| msgid_plural "%d minutes ago"
msgid "minute"
msgid_plural "minutes"
msgstr[0] "مىنۇت"
#: ../js/ui/status/power.js:120
#, c-format
#| msgid "%d minute ago"
#| msgid_plural "%d minutes ago"
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] ""
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr ""
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr ""
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "ئېكران"
#: ../js/ui/status/power.js:245
#| msgid "Mouse Keys"
msgid "Mouse"
msgstr "چاشقىنەك"
#: ../js/ui/status/power.js:247
#| msgid "Screen Keyboard"
msgid "Keyboard"
msgstr "ھەرپتاختا"
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr ""
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "Media چالغۇ"
#: ../js/ui/status/power.js:255
#| msgid "Enabled"
msgid "Tablet"
msgstr "سەزمە تاختا"
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "كومپيۇتېر"
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "نامەلۇم"
#: ../js/ui/status/volume.js:41
msgid "Volume"
msgstr "دىسكا"
#: ../js/ui/status/volume.js:54
msgid "Microphone"
msgstr ""
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr ""
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr ""
#: ../js/ui/telepathyClient.js:568
#, c-format
#| msgid "'%s' is ready"
msgid "%s is away."
msgstr ""
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr ""
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:664
#, no-c-format
msgid "Sent at %X on %A"
msgstr ""
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
msgstr ""
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
@ -655,12 +850,12 @@ msgstr "%s باشلاشنى تاماملىدى"
msgid "'%s' is ready"
msgstr "«%s» تەييار"
#: ../js/ui/workspacesView.js:229
#: ../js/ui/workspacesView.js:244
msgid ""
"Can't add a new workspace because maximum workspaces limit has been reached."
msgstr "يېڭى خىزمەت رايونى قوشالمايدۇ چۈنكى ئەڭ كۆپ خىزمەت رايون چېكىگە يەتتى."
#: ../js/ui/workspacesView.js:246
#: ../js/ui/workspacesView.js:260
msgid "Can't remove the first workspace."
msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋەتكىلى بولمايدۇ."
@ -684,33 +879,29 @@ msgstr[0] "%u كىرگۈزۈلمە"
msgid "System Sounds"
msgstr "سىستېما ئاۋازى"
#: ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "نامەلۇم"
#: ../src/shell-global.c:1163
#: ../src/shell-global.c:1155
msgid "Less than a minute ago"
msgstr "بىر مىنۇتتىنمۇ ئىلگىرى"
#: ../src/shell-global.c:1167
#: ../src/shell-global.c:1159
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d مىنۇت ئىلگىرى"
#: ../src/shell-global.c:1172
#: ../src/shell-global.c:1164
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d سائەت ئىلگىرى"
#: ../src/shell-global.c:1177
#: ../src/shell-global.c:1169
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d كۈن ئىلگىرى"
#: ../src/shell-global.c:1182
#: ../src/shell-global.c:1174
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -738,7 +929,29 @@ msgstr "ئىزدە"
#: ../src/shell-util.c:300
#, c-format
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s "
msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "خىزمەت رايون كۆرۈنۈش ھالىتى ھەققىدە قىسقىچە بايان"
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە "
#~ "بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»"
#~ msgid "Drag here to add favorites"
#~ msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش"
#~ msgid "Find"
#~ msgstr "ئىزدە"
#~ msgid "Searching..."
#~ msgstr "ئىزدەۋاتىدۇ..."
#~ msgid "No matching results."
#~ msgstr "ماس كېلىدىغان نەتىجە يوق."
#~ msgid "Invisible"
#~ msgstr "يوشۇرۇن"

893
po/vi.po

File diff suppressed because it is too large Load Diff

View File

@ -7,14 +7,15 @@
# Jessica Ban <bancage@gmail.com>, 2010.
# YunQiang Su <wzssyqa@gmail.com>, 2010.
# zhang ping <zhangping159@gmail.com>, 2010.
# 指冷玉笙寒 (dhyang) <dhyang555@gmail.com>, 2010
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2010-12-10 00:17+0000\n"
"PO-Revision-Date: 2010-12-12 15:45+0800\n"
"POT-Creation-Date: 2010-12-23 17:30+0000\n"
"PO-Revision-Date: 2010-12-25 20:54+0800\n"
"Last-Translator: Aron Xu <happyaron.xu@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
"MIME-Version: 1.0\n"
@ -356,23 +357,28 @@ msgstr "_12 时格式"
msgid "_24 hour format"
msgstr "_24 小时格式"
#: ../js/ui/appDisplay.js:215
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:155
msgid "All"
msgstr "全部"
#: ../js/ui/appDisplay.js:236
msgid "APPLICATIONS"
msgstr "应用程序"
#: ../js/ui/appDisplay.js:245
#: ../js/ui/appDisplay.js:266
msgid "PREFERENCES"
msgstr "首选项"
#: ../js/ui/appDisplay.js:542
#: ../js/ui/appDisplay.js:563
msgid "New Window"
msgstr "新窗口"
#: ../js/ui/appDisplay.js:546
#: ../js/ui/appDisplay.js:567
msgid "Remove from Favorites"
msgstr "从收藏夹中移除"
#: ../js/ui/appDisplay.js:547
#: ../js/ui/appDisplay.js:568
msgid "Add to Favorites"
msgstr "添加到收藏夹"
@ -424,63 +430,71 @@ msgstr "查看源"
msgid "Web Page"
msgstr "网页"
#: ../js/ui/overview.js:112
#: ../js/ui/overview.js:96
msgid "Undo"
msgstr "撤销"
#: ../js/ui/overview.js:158
msgid "Windows"
msgstr "窗口"
#: ../js/ui/overview.js:161
msgid "Applications"
msgstr "应用程序"
#. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:470
#: ../js/ui/panel.js:474
#, c-format
msgid "Quit %s"
msgstr "退出 %s"
#: ../js/ui/panel.js:495
#: ../js/ui/panel.js:499
msgid "Preferences"
msgstr "首选项"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/panel.js:581
#: ../js/ui/panel.js:585
msgid "%a %b %e, %R:%S"
msgstr "%A %b %e, %R:%S"
#: ../js/ui/panel.js:582
#: ../js/ui/panel.js:586
msgid "%a %b %e, %R"
msgstr "%A %m月%d日 %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/panel.js:586
#: ../js/ui/panel.js:590
msgid "%a %R:%S"
msgstr "%A %R:%S"
#: ../js/ui/panel.js:587
#: ../js/ui/panel.js:591
msgid "%a %R"
msgstr "%A %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/panel.js:594
#: ../js/ui/panel.js:598
msgid "%a %b %e, %l:%M:%S %p"
msgstr "%A %m月%d日 %p%I:%M:%S"
#: ../js/ui/panel.js:595
#: ../js/ui/panel.js:599
msgid "%a %b %e, %l:%M %p"
msgstr "%A %m月%d日 %p%I:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/panel.js:599
#: ../js/ui/panel.js:603
msgid "%a %l:%M:%S %p"
msgstr "%A %p%I:%M:%S"
#: ../js/ui/panel.js:600
#: ../js/ui/panel.js:604
msgid "%a %l:%M %p"
msgstr "%a %l:%M %p"
#. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:745
#: ../js/ui/panel.js:749
msgid "Activities"
msgstr "活动"
@ -599,87 +613,203 @@ msgstr "高对比度"
msgid "Large Text"
msgstr "大号文本"
#: ../js/ui/status/power.js:87
msgid "What's using power..."
msgstr "哪些设备在用电..."
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:234
msgid "Bluetooth"
msgstr "蓝牙"
#: ../js/ui/status/power.js:90
#: ../js/ui/status/bluetooth.js:55
msgid "Visibility"
msgstr "可见性"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr "发送文件到设备..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr "安装新设备..."
#: ../js/ui/status/bluetooth.js:94
msgid "Bluetooth Settings"
msgstr "蓝牙设置"
#: ../js/ui/status/bluetooth.js:185
msgid "Connection"
msgstr "连接"
#: ../js/ui/status/bluetooth.js:221
msgid "Send Files..."
msgstr "发送文件..."
#: ../js/ui/status/bluetooth.js:226
msgid "Browse Files..."
msgstr "浏览文件..."
#: ../js/ui/status/bluetooth.js:235
msgid "Error browsing device"
msgstr "浏览设备出错"
#: ../js/ui/status/bluetooth.js:236
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr "无法浏览请求的设备,错误为 %s"
#: ../js/ui/status/bluetooth.js:244
msgid "Keyboard Settings"
msgstr "键盘设置"
#: ../js/ui/status/bluetooth.js:249
msgid "Mouse Settings"
msgstr "鼠标设置"
#: ../js/ui/status/bluetooth.js:256 ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "声音设置"
#: ../js/ui/status/bluetooth.js:327 ../js/ui/status/bluetooth.js:361
#: ../js/ui/status/bluetooth.js:401 ../js/ui/status/bluetooth.js:434
msgid "Bluetooth Agent"
msgstr "蓝牙助手"
#: ../js/ui/status/bluetooth.js:362
#, c-format
msgid "Authorization request from %s"
msgstr "来自 %s 的认证请求"
#: ../js/ui/status/bluetooth.js:368
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr "设备 %s 希望访问 %s 服务"
#: ../js/ui/status/bluetooth.js:370
msgid "Always grant access"
msgstr "始终允许"
#: ../js/ui/status/bluetooth.js:371
msgid "Grant this time only"
msgstr "允许一次"
#: ../js/ui/status/bluetooth.js:372
msgid "Reject"
msgstr "拒绝"
#: ../js/ui/status/bluetooth.js:402
#, c-format
msgid "Pairing confirmation for %s"
msgstr "%s 的配对确认"
#: ../js/ui/status/bluetooth.js:408 ../js/ui/status/bluetooth.js:442
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr "设备 %s 希望与此电脑配对"
#: ../js/ui/status/bluetooth.js:409
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "请确认 PIN 码 %s 和要配对的设备是否相同。"
#: ../js/ui/status/bluetooth.js:411
msgid "Matches"
msgstr "相同"
#: ../js/ui/status/bluetooth.js:412
msgid "Does not match"
msgstr "不同"
#: ../js/ui/status/bluetooth.js:435
#, c-format
msgid "Pairing request for %s"
msgstr "%s 的配对请求"
#: ../js/ui/status/bluetooth.js:443
msgid "Please enter the PIN mentioned on the device."
msgstr "请输入设备上的 PIN 码。"
#: ../js/ui/status/bluetooth.js:459
msgid "OK"
msgstr "确定"
#: ../js/ui/status/bluetooth.js:460
msgid "Cancel"
msgstr "取消"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr "电源设置"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] "剩余 %d 小时"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr "剩余 %d %s %d %s"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] "小时"
#: ../js/ui/status/power.js:122
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] "分钟"
#: ../js/ui/status/power.js:125
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "剩余 %d 分钟"
#: ../js/ui/status/power.js:244
#: ../js/ui/status/power.js:237
msgid "AC adapter"
msgstr "AC 适配器"
#: ../js/ui/status/power.js:246
#: ../js/ui/status/power.js:239
msgid "Laptop battery"
msgstr "笔记本电池"
#: ../js/ui/status/power.js:248
#: ../js/ui/status/power.js:241
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:250
#: ../js/ui/status/power.js:243
msgid "Monitor"
msgstr "显示器"
#: ../js/ui/status/power.js:252
#: ../js/ui/status/power.js:245
msgid "Mouse"
msgstr "鼠标"
#: ../js/ui/status/power.js:254
#: ../js/ui/status/power.js:247
msgid "Keyboard"
msgstr "键盘"
#: ../js/ui/status/power.js:256
#: ../js/ui/status/power.js:249
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:258
#: ../js/ui/status/power.js:251
msgid "Cell phone"
msgstr "手机"
#: ../js/ui/status/power.js:260
#: ../js/ui/status/power.js:253
msgid "Media player"
msgstr "媒体播放器"
#: ../js/ui/status/power.js:262
#: ../js/ui/status/power.js:255
msgid "Tablet"
msgstr "触摸板"
#: ../js/ui/status/power.js:264
#: ../js/ui/status/power.js:257
msgid "Computer"
msgstr "计算机"
#: ../js/ui/status/power.js:266 ../src/shell-app-system.c:1012
#: ../js/ui/status/power.js:259 ../src/shell-app-system.c:1012
msgid "Unknown"
msgstr "未知"
@ -691,9 +821,33 @@ msgstr "音量"
msgid "Microphone"
msgstr "麦克风"
#: ../js/ui/status/volume.js:62
msgid "Sound Settings"
msgstr "声音设置"
#: ../js/ui/telepathyClient.js:560
#, c-format
msgid "%s is online."
msgstr "%s 在线。"
#: ../js/ui/telepathyClient.js:565
#, c-format
msgid "%s is offline."
msgstr "%s 离线。"
#: ../js/ui/telepathyClient.js:568
#, c-format
msgid "%s is away."
msgstr "%s 离开。"
#: ../js/ui/telepathyClient.js:571
#, c-format
msgid "%s is busy."
msgstr "%s 忙碌。"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:665
#, no-c-format
msgid "Sent at %X on %A"
msgstr "发送于 %X on %A"
#: ../js/ui/viewSelector.js:26
msgid "Search your computer"
@ -738,29 +892,29 @@ msgstr[0] "%u 个输入"
msgid "System Sounds"
msgstr "系统声音"
#: ../src/shell-global.c:1155
#: ../src/shell-global.c:1156
msgid "Less than a minute ago"
msgstr "少于一分钟前"
#: ../src/shell-global.c:1159
#: ../src/shell-global.c:1160
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d 分钟前"
#: ../src/shell-global.c:1164
#: ../src/shell-global.c:1165
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d 小时前"
#: ../src/shell-global.c:1169
#: ../src/shell-global.c:1170
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d 天前"
#: ../src/shell-global.c:1174
#: ../src/shell-global.c:1175
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -790,6 +944,9 @@ msgstr "搜索"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "What's using power..."
#~ msgstr "哪些设备在用电..."
#~ msgid "Overview workspace view mode"
#~ msgstr "工作区视图模式的总览"
@ -830,9 +987,6 @@ msgstr "%1$s: %2$s"
#~ msgid "%H:%M"
#~ msgstr "%H:%M"
#~ msgid "Applications"
#~ msgstr "应用程序"
#~ msgid "Recent Documents"
#~ msgstr "最近文档"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -100,13 +100,19 @@ st_source_h = \
st/st-widget.h \
$(NULL)
st.h: Makefile
st.h: stamp-st.h
@true
stamp-st.h: Makefile
$(AM_V_GEN) (echo "#define ST_H_INSIDE 1"; \
for name in $(st_source_h); do \
echo "#include <"$$name">"; \
done; echo "#undef ST_H_INSIDE") > st.h.tmp && mv st.h.tmp st.h
done; echo "#undef ST_H_INSIDE") > $@.tmp && \
(cmp -s $@.tmp st.h || cp $@.tmp st.h) && \
rm -f $@.tmp && \
echo timestamp > $(@F)
BUILT_SOURCES += st.h
CLEANFILES += stamp-st.h
st_source_private_h = \
st/st-private.h \

View File

@ -15,7 +15,6 @@ TRAY_STAMP_FILES = stamp-na-marshal.h
# please, keep this sorted alphabetically
tray_source = \
gtk-compat.h \
tray/na-tray-child.c \
tray/na-tray-child.h \
tray/na-tray-manager.c \

View File

@ -8,7 +8,7 @@ noinst_PROGRAMS =
.AUTOPARALLEL:
bin_SCRIPTS = gnome-shell gnome-shell-clock-preferences
bin_SCRIPTS = gnome-shell
gnome-shell: gnome-shell.in
$(AM_V_GEN) sed -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
@ -23,15 +23,6 @@ gnome-shell: gnome-shell.in
CLEANFILES += gnome-shell
EXTRA_DIST += gnome-shell.in
gnome-shell-clock-preferences: gnome-shell-clock-preferences.in
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
-e "s|@localedir[@]|$(datadir)/locale|" \
-e "s|@GJS_CONSOLE[@]|$(GJS_CONSOLE)|" \
$< > $@ && chmod a+x $@
CLEANFILES += gnome-shell-clock-preferences
EXTRA_DIST += gnome-shell-clock-preferences.in
include Makefile-gdmuser.am
include Makefile-st.am
include Makefile-tray.am
@ -68,7 +59,6 @@ shell_public_headers_h = \
shell-embedded-window.h \
shell-generic-container.h \
shell-gtk-embed.h \
shell-process.h \
shell-global.h \
shell-perf-log.h \
shell-slicer.h \
@ -90,7 +80,6 @@ libgnome_shell_la_SOURCES = \
shell-window-tracker-private.h \
shell-wm-private.h \
gnome-shell-plugin.c \
gtk-compat.h \
shell-app.c \
shell-app-system.c \
shell-app-usage.c \
@ -100,7 +89,6 @@ libgnome_shell_la_SOURCES = \
shell-embedded-window.c \
shell-generic-container.c \
shell-gtk-embed.c \
shell-process.c \
shell-global.c \
shell-perf-log.c \
shell-slicer.c \

View File

@ -3059,15 +3059,6 @@ gdm_user_manager_finalize (GObject *object)
G_OBJECT_CLASS (gdm_user_manager_parent_class)->finalize (object);
}
static void
gdm_user_muted_debug_log_handler (const char *log_domain,
GLogLevelFlags log_level,
const char *message,
gpointer data)
{
/* Intentionally empty to discard message */
}
/**
* gdm_user_manager_ref_default:
*
@ -3086,11 +3077,6 @@ gdm_user_manager_ref_default (void)
user_manager_object = g_object_new (GDM_TYPE_USER_MANAGER, NULL);
g_object_add_weak_pointer (user_manager_object,
(gpointer *) &user_manager_object);
/* We don't normally care about user manager messages in the shell,
* so mute them */
g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG,
gdm_user_muted_debug_log_handler, NULL);
}
return GDM_USER_MANAGER (user_manager_object);

View File

@ -1,24 +0,0 @@
#!/bin/sh
if [ -f "$0.in" ]
then
scriptDir="`dirname $0`"
uiDir="$scriptDir/../data"
jsDir="$scriptDir/../js"
schemaDir="$scriptDir/../data"
else
uiDir="@pkgdatadir@"
jsDir="@pkgdatadir@/js"
schemaDir="@datadir@/glib-2.0/schemas"
fi
progName="`basename $0`"
localeDir="@localedir@"
uiFile="$uiDir/clock-preferences.ui"
export GJS_PATH="$jsDir"
export GSETTINGS_SCHEMA_DIR="$schemaDir"
@GJS_CONSOLE@ --js-version 1.8 -c "const ClockPreferences = imports.prefs.clockPreferences;
ClockPreferences.main({ progName: '$progName',
uiFile: '$uiFile',
localeDir: '$localeDir' });"

View File

@ -113,6 +113,8 @@ struct _GnomeShellPlugin
int glx_error_base;
int glx_event_base;
guint have_swap_event : 1;
ShellGlobal *global;
};
struct _GnomeShellPluginClass
@ -299,8 +301,101 @@ add_statistics (GnomeShellPlugin *shell_plugin)
NULL, NULL);
}
/* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it:
*
* Sends it to the daemon via D-Bus asynchronously
* When it gets an reply, synthesizes a new GdkEvent and puts it into the
* GDK event queue with gdk_event_put(), including
* IBUS_FORWARD_MASK = 1 << 25 in the state to prevent a loop.
*
* (Normally, IBus uses the GTK+ key snooper mechanism to get the key
* events early, but since our key events aren't visible to GTK+ key snoopers,
* IBus will instead get the events via the standard
* GtkIMContext.filter_keypress() mechanism.)
*
* There are a number of potential problems here; probably the worst
* problem is that IBus doesn't forward the timestamp with the event
* so that every key event that gets delivered ends up with
* GDK_CURRENT_TIME. This creates some very subtle bugs; for example
* if you have IBus running and a keystroke is used to trigger
* launching an application, focus stealing prevention won't work
* right. http://code.google.com/p/ibus/issues/detail?id=1184
*
* In any case, our normal flow of key events is:
*
* GDK filter function => clutter_x11_handle_event => clutter actor
*
* So, if we see a key event that gets delivered via the GDK event handler
* function - then we know it must be one of these synthesized events, and
* we should push it back to clutter.
*
* To summarize, the full key event flow with IBus is:
*
* GDK filter function
* => Mutter
* => gnome_shell_plugin_xevent_filter()
* => clutter_x11_handle_event()
* => clutter event delivery to actor
* => gtk_im_context_filter_event()
* => sent to IBus daemon
* => response received from IBus daemon
* => gdk_event_put()
* => GDK event handler
* => <this function>
* => clutter_event_put()
* => clutter event delivery to actor
*
* Anything else we see here we just pass on to the normal GDK event handler
* gtk_main_do_event().
*/
static void
gvc_muted_debug_log_handler (const char *log_domain,
gnome_shell_gdk_event_handler (GdkEvent *event_gdk,
gpointer data)
{
if (event_gdk->type == GDK_KEY_PRESS || event_gdk->type == GDK_KEY_RELEASE)
{
ClutterActor *stage;
Window stage_xwindow;
stage = clutter_stage_get_default ();
stage_xwindow = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
if (GDK_WINDOW_XID (event_gdk->key.window) == stage_xwindow)
{
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
ClutterInputDevice *keyboard = clutter_device_manager_get_core_device (device_manager,
CLUTTER_KEYBOARD_DEVICE);
ClutterEvent *event_clutter = clutter_event_new ((event_gdk->type == GDK_KEY_RELEASE) ?
CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
event_clutter->key.time = event_gdk->key.time;
event_clutter->key.flags = CLUTTER_EVENT_NONE;
event_clutter->key.stage = CLUTTER_STAGE (stage);
event_clutter->key.source = NULL;
/* This depends on ClutterModifierType and GdkModifierType being
* identical, which they are currently. (They both match the X
* modifier state in the low 16-bits and have the same extensions.) */
event_clutter->key.modifier_state = event_gdk->key.state;
event_clutter->key.keyval = event_gdk->key.keyval;
event_clutter->key.hardware_keycode = event_gdk->key.hardware_keycode;
event_clutter->key.unicode_value = gdk_keyval_to_unicode (event_clutter->key.keyval);
event_clutter->key.device = keyboard;
clutter_event_put (event_clutter);
clutter_event_free (event_clutter);
return;
}
}
gtk_main_do_event (event_gdk);
}
static void
muted_log_handler (const char *log_domain,
GLogLevelFlags log_level,
const char *message,
gpointer data)
@ -320,7 +415,6 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
int status;
const char *shell_js;
char **search_path;
ShellGlobal *global;
const char *glx_extensions;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
@ -339,6 +433,8 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
NULL);
update_font_options (settings);
gdk_event_handler_set (gnome_shell_gdk_event_handler, plugin, NULL);
screen = meta_plugin_get_screen (plugin);
display = meta_screen_get_display (screen);
@ -374,15 +470,19 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
NULL);
g_strfreev(search_path);
/* Disable the gnome-volume-control debug */
/* Disable debug spew from various libraries */
g_log_set_handler ("Gvc", G_LOG_LEVEL_DEBUG,
gvc_muted_debug_log_handler, NULL);
muted_log_handler, NULL);
g_log_set_handler ("GdmUser", G_LOG_LEVEL_DEBUG,
muted_log_handler, NULL);
g_log_set_handler ("libgnome-bluetooth", G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_MESSAGE,
muted_log_handler, NULL);
/* Initialize the global object here. */
global = shell_global_get ();
shell_plugin->global = shell_global_get ();
_shell_global_set_plugin (global, META_PLUGIN(shell_plugin));
_shell_global_set_gjs_context (global, shell_plugin->gjs_context);
_shell_global_set_plugin (shell_plugin->global, META_PLUGIN(shell_plugin));
_shell_global_set_gjs_context (shell_plugin->global, shell_plugin->gjs_context);
add_statistics (shell_plugin);
@ -511,9 +611,9 @@ static gboolean
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
XEvent *xev)
{
#ifdef GLX_INTEL_swap_event
GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
GnomeShellPlugin *shell_plugin = GNOME_SHELL_PLUGIN (plugin);
#ifdef GLX_INTEL_swap_event
if (shell_plugin->have_swap_event &&
xev->type == (shell_plugin->glx_event_base + GLX_BufferSwapComplete))
{
@ -545,6 +645,12 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
&& xev->xcrossing.window == clutter_x11_get_stage_window (CLUTTER_STAGE (clutter_stage_get_default ())))
return TRUE;
/*
* Pass the event to shell-global
*/
if (_shell_global_check_xdnd_event (shell_plugin->global, xev))
return TRUE;
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
}

View File

@ -152,7 +152,7 @@ def start_dconf_await_service():
# dconf is linked without libtool, so unlike other GNOME modules,
# won't have an embedded rpath for its library directory.
env = dict(os.environ)
if 'LD_LIBRARY_PATH' in env:
if 'LD_LIBRARY_PATH' in env and env['LD_LIBRARY_PATH']:
ld_library_path = '@libdir@:' + env['LD_LIBRARY_PATH']
else:
ld_library_path = '@libdir@'
@ -246,7 +246,7 @@ def start_shell(perf_output=None):
if pkgconfig.returncode == 0:
mozjs_libdir = re.sub('-(sdk|devel)', '', mozjs_sdkdir)
if os.path.exists(mozjs_libdir + '/libmozjs.so'):
if 'LD_LIBRARY_PATH' in env:
if 'LD_LIBRARY_PATH' in env and env['LD_LIBRARY_PATH']:
ld_library_path = env['LD_LIBRARY_PATH'] + ':' + mozjs_libdir
else:
ld_library_path = mozjs_libdir
@ -672,7 +672,8 @@ use an extension title clicktofocus@janedoe.example.com.'''
os.makedirs(extension_path)
meta = { 'name': name,
'description': description,
'uuid': uuid }
'uuid': uuid,
'shell-version': ['@VERSION@'] }
f = open(os.path.join(extension_path, 'metadata.json'), 'w')
try:
json.dump(meta, f)

View File

@ -1,19 +0,0 @@
#ifndef __GTK_COMPAT_H__
#define __GTK_COMPAT_H__
#include <gtk/gtk.h>
/* Provide a compatibility layer for accessor functions introduced
* in GTK+ 2.20 which we need to build with GSEAL_ENABLE.
* That way it is still possible to build with GTK+ 2.18 when not
* using GSEAL_ENABLE
*/
#if !GTK_CHECK_VERSION(2, 20, 0)
#define gtk_widget_get_realized(w) GTK_WIDGET_REALIZED (w)
#define gtk_widget_get_mapped(w) GTK_WIDGET_MAPPED (w)
#endif /* GTK_CHECK_VERSION(2, 20, 0) */
#endif /* __GTK_COMPAT_H__ */

View File

@ -35,14 +35,14 @@ struct _ShellAppSystemClass
};
GType shell_app_system_get_type (void) G_GNUC_CONST;
ShellAppSystem* shell_app_system_get_default(void);
ShellAppSystem *shell_app_system_get_default (void);
typedef struct _ShellAppInfo ShellAppInfo;
#define SHELL_TYPE_APP_INFO (shell_app_info_get_type ())
GType shell_app_info_get_type (void);
ShellAppInfo* shell_app_info_ref (ShellAppInfo *info);
ShellAppInfo *shell_app_info_ref (ShellAppInfo *info);
void shell_app_info_unref (ShellAppInfo *info);
const char *shell_app_info_get_id (ShellAppInfo *info);
@ -51,46 +51,52 @@ char *shell_app_info_get_description (ShellAppInfo *info);
char *shell_app_info_get_executable (ShellAppInfo *info);
char *shell_app_info_get_desktop_file_path (ShellAppInfo *info);
GIcon *shell_app_info_get_icon (ShellAppInfo *info);
ClutterActor *shell_app_info_create_icon_texture (ShellAppInfo *info, float size);
ClutterActor *shell_app_info_create_icon_texture (ShellAppInfo *info,
float size);
char *shell_app_info_get_section (ShellAppInfo *info);
gboolean shell_app_info_get_is_nodisplay (ShellAppInfo *info);
gboolean shell_app_info_is_transient (ShellAppInfo *info);
MetaWindow *shell_app_info_get_source_window (ShellAppInfo *info);
gboolean shell_app_info_launch (ShellAppInfo *info,
GError **error);
gboolean shell_app_info_launch_full (ShellAppInfo *info,
guint timestamp,
GList *uris,
int workspace,
char **startup_id,
GError **error);
gboolean shell_app_info_launch (ShellAppInfo *info,
GError **error);
ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system, const char *filename, GError **error);
GList *shell_app_system_get_sections (ShellAppSystem *system);
ShellApp *shell_app_system_get_app (ShellAppSystem *system, const char *id);
ShellApp *shell_app_system_get_app_for_path (ShellAppSystem *system, const char *desktop_path);
ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *self, MetaWindow *window);
void _shell_app_system_register_app (ShellAppSystem *self, ShellApp *app);
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system, const char *id);
ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system, MetaWindow *window);
GSList *shell_app_system_get_flattened_apps (ShellAppSystem *system);
GSList *shell_app_system_get_all_settings (ShellAppSystem *system);
ShellApp *shell_app_system_get_app (ShellAppSystem *system,
const char *id);
ShellApp *shell_app_system_get_app_for_path (ShellAppSystem *system,
const char *desktop_path);
ShellApp *shell_app_system_get_app_for_window (ShellAppSystem *self,
MetaWindow *window);
ShellApp *shell_app_system_lookup_heuristic_basename (ShellAppSystem *system,
const char *id);
ShellAppInfo *shell_app_system_load_from_desktop_file (ShellAppSystem *system,
const char *filename,
GError **error);
ShellAppInfo *shell_app_system_create_from_window (ShellAppSystem *system,
MetaWindow *window);
GSList *shell_app_system_initial_search (ShellAppSystem *system,
gboolean prefs,
GSList *terms);
GSList *shell_app_system_subsearch (ShellAppSystem *system,
gboolean prefs,
GSList *previous_results,
GSList *terms);
/* internal API */
void _shell_app_system_register_app (ShellAppSystem *self,
ShellApp *app);
#endif /* __SHELL_APP_SYSTEM_H__ */

View File

@ -577,7 +577,8 @@ shell_app_is_on_workspace (ShellApp *app,
if (shell_app_get_state (app) == SHELL_APP_STATE_STARTING)
{
if (meta_workspace_index (workspace) == app->started_on_workspace)
if (app->started_on_workspace == -1 ||
meta_workspace_index (workspace) == app->started_on_workspace)
return TRUE;
else
return FALSE;

View File

@ -6,7 +6,6 @@
#include <clutter/x11/clutter-x11.h>
#include "shell-embedded-window-private.h"
#include "gtk-compat.h"
/* This type is a subclass of GtkWindow that ties the window to a
* ShellGtkEmbed; the window is reparented into the stage

View File

@ -233,6 +233,8 @@ shell_generic_container_set_skip_paint (ShellGenericContainer *self,
g_hash_table_remove (self->priv->skip_paint, child);
else
g_hash_table_insert (self->priv->skip_paint, child, child);
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
}
static void

View File

@ -11,4 +11,6 @@ void _shell_global_set_plugin (ShellGlobal *global,
void _shell_global_set_gjs_context (ShellGlobal *global,
GjsContext *context);
gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
XEvent *xev);
#endif /* __SHELL_GLOBAL_PRIVATE_H__ */

View File

@ -6,6 +6,7 @@
#include "shell-enum-types.h"
#include "shell-perf-log.h"
#include "shell-window-tracker.h"
#include "shell-marshal.h"
#include "shell-wm.h"
#include "st.h"
@ -26,6 +27,9 @@
#include <X11/extensions/Xfixes.h>
#include <gjs/gjs-module.h>
#include <canberra.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
#endif
@ -70,6 +74,8 @@ struct _ShellGlobal {
/* For sound notifications */
ca_context *sound_context;
guint32 xdnd_timestamp;
};
enum {
@ -92,8 +98,19 @@ enum {
PROP_FOCUS_MANAGER,
};
/* Signals */
enum
{
XDND_POSITION_CHANGED,
XDND_LEAVE,
XDND_ENTER,
LAST_SIGNAL
};
G_DEFINE_TYPE(ShellGlobal, shell_global, G_TYPE_OBJECT);
static guint shell_global_signals [LAST_SIGNAL] = { 0 };
static void
shell_global_set_property(GObject *object,
guint prop_id,
@ -238,6 +255,36 @@ shell_global_class_init (ShellGlobalClass *klass)
gobject_class->get_property = shell_global_get_property;
gobject_class->set_property = shell_global_set_property;
/* Emitted from gnome-shell-plugin.c during event handling */
shell_global_signals[XDND_POSITION_CHANGED] =
g_signal_new ("xdnd-position-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_shell_marshal_VOID__INT_INT,
G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
/* Emitted from gnome-shell-plugin.c during event handling */
shell_global_signals[XDND_LEAVE] =
g_signal_new ("xdnd-leave",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
/* Emitted from gnome-shell-plugin.c during event handling */
shell_global_signals[XDND_ENTER] =
g_signal_new ("xdnd-enter",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_object_class_install_property (gobject_class,
PROP_OVERLAY_GROUP,
g_param_spec_object ("overlay-group",
@ -530,7 +577,8 @@ shell_global_set_cursor (ShellGlobal *global,
{
ClutterStage *stage = CLUTTER_STAGE (meta_plugin_get_stage (global->plugin));
global->stage_window = gdk_window_foreign_new (clutter_x11_get_stage_window (stage));
global->stage_window = gdk_x11_window_foreign_new_for_display (gdk_display_get_default (),
clutter_x11_get_stage_window (stage));
}
gdk_window_set_cursor (global->stage_window, cursor);
@ -1025,6 +1073,136 @@ shell_global_breakpoint (ShellGlobal *global)
G_BREAKPOINT ();
}
/**
* shell_global_parse_search_provider:
* @global: A #ShellGlobal
* @data: description of provider
* @name: (out): location to store a display name
* @url: (out): location to store template of url
* @langs: (out) (transfer full) (element-type utf8): list of supported languages
* @icon_data_uri: (out): location to store uri
* @error: location to store GError
*
* Returns: %TRUE on success
*/
gboolean
shell_global_parse_search_provider (ShellGlobal *global,
const char *data,
char **name,
char **url,
GList **langs,
char **icon_data_uri,
GError **error)
{
xmlDocPtr doc = xmlParseMemory (data, strlen(data));
xmlNode *root;
*name = NULL;
*url = NULL;
*icon_data_uri = NULL;
*langs = NULL;
if (!doc)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Malformed xml");
return FALSE;
}
root = xmlDocGetRootElement (doc);
if (root && root->name && xmlStrcmp (root->name, (const xmlChar *)"OpenSearchDescription") == 0)
{
xmlNode *child;
for (child = root->children; child; child = child->next)
{
if (!child->name)
continue;
if (xmlStrcmp (child->name, (const xmlChar *)"Language") == 0)
{
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
if (!val)
continue;
*langs = g_list_append (*langs, g_strdup ((char *)val));
xmlFree (val);
}
if (!*name && xmlStrcmp (child->name, (const xmlChar *)"ShortName") == 0)
{
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
*name = g_strdup ((char *)val);
xmlFree (val);
}
if (!*icon_data_uri && xmlStrcmp (child->name, (const xmlChar *)"Image") == 0)
{
xmlChar *val = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
if (val)
*icon_data_uri = g_strdup ((char *)val);
xmlFree (val);
}
if (!*url && xmlStrcmp (child->name, (const xmlChar *)"Url") == 0)
{
xmlChar *template;
xmlChar *type;
type = xmlGetProp(child, (const xmlChar *)"type");
if (!type)
continue;
if (xmlStrcmp (type, (const xmlChar *)"text/html") != 0)
{
xmlFree (type);
continue;
}
xmlFree (type);
template = xmlGetProp(child, (const xmlChar *)"template");
if (!template)
continue;
*url = g_strdup ((char *)template);
xmlFree (template);
}
}
}
else
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Invalid OpenSearch document");
xmlFreeDoc (doc);
return FALSE;
}
xmlFreeDoc (doc);
if (*icon_data_uri && *name && *url)
return TRUE;
if (*icon_data_uri)
g_free (*icon_data_uri);
else
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"search provider doesn't have icon");
if (*name)
g_free (*name);
else if (error && !*error)
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"search provider doesn't have ShortName");
if (*url)
g_free (*url);
else if (error && !*error)
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"search provider doesn't have template for url");
if (*langs)
{
g_list_foreach (*langs, (GFunc)g_free, NULL);
g_list_free (*langs);
}
*url = NULL;
*name = NULL;
*icon_data_uri = NULL;
*langs = NULL;
return FALSE;
}
/**
* shell_global_gc:
* @global: A #ShellGlobal
@ -1129,6 +1307,39 @@ grab_notify (GtkWidget *widget, gboolean was_grabbed, gpointer user_data)
shell_global_set_stage_input_mode (global, global->input_mode);
}
/**
* shell_global_init_xdnd:
* @global: the #ShellGlobal
*
* Enables tracking of Xdnd events
*/
void shell_global_init_xdnd (ShellGlobal *global)
{
long xdnd_version = 5;
MetaScreen *screen = shell_global_get_screen (global);
Window output_window = meta_get_overlay_window (screen);
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
ClutterStage *stage = CLUTTER_STAGE(meta_plugin_get_stage (global->plugin));
Window stage_win = clutter_x11_get_stage_window (stage);
XChangeProperty (xdisplay, stage_win, gdk_x11_get_xatom_by_name ("XdndAware"), XA_ATOM,
32, PropModeReplace, (const unsigned char *)&xdnd_version, 1);
XChangeProperty (xdisplay, output_window, gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW,
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
/*
* XdndProxy is additionally set on the proxy window as verification that the
* XdndProxy property on the target window isn't a left-over
*/
XChangeProperty (xdisplay, stage_win, gdk_x11_get_xatom_by_name ("XdndProxy"), XA_WINDOW,
32, PropModeReplace, (const unsigned char *)&stage_win, 1);
}
/**
* shell_global_format_time_relative_pretty:
* @global:
@ -1421,6 +1632,10 @@ shell_global_get_current_time (ShellGlobal *global)
guint32 time;
MetaDisplay *display;
/* In case we have a xdnd timestamp use it */
if (global->xdnd_timestamp != 0)
return global->xdnd_timestamp;
/* meta_display_get_current_time() will return the correct time
when handling an X or Gdk event, but will return CurrentTime
from some Clutter event callbacks.
@ -1688,3 +1903,67 @@ shell_global_play_theme_sound (ShellGlobal *global,
{
ca_context_play (global->sound_context, 0, CA_PROP_EVENT_ID, name, NULL);
}
/*
* Process Xdnd events
*
* We pass the position and leave events to JS via a signal
* where the actual drag & drop handling happens.
*
* http://www.freedesktop.org/wiki/Specifications/XDND
*/
gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
XEvent *xev)
{
MetaScreen *screen = meta_plugin_get_screen (global->plugin);
Window output_window = meta_get_overlay_window (screen);
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
ClutterStage *stage = CLUTTER_STAGE (meta_plugin_get_stage (global->plugin));
Window stage_win = clutter_x11_get_stage_window (stage);
if (xev->xany.window != output_window && xev->xany.window != stage_win)
return FALSE;
if (xev->xany.type == ClientMessage && xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndPosition"))
{
XEvent xevent;
Window src = xev->xclient.data.l[0];
memset (&xevent, 0, sizeof(xevent));
xevent.xany.type = ClientMessage;
xevent.xany.display = xdisplay;
xevent.xclient.window = src;
xevent.xclient.message_type = gdk_x11_get_xatom_by_name ("XdndStatus");
xevent.xclient.format = 32;
xevent.xclient.data.l[0] = output_window;
/* flags: bit 0: will we accept the drop? bit 1: do we want more position messages */
xevent.xclient.data.l[1] = 2;
xevent.xclient.data.l[4] = None;
XSendEvent (xdisplay, src, False, 0, &xevent);
/* Store the timestamp of the xdnd position event */
global->xdnd_timestamp = xev->xclient.data.l[3];
g_signal_emit_by_name (G_OBJECT (global), "xdnd-position-changed",
(int)(xev->xclient.data.l[2] >> 16), (int)(xev->xclient.data.l[2] & 0xFFFF));
global->xdnd_timestamp = 0;
return TRUE;
}
else if (xev->xany.type == ClientMessage && xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndLeave"))
{
g_signal_emit_by_name (G_OBJECT (global), "xdnd-leave");
return TRUE;
}
else if (xev->xany.type == ClientMessage && xev->xclient.message_type == gdk_x11_get_xatom_by_name ("XdndEnter"))
{
g_signal_emit_by_name (G_OBJECT (global), "xdnd-enter");
return TRUE;
}
return FALSE;
}

View File

@ -84,6 +84,14 @@ void shell_global_reexec_self (ShellGlobal *global);
void shell_global_breakpoint (ShellGlobal *global);
gboolean shell_global_parse_search_provider (ShellGlobal *global,
const char *data,
char **name,
char **url,
GList **langs,
char **icon_data_uri,
GError **error);
void shell_global_gc (ShellGlobal *global);
void shell_global_maybe_gc (ShellGlobal *global);
@ -132,6 +140,8 @@ void shell_global_run_at_leisure (ShellGlobal *global,
void shell_global_play_theme_sound (ShellGlobal *global,
const char *name);
void shell_global_init_xdnd (ShellGlobal *global);
G_END_DECLS
#endif /* __SHELL_GLOBAL_H__ */

View File

@ -3,7 +3,6 @@
#include "config.h"
#include "shell-embedded-window-private.h"
#include "gtk-compat.h"
#include <gdk/gdkx.h>
@ -167,25 +166,19 @@ shell_gtk_embed_get_preferred_height (ClutterActor *actor,
}
static void
shell_gtk_embed_paint (ClutterActor *actor)
shell_gtk_embed_allocate (ClutterActor *actor,
const ClutterActorBox *box,
ClutterAllocationFlags flags)
{
ShellGtkEmbed *embed = SHELL_GTK_EMBED (actor);
float wx = 0.0, wy = 0.0, x, y, ax, ay;
float w, h;
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->paint (actor);
CLUTTER_ACTOR_CLASS (shell_gtk_embed_parent_class)->
allocate (actor, box, flags);
if (!embed->priv->window)
return;
/* Move the X window to the same position as the actor; it's much
* easier to just do this from paint() than it is to tray to track
* the position and allocation of @embed and each of its ancestors
* as they change. We don't use get_transformed_position() here
* because we know that the icon isn't scaled or rotated, and so
* it's faster to avoid the floating-point transformations.
/* Find the actor's new coordinates in terms of the stage (which is
* priv->window's parent window.
*/
clutter_actor_get_size (actor, &w, &h);
while (actor)
{
clutter_actor_get_position (actor, &x, &y);
@ -199,7 +192,8 @@ shell_gtk_embed_paint (ClutterActor *actor)
_shell_embedded_window_allocate (embed->priv->window,
(int)(0.5 + wx), (int)(0.5 + wy),
w, h);
box->x2 - box->x1,
box->y2 - box->y1);
}
static void
@ -246,7 +240,7 @@ shell_gtk_embed_class_init (ShellGtkEmbedClass *klass)
actor_class->get_preferred_width = shell_gtk_embed_get_preferred_width;
actor_class->get_preferred_height = shell_gtk_embed_get_preferred_height;
actor_class->paint = shell_gtk_embed_paint;
actor_class->allocate = shell_gtk_embed_allocate;
actor_class->realize = shell_gtk_embed_realize;
actor_class->unrealize = shell_gtk_embed_unrealize;

View File

@ -4,3 +4,4 @@ VOID:BOXED
VOID:BOXED,OBJECT
VOID:OBJECT,OBJECT
VOID:STRING,OBJECT,BOOLEAN
VOID:INT,INT

View File

@ -1,129 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "config.h"
#include "shell-process.h"
#include <sys/types.h>
#include <sys/wait.h>
struct _ShellProcessPrivate {
char **args;
GPid pid;
};
enum {
PROP_0,
PROP_ARGS,
};
static void shell_process_dispose (GObject *object);
static void shell_process_finalize (GObject *object);
static void shell_process_set_property ( GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec );
static void shell_process_get_property( GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec );
G_DEFINE_TYPE( ShellProcess, shell_process, G_TYPE_OBJECT);
static void shell_process_class_init( ShellProcessClass *klass)
{
GObjectClass *gobject_class = (GObjectClass *)klass;
gobject_class->dispose = shell_process_dispose;
gobject_class->finalize = shell_process_finalize;
gobject_class->set_property = shell_process_set_property;
gobject_class->get_property = shell_process_get_property;
g_object_class_install_property (gobject_class,
PROP_ARGS,
g_param_spec_boxed ("args",
"Arguments",
"",
G_TYPE_STRV,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
}
static void shell_process_init (ShellProcess *self)
{
self->priv = g_new0 (ShellProcessPrivate, 1);
}
static void shell_process_dispose (GObject *object)
{
G_OBJECT_CLASS (shell_process_parent_class)->dispose(object);
}
static void shell_process_finalize (GObject *object)
{
ShellProcess *self = (ShellProcess*)object;
g_free (self->priv);
g_signal_handlers_destroy(object);
G_OBJECT_CLASS (shell_process_parent_class)->finalize(object);
}
static void shell_process_set_property ( GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec )
{
ShellProcess* self = SHELL_PROCESS(object);
switch (property_id) {
case PROP_ARGS:
self->priv->args = (char**) g_value_dup_boxed (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
static void shell_process_get_property ( GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec )
{
ShellProcess* self = SHELL_PROCESS(object);
switch (property_id) {
case PROP_ARGS:
g_value_set_boxed (value, self->priv->args);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
ShellProcess* shell_process_new(char **args)
{
return (ShellProcess*) g_object_new(SHELL_TYPE_PROCESS,
"args", args,
NULL);
}
gboolean
shell_process_run (ShellProcess *self,
GError **error)
{
return g_spawn_async (NULL, self->priv->args, NULL,
G_SPAWN_SEARCH_PATH, NULL, NULL,
&self->priv->pid,
error);
}
/*
int
shell_process_wait (ShellProcess *self)
{
int status;
waitpid ((pid_t) self->priv->pid, &status, 0);
return status;
}
*/

View File

@ -1,37 +0,0 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#ifndef __SHELL_PROCESS_H__
#define __SHELL_PROCESS_H__
#include <glib-object.h>
#define SHELL_TYPE_PROCESS (shell_process_get_type ())
#define SHELL_PROCESS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_PROCESS, ShellProcess))
#define SHELL_PROCESS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_PROCESS, ShellProcessClass))
#define SHELL_IS_PROCESS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), SHELL_TYPE_PROCESS))
#define SHELL_IS_PROCESS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_PROCESS))
#define SHELL_PROCESS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_PROCESS, ShellProcessClass))
typedef struct _ShellProcess ShellProcess;
typedef struct _ShellProcessClass ShellProcessClass;
typedef struct _ShellProcessPrivate ShellProcessPrivate;
struct _ShellProcess
{
GObject parent;
ShellProcessPrivate *priv;
};
struct _ShellProcessClass
{
GObjectClass parent_class;
};
GType shell_process_get_type (void) G_GNUC_CONST;
ShellProcess* shell_process_new(char **args);
gboolean shell_process_run (ShellProcess *process, GError **error);
#endif /* __SHELL_PROCESS_H__ */

View File

@ -5,7 +5,6 @@
#include "shell-tray-icon.h"
#include "shell-gtk-embed.h"
#include "shell-window-tracker.h"
#include "gtk-compat.h"
#include "tray/na-tray-child.h"
#include <gdk/gdkx.h>
#include "st.h"

View File

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

View File

@ -1213,3 +1213,14 @@ st_box_layout_insert_actor (StBoxLayout *self,
clutter_container_add_actor((ClutterContainer*) self, actor);
st_container_move_child (ST_CONTAINER (self), actor, pos);
}
void
st_box_layout_insert_before (StBoxLayout *self,
ClutterActor *actor,
ClutterActor *sibling)
{
g_return_if_fail (ST_IS_BOX_LAYOUT (self));
clutter_container_add_actor(CLUTTER_CONTAINER (self), actor);
st_container_move_before (ST_CONTAINER (self), actor, sibling);
}

View File

@ -90,6 +90,10 @@ void st_box_layout_insert_actor (StBoxLayout *self,
ClutterActor *actor,
int pos);
void st_box_layout_insert_before (StBoxLayout *self,
ClutterActor *actor,
ClutterActor *sibling);
G_END_DECLS
#endif /* _ST_BOX_LAYOUT_H */

View File

@ -159,6 +159,29 @@ st_container_move_child (StContainer *container,
clutter_actor_queue_relayout ((ClutterActor*) container);
}
void
st_container_move_before (StContainer *container,
ClutterActor *actor,
ClutterActor *sibling)
{
StContainerPrivate *priv = container->priv;
GList *actor_item = NULL;
GList *sibling_item = NULL;
actor_item = g_list_find (priv->children, actor);
sibling_item = g_list_find (priv->children, sibling);
g_return_if_fail (actor_item != NULL);
g_return_if_fail (sibling_item != NULL);
priv->children = g_list_delete_link (priv->children, actor_item);
priv->children = g_list_insert_before (priv->children, sibling_item, actor);
st_container_update_pseudo_classes (container);
clutter_actor_queue_relayout (CLUTTER_ACTOR (container));
}
/**
* st_container_get_children_list:
* @container: An #StContainer

View File

@ -62,6 +62,9 @@ GList * st_container_get_focus_chain (StContainer *container);
void st_container_move_child (StContainer *container,
ClutterActor *actor,
int pos);
void st_container_move_before (StContainer *container,
ClutterActor *actor,
ClutterActor *sibling);
GList * st_container_get_children_list (StContainer *container);
G_END_DECLS

View File

@ -149,7 +149,7 @@ st_icon_dispose (GObject *gobject)
{
clutter_actor_destroy (priv->pending_texture);
g_object_unref (priv->pending_texture);
priv->icon_texture = NULL;
priv->pending_texture = NULL;
}
if (priv->gicon)

View File

@ -61,6 +61,7 @@
#include <glib.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <gdk/gdkx.h>
#include <X11/extensions/XKB.h>
#include "st-im-text.h"
@ -200,11 +201,11 @@ window_for_actor (ClutterActor *actor)
stage = clutter_actor_get_stage (actor);
xwindow = clutter_x11_get_stage_window ((ClutterStage *)stage);
window = gdk_window_lookup_for_display (display, xwindow);
window = gdk_x11_window_lookup_for_display (display, xwindow);
if (window)
g_object_ref (window);
else
window = gdk_window_foreign_new_for_display (display, xwindow);
window = gdk_x11_window_foreign_new_for_display (display, xwindow);
return window;
}

View File

@ -437,6 +437,67 @@ out:
return rotated_pixbuf;
}
static GdkPixbuf*
decode_image (const char *val)
{
int i;
GError *error = NULL;
GdkPixbuf *res = NULL;
struct {
const char *prefix;
const char *mime_type;
} formats[] = {
{ "data:image/x-icon;base64,", "image/x-icon" },
{ "data:image/png;base64,", "image/png" }
};
g_return_val_if_fail (val, NULL);
for (i = 0; i < G_N_ELEMENTS (formats); i++)
{
if (g_str_has_prefix (val, formats[i].prefix))
{
gsize len;
guchar *data = NULL;
char *unescaped;
unescaped = g_uri_unescape_string (val + strlen (formats[i].prefix), NULL);
if (unescaped)
{
data = g_base64_decode (unescaped, &len);
g_free (unescaped);
}
if (data)
{
GdkPixbufLoader *loader;
loader = gdk_pixbuf_loader_new_with_mime_type (formats[i].mime_type, &error);
if (loader &&
gdk_pixbuf_loader_write (loader, data, len, &error) &&
gdk_pixbuf_loader_close (loader, &error))
{
res = gdk_pixbuf_loader_get_pixbuf (loader);
g_object_ref (res);
}
g_object_unref (loader);
g_free (data);
}
}
}
if (!res)
{
if (error)
{
g_warning ("%s\n", error->message);
g_error_free (error);
}
else
g_warning ("incorrect data uri");
}
return res;
}
static GdkPixbuf *
impl_load_pixbuf_file (const char *uri,
int available_width,
@ -448,6 +509,9 @@ impl_load_pixbuf_file (const char *uri,
char *contents = NULL;
gsize size;
if (g_str_has_prefix (uri, "data:"))
return decode_image (uri);
file = g_file_new_for_uri (uri);
if (g_file_load_contents (file, NULL, &contents, &size, NULL, error))
{
@ -1615,7 +1679,7 @@ st_texture_cache_load_from_data (StTextureCache *cache,
/**
* st_texture_cache_load_from_raw:
* @cache: a #StTextureCache
* @data: raw pixel data
* @data: (array length=len): raw pixel data
* @len: the length of @data
* @has_alpha: whether @data includes an alpha channel
* @width: width in pixels of @data

View File

@ -23,7 +23,6 @@
#include <string.h>
#include "na-tray-child.h"
#include "gtk-compat.h"
#include <glib/gi18n-lib.h>
#include <gdk/gdk.h>

View File

@ -25,9 +25,7 @@
#include <libintl.h>
#include "na-tray-manager.h"
#include "gtk-compat.h"
#include <gdkconfig.h>
#include <glib/gi18n-lib.h>
#if defined (GDK_WINDOWING_X11)
#include <gdk/gdkx.h>

View File

@ -62,7 +62,7 @@ fi
# libxklavier, libxml2, ORBit2, pam, python, readline,
# spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification,
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
# libgcrypt, libtasn1, libgnome-keyring
# libgcrypt, libtasn1, libgnome-keyring, libgtop, cups
#
# Non-devel packages needed by gnome-shell and its deps:
# glxinfo, gstreamer-plugins-base, gstreamer-plugins-good,
@ -76,13 +76,14 @@ if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint
build-essential curl
automake bison flex gettext git-core gnome-common gtk-doc-tools
gvfs gvfs-backends icon-naming-utils
libdbus-glib-1-dev libexpat-dev libffi-dev libgnome-menu-dev libgnome-desktop-dev
libdbus-glib-1-dev libexpat-dev libffi-dev libgnome-menu-dev libgnome-desktop-dev libgtop2-dev
libjasper-dev libjpeg-dev libpng-dev libstartup-notification0-dev libtiff-dev
libwnck-dev libgl1-mesa-dev liborbit2-dev libpulse-dev libreadline5-dev libxml2-dev
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
xulrunner-dev xserver-xephyr gnome-terminal libcroco3-dev
libgstreamer0.10-dev gstreamer0.10-plugins-base gstreamer0.10-plugins-good
libltdl-dev libvorbis-dev libxklavier-dev libgnome-keyring-dev libupower-glib-dev
libltdl-dev libvorbis-dev libxklavier-dev libgnome-keyring-dev
libupower-glib-dev libcups2-dev
"
if apt-cache show autopoint > /dev/null 2> /dev/null; then
@ -120,7 +121,7 @@ if test "x$system" = xFedora ; then
startup-notification-devel xorg-x11-server-Xephyr gnome-terminal zenity
icon-naming-utils upower-devel libtool-ltdl-devel libvorbis-devel
libxklavier-devel libgcrypt-devel libtasn1-devel libtasn1-tools
libgnome-keyring-devel
libgnome-keyring-devel libgtop2-devel cups-devel
"
if expr $version \>= 14 > /dev/null ; then
@ -143,7 +144,7 @@ if test "x$system" = xSUSE -o "x$system" = "xSUSE LINUX" ; then
curl \
bison flex gtk-doc gnome-common gnome-doc-utils-devel \
gnome-desktop-devel gnome-menus-devel icon-naming-utils \
libpulse-devel libtiff-devel cups-devel libffi-devel \
libgtop-devel libpulse-devel libtiff-devel cups-devel libffi-devel \
orbit2-devel libwnck-devel xorg-x11-proto-devel readline-devel \
mozilla-xulrunner191-devel libcroco-devel \
xorg-x11-devel xorg-x11 xorg-x11-server-extra \

View File

@ -25,10 +25,10 @@
<branch repo="git.gnome.org" module="glib"/>
</autotools>
<tarball id="vala" version="0.9.7" autogenargs="--enable-vapigen">
<source href="http://ftp.gnome.org/pub/GNOME/sources/vala/0.9/vala-0.9.7.tar.bz2"
hash="sha256:4a09219fc1abb960c17b4f7704332a4dd1edc21216520a3e5deeaac44cc6b4a7"
md5sum="3062fe00c0f5b8f40cd2a94ff9bbe2da" size="2394250"/>
<tarball id="vala" version="0.11.4" autogenargs="--enable-vapigen">
<source href="http://ftp.gnome.org/pub/GNOME/sources/vala/0.11/vala-0.11.4.tar.bz2"
hash="sha256:98b3e9e94b5462e88b1ad46d018d830d0316e26c61e36bf778500b414342239d"
md5sum="5d8c374b29c18bff14df7f5a7d64fda9" size="2852854"/>
<dependencies>
<dep package="glib"/>
</dependencies>