Compare commits

..

15 Commits

Author SHA1 Message Date
45797a977b app-system: Add back StartupWMClass matching
While unfortunate that we still have to scan all apps with get_all(),
support for this feature will be short-lived, so hopefully we can drop
it in the future as new apps adapt to the desktop file / app ID
recommendations.

For now, simply scan all desktop IDs.
2013-10-02 18:22:28 -04:00
884b94233e app-system: Put back support for the installed-changed signal
Use the new GAppInfoMonitor that Ryan added to glib to know when the
set of apps has changed.
2013-10-02 18:22:27 -04:00
74d3e3139f app-system: Lazily create ShellApps for apps we care about
Rather than create all ShellApps up-front, create them lazily. We really
had no reason to do this before as we were scanning GMenu to get all the
apps, but doing this can remove a need for get_all, which is slow and
memory-hungry.
2013-10-02 18:22:27 -04:00
77b5385cc3 appDisplay: Use the desktop file index for app searching
Rather than scanning all apps for searching, use Ryan's new desktop
file index and the glib support APIs for app searching instead of our
own system.
2013-10-02 18:22:27 -04:00
d749d646be appDisplay: Use a proper string key for the app search provider
We were always sort of cheating when we used objects as the search ID.
Since the new desktop file index will return us a list of desktop file
IDs, just use those as IDs instead.
2013-10-02 18:22:27 -04:00
fa8224d7b5 app-system: Remove use of gnome-menus internally
We want to transition to a system in the future where we have a desktop
file cache. As we no longer differentiate categories or similar, it no
longer makes sense to have app visibility based on categories. Thus,
we no longer need to use gnome-menus to list all apps. The potential
issue here is reloading all desktop files when new files are created,
but this can be dealt with individually.

The "All Applications" view still uses gnome-menus.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:27 -04:00
f687197ccc appDisplay: Ignore the NoDisplay flag for directories
This makes us match the native app search.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:15 -04:00
28a6aefb6c app-system: Remove visible_id_to_app
Since appDisplay.js makes its own GMenu tree, it's not necessary
anymore. This does mean that searches will show apps in NoDisplay
categories, but that's an obscure enough edge case not to matter.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:15 -04:00
96c2a90e11 app-system: Remove lookup_app_for_path
It's absurdly silly. Just modify the one place that uses it
to be better.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:15 -04:00
63cf46e49b app-system: Remove known_vendor_prefixes
This does remove support for legacy prefixed app infos with
subdirs, but since we want to remove support for the menu spec,
let's not even bother.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:15 -04:00
200a9ef1af app-system: Remove get_tree
Make clients construct their own gmenu tree if they need it.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:22:08 -04:00
6050ca6e0c app-system: Map wmclass to ID rather than apps
This makes the refcounting and memory management easier to understand.
2013-10-02 18:22:08 -04:00
8bd7db9227 app-system: Don't use gmenu_tree_entry_get_desktop_app_info
It's a broken method when it comes to giving us a useful GDesktopAppInfo,
and it's hard to fix libgmenu properly, so simply recreate the app info
using the desktop file ID that libgmenu has.
2013-10-02 18:22:07 -04:00
982feb85c1 app: Port to be based on GDesktopAppInfo
We weren't using the GMenuTreeEntry for anything special anymore,
so remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 18:14:18 -04:00
f165cc23c0 app-system: Remove lookup_app_by_tree_entry
We want to move away from gnome-menus eventually, so the simple
utility method isn't really worth keeping around. Reimplement it
in the one place that uses it.

https://bugzilla.gnome.org/show_bug.cgi?id=698486
2013-10-02 17:39:36 -04:00
126 changed files with 14402 additions and 12110 deletions

2
.gitignore vendored
View File

@ -43,8 +43,6 @@ docs/reference/*/xml/
docs/reference/shell/doc-gen-* docs/reference/shell/doc-gen-*
gtk-doc.make gtk-doc.make
js/misc/config.js js/misc/config.js
js/js-resources.c
js/js-resources.h
intltool-extract.in intltool-extract.in
intltool-merge.in intltool-merge.in
intltool-update.in intltool-update.in

View File

@ -1,11 +1,7 @@
# Point to our macro directory and pick up user flags from the environment # Point to our macro directory and pick up user flags from the environment
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
SUBDIRS = data js src tests po docs SUBDIRS = data js src browser-plugin tests po docs
if BUILD_BROWSER_PLUGIN
SUBDIRS += browser-plugin
endif
if ENABLE_MAN if ENABLE_MAN
SUBDIRS += man SUBDIRS += man

85
NEWS
View File

@ -1,88 +1,3 @@
3.11.2
======
* Cache search result display actors [Jasper; #704912]
* Use username in userWidget if real name doesn't fit [Jasper; #706851]
* Support shell_global_reexec_self() on OpenBSD [Antoine; #709571]
* Support disabling browser plugin [Colin; #711218]
* Restore support for 'disable-restart-buttons' [Florian; #711244]
* Validate parameters of exposed DBus methods [Florian; #699752]
* Connect applications to systemd journal if available [Colin; #711626]
* Misc bug fixes and cleanups [Florian, Jasper; #711205, #698486, #711416,
#644306, #711555, #709806, #711631, #711732]
Contributors:
Cosimo Cecchi, Antoine Jacoutot, Florian Müllner, Jasper St. Pierre,
Rico Tzschichholz, Colin Walters
Translations:
Yuri Myasoedov [ru], Kjartan Maraas [nb], Efstathios Iosifidis [el],
Benjamin Steinwender [de], eternalhui [zh_CN], Shantha kumar [ta]
3.11.1
======
* power: Use UPower directly instead of gnome-settings-daemon [Bastien; #710273]
* Implement support for new GTK+ notification API [Jasper, Giovanni, Florian;
#710137, #710596]
* gdm: Don't allow user-list to fill up the entire screen [Florian; #710555]
* Don't autostart remote search providers at login [Giovanni; #708830]
* Fix spacing in end-session dialog [Sebastien; #710543]
* Prepare for js24 [Tim; #711052]
* Misc bug fixes and cleanups [Jasper, Florian, Adel, Tim, Sebastien; #710347,
#710144, #710541, #691409, #710745, #688331, #704912]
Contributors:
Giovanni Campagna, Adel Gadllah, Sebastien Lafargue, Tim Lunn,
Florian Müllner, Bastien Nocera, Jasper St. Pierre, Rico Tzschichholz
Translations:
Stas Solovey [ru], Yosef Or Boczko [he], Rafael Ferreira [pt_BR]
3.10.1
======
* Make sure lock screen is drawn once before switching user [Giovanni; #708051]
* Fix signal strength indicators in network selector [Jasper; #708442]
* Scroll search results when focusing provider icons [Jasper; #708868]
* Add separate hover/active states to page indicators [Carlos; #708852]
* Tweak appearance of user name and avatar [Yash; #702309]
* Hide "Turn On" in network menu when disabled by hardware [Giovanni; #709635]
* Cancel open keyring prompts when the screen is locked [Florian; #708910]
* Differentiate "Not Connected" and "Off" in network menu [Giovanni; #709043]
* Make network settings items point to the right device [Giovanni; #709246]
* Remove animation of window preview titles [Sebastien; #709392]
* Add 'Notifications' switch to tray menu [Florian; #707073]
* Make dropdown arrows consistent [Carlos; #709564]
* power: Use icon from primary device for status [Jasper; #709925]
* Fix XDND drags to overview [Adel; #708887]
* Fix workspace switcher disappearing with too many workspaces [Jasper; #694881]
* Handle search results with 'special:' prefix specially [Giovanni; #707055]
* gdm: Support pre-authenticated logins from oVirt [Vinzenz; #702162]
* Use ARROW role for labels representing arrows [Alejandro; #710120]
* Make selected view in app picker persistent [Florian; #710042]
* Make network selector navigable by keyboard [Alejandro; #710144]
* Misc bug fixes [Florian, Adel, Jasper, Aleksander, Giovanni, Dan, Michael,
Tim; #709034, #709263, #698486, #709286, #709248, #709543, #696564, #703265,
#709638, #709866, #709998, #710019, #710104, #710115]
Contributors:
Giovanni Campagna, Michael Catanzaro, Vinzenz Feenstra, Adel Gadllah,
Yash Girdhar, Sebastien Lafargue, Tim Lunn, Aleksander Morgado,
Florian Müllner, Alejandro Piñeiro, Carlos Soriano, Jasper St. Pierre,
Dieter Verfaillie, Dan Winship
Translations:
Inaki Larranaga Murgoitio [eu], Christian Kirbach [de], Muhammet Kara [tr],
Aurimas Černius [lt], Ryan Lortie [eo], Rūdolfs Mazurs [lv],
Dušan Kazik [sk], Fran Diéguez [gl], Enrico Nicoletto [pt_BR],
Kjartan Maraas [nb], Victor Ibragimov [tg], Matej Urbančič [sl],
A S Alam [pa], Nilamdyuti Goswami [as], Daniel Mustieles [es],
Cheng-Chia Tseng [zh_HK, zh_TW], Mattias Põldaru [et], Kenneth Nielsen [da],
Milo Casagrande [it], Marek Černocký [cs], Ihar Hrachyshka [be],
Мирослав Николић [sr, sr@latin], Arash Mousavi [fa], Yuri Myasoedov [ru],
Gil Forcada [ca], Carles Ferrando [ca@valencia], Andika Triwidada [id],
Timo Jyrinki [fi], Piotr Drąg [pl], Rafael Ferreira [pt_BR],
Gabor Kelemen [hu], Yosef Or Boczko [he], Daniel Korostil [uk],
Wouter Bolsterlee [nl], António Lima [pt]
3.10.0.1 3.10.0.1
========= =========
* Fix login screen [Ray; #708691] * Fix login screen [Ray; #708691]

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.11.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.10.0.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_SRCDIR([src/shell-global.c]) AC_CONFIG_SRCDIR([src/shell-global.c])
@ -16,7 +16,6 @@ m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Checks for programs. # Checks for programs.
AC_PROG_CC AC_PROG_CC
AC_PROG_CXX
# Initialize libtool # Initialize libtool
LT_PREREQ([2.2.6]) LT_PREREQ([2.2.6])
@ -58,25 +57,10 @@ fi
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder) AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
AC_ARG_ENABLE([systemd],
AS_HELP_STRING([--enable-systemd], [Use systemd]),
[enable_systemd=$enableval],
[enable_systemd=auto])
AS_IF([test x$enable_systemd != xno], [
AC_MSG_CHECKING([for libsystemd-journal])
PKG_CHECK_EXISTS([libsystemd-journal],
[have_systemd=yes
AC_DEFINE([HAVE_SYSTEMD], [1], [Define if we have systemd])],
[have_systemd=no])
AC_MSG_RESULT($have_systemd)
])
AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.13.4 CLUTTER_MIN_VERSION=1.13.4
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.38.1 GJS_MIN_VERSION=1.35.4
MUTTER_MIN_VERSION=3.11.1 MUTTER_MIN_VERSION=3.10.0
GTK_MIN_VERSION=3.7.9 GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0 GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3 LIBECAL_MIN_VERSION=3.5.3
@ -108,9 +92,6 @@ SHARED_PCS="gio-unix-2.0 >= $GIO_MIN_VERSION
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
libsecret-unstable gcr-base-3 >= $GCR_MIN_VERSION" libsecret-unstable gcr-base-3 >= $GCR_MIN_VERSION"
if test x$have_systemd = xyes; then
SHARED_PCS="${SHARED_PCS} libsystemd-journal"
fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS) PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION) PKG_CHECK_MODULES(MUTTER, libmutter >= $MUTTER_MIN_VERSION)
@ -126,20 +107,12 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0) PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0) PKG_CHECK_MODULES(SHELL_HOTPLUG_SNIFFER, gio-2.0 gdk-pixbuf-2.0)
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
PKG_CHECK_MODULES(TRAY, gtk+-3.0) PKG_CHECK_MODULES(TRAY, gtk+-3.0)
PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0) PKG_CHECK_MODULES(GVC, libpulse >= $PULSE_MIN_VERS libpulse-mainloop-glib gobject-2.0)
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4) PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.4)
PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8) PKG_CHECK_MODULES(CARIBOU, caribou-1.0 >= 0.4.8)
AC_ARG_ENABLE(browser-plugin,
[AS_HELP_STRING([--enable-browser-plugin],
[Enable browser plugin [default=yes]])],,
enable_browser_plugin=yes)
AS_IF([test x$enable_browser_plugin = xyes], [
PKG_CHECK_MODULES(BROWSER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION json-glib-1.0 >= 0.13.2)
])
AM_CONDITIONAL(BUILD_BROWSER_PLUGIN, test x$enable_browser_plugin = xyes)
AC_MSG_CHECKING([for bluetooth support]) AC_MSG_CHECKING([for bluetooth support])
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.9.0], PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.9.0],
[BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0` [BLUETOOTH_DIR=`$PKG_CONFIG --variable=applet_libdir gnome-bluetooth-1.0`
@ -172,9 +145,6 @@ AC_SUBST(MUTTER_TYPELIB_DIR)
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0` GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
AC_SUBST(GJS_CONSOLE) AC_SUBST(GJS_CONSOLE)
GLIB_COMPILE_RESOURCES=`$PKG_CONFIG --variable glib_compile_resources gio-2.0`
AC_SUBST(GLIB_COMPILE_RESOURCES)
AC_CHECK_FUNCS(fdwalk) AC_CHECK_FUNCS(fdwalk)
AC_CHECK_FUNCS(mallinfo) AC_CHECK_FUNCS(mallinfo)
AC_CHECK_HEADERS([sys/resource.h]) AC_CHECK_HEADERS([sys/resource.h])

View File

@ -1,3 +1,6 @@
wandadir = $(pkgdatadir)
dist_wanda_DATA = wanda.png
desktopdir=$(datadir)/applications desktopdir=$(datadir)/applications
desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
if HAVE_MUTTER_WAYLAND if HAVE_MUTTER_WAYLAND

View File

@ -37,13 +37,6 @@
application view, rather than being displayed inline in the main view. application view, rather than being displayed inline in the main view.
</_description> </_description>
</key> </key>
<key name="app-picker-view" type="u">
<default>0</default>
<summary>App Picker View</summary>
<description>
Index of the currently selected view in the application picker.
</description>
</key>
<key name="command-history" type="as"> <key name="command-history" type="as">
<default>[]</default> <default>[]</default>
<_summary>History for command (Alt-F2) dialog</_summary> <_summary>History for command (Alt-F2) dialog</_summary>

View File

@ -157,7 +157,7 @@ StScrollBar StButton#vhandle:active {
min-width: 200px; min-width: 200px;
} }
.unicode-arrow { .popup-submenu-menu-item-triangle {
font-size: 120%; font-size: 120%;
} }
@ -306,13 +306,16 @@ StScrollBar StButton#vhandle:active {
font-size: 12pt; font-size: 12pt;
border-bottom: 1px solid #666; border-bottom: 1px solid #666;
padding: 12px; padding: 12px;
spacing: 20px;
} }
.nm-dialog-item:selected { .nm-dialog-item:checked {
background-color: #333; background-color: #333;
} }
.nm-dialog-item-box {
spacing: 20px;
}
.nm-dialog-icons { .nm-dialog-icons {
spacing: .5em; spacing: .5em;
} }
@ -690,9 +693,7 @@ StScrollBar StButton#vhandle:active {
padding-bottom: 32px; padding-bottom: 32px;
} }
.workspace-thumbnails { .workspace-thumbnails-background {
spacing: 11px;
visible-width: 32px; /* Amount visible before hovering */
border: 1px solid rgba(128, 128, 128, 0.4); border: 1px solid rgba(128, 128, 128, 0.4);
border-right: 0px; border-right: 0px;
border-radius: 9px 0px 0px 9px; border-radius: 9px 0px 0px 9px;
@ -700,13 +701,18 @@ StScrollBar StButton#vhandle:active {
padding: 11px 7px 11px 11px; padding: 11px 7px 11px 11px;
} }
.workspace-thumbnails:rtl { .workspace-thumbnails-background:rtl {
border-right: 1px; border-right: 1px;
border-left: 0px; border-left: 0px;
border-radius: 0px 9px 9px 0px; border-radius: 0px 9px 9px 0px;
padding: 11px 11px 11px 7px; padding: 11px 11px 11px 7px;
} }
.workspace-thumbnails {
spacing: 11px;
visible-width: 32px; /* Amount visible before hovering */
}
.workspace-thumbnail-indicator { .workspace-thumbnail-indicator {
border: 4px solid rgba(255,255,255,0.7); border: 4px solid rgba(255,255,255,0.7);
border-radius: 4px; border-radius: 4px;
@ -1967,11 +1973,6 @@ StScrollBar StButton#vhandle:active {
padding-left: 50px; padding-left: 50px;
} }
.end-session-dialog-session-list,
.end-session-dialog-app-list {
spacing: 1em;
}
.end-session-dialog-list-header { .end-session-dialog-list-header {
font-weight: bold; font-weight: bold;
} }
@ -2275,7 +2276,7 @@ StScrollBar StButton#vhandle:active {
.framed-user-icon { .framed-user-icon {
border: 2px solid #8b8b8b; border: 2px solid #8b8b8b;
border-radius: 3px; border-radius: 5px;
background-size: contain; background-size: contain;
} }
@ -2319,7 +2320,7 @@ StScrollBar StButton#vhandle:active {
} }
.login-dialog-user-list-item { .login-dialog-user-list-item {
border-radius: 5px; border-radius: 10px;
padding: .2em; padding: .2em;
} }
@ -2332,20 +2333,19 @@ StScrollBar StButton#vhandle:active {
} }
.login-dialog-user-list-item .login-dialog-user-list-item-name { .login-dialog-user-list-item .login-dialog-user-list-item-name {
font-size: 20px; font-size: 20pt;
padding-left: 18px; padding-left: 9px;
font-weight: bold;
} }
.login-dialog-user-list:expanded .login-dialog-user-list-item { .login-dialog-user-list:expanded .login-dialog-user-list-item {
color: #bfbfbf; color: #666666;
} }
.login-dialog-user-list-item, .login-dialog-user-list-item,
.login-dialog-user-list-item:hover .login-dialog-user-list-item-name, .login-dialog-user-list-item:hover .login-dialog-user-list-item-name,
.login-dialog-user-list:expanded .login-dialog-user-list-item:focus .login-dialog-user-list-item-name, .login-dialog-user-list:expanded .login-dialog-user-list-item:focus .login-dialog-user-list-item-name,
.login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in { .login-dialog-user-list:expanded .login-dialog-user-list-item:logged-in {
color: #bfbfbf; color: white;
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
} }
@ -2377,7 +2377,7 @@ StScrollBar StButton#vhandle:active {
.login-dialog-user-list-item-icon { .login-dialog-user-list-item-icon {
border: 2px solid #8b8b8b; border: 2px solid #8b8b8b;
border-radius: 3px; border-radius: 8px;
width: 64px; width: 64px;
height: 64px; height: 64px;
} }
@ -2389,10 +2389,6 @@ StScrollBar StButton#vhandle:active {
padding-top: 1em; padding-top: 1em;
} }
.login-dialog-user-selection-box {
padding: 100px 0;
}
.login-dialog-user-selection-box .login-dialog-not-listed-label { .login-dialog-user-selection-box .login-dialog-not-listed-label {
padding-left: 2px; padding-left: 2px;
} }
@ -2498,11 +2494,10 @@ StScrollBar StButton#vhandle:active {
} }
.user-widget-label { .user-widget-label {
font-size: 20px; font-size: 16pt;
font-weight: bold; font-weight: bold;
text-align: left; text-align: left;
padding-left: 18px; padding-left: 15px;
color:white;
text-shadow: black 0px 4px 3px 0px; text-shadow: black 0px 4px 3px 0px;
} }

BIN
data/wanda.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@ -1,5 +1,7 @@
NULL = NULL =
BUILT_SOURCES =
EXTRA_DIST = misc/config.js.in
CLEANFILES = misc/config.js
misc/config.js: misc/config.js.in Makefile misc/config.js: misc/config.js.in Makefile
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \ [ -d $(@D) ] || $(mkdir_p) $(@D) ; \
@ -12,26 +14,111 @@ misc/config.js: misc/config.js.in Makefile
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \ -e "s|[@]sysconfdir@|$(sysconfdir)|g" \
$< > $@ $< > $@
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/js-resources.gresource.xml) jsdir = $(pkgdatadir)/js
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
js_built_sources = js-resources.c js-resources.h nobase_dist_js_DATA = \
gdm/authPrompt.js \
BUILT_SOURCES += $(js_built_sources) gdm/batch.js \
gdm/fingerprint.js \
all-local: $(js_built_sources) gdm/loginDialog.js \
gdm/realmd.js \
js_resource_dist_files = $(filter-out misc/config.js, $(js_resource_files)) gdm/util.js \
extensionPrefs/main.js \
EXTRA_DIST = \ misc/config.js \
$(js_resource_dist_files) \ misc/extensionUtils.js \
js-resources.gresource.xml \ misc/fileUtils.js \
misc/config.js.in \ misc/gnomeSession.js \
$(NULL) misc/hash.js \
misc/history.js \
CLEANFILES = \ misc/jsParse.js \
$(js_built_sources) \ misc/loginManager.js \
misc/modemManager.js \
misc/objectManager.js \
misc/params.js \
misc/smartcardManager.js \
misc/util.js \
perf/core.js \
ui/altTab.js \
ui/animation.js \
ui/appDisplay.js \
ui/appFavorites.js \
ui/backgroundMenu.js \
ui/background.js \
ui/boxpointer.js \
ui/calendar.js \
ui/checkBox.js \
ui/ctrlAltTab.js \
ui/dash.js \
ui/dateMenu.js \
ui/dnd.js \
ui/endSessionDialog.js \
ui/extensionSystem.js \
ui/extensionDownloader.js \
ui/environment.js \
ui/focusCaretTracker.js\
ui/ibusCandidatePopup.js\
ui/grabHelper.js \
ui/iconGrid.js \
ui/keyboard.js \
ui/layout.js \
ui/lightbox.js \
ui/lookingGlass.js \
ui/magnifier.js \
ui/magnifierDBus.js \
ui/main.js \
ui/messageTray.js \
ui/modalDialog.js \
ui/separator.js \
ui/sessionMode.js \
ui/shellEntry.js \
ui/shellMountOperation.js \
ui/slider.js \
ui/notificationDaemon.js \
ui/osdWindow.js \
ui/overview.js \
ui/overviewControls.js \
ui/panel.js \
ui/panelMenu.js \
ui/pointerWatcher.js \
ui/popupMenu.js \
ui/remoteSearch.js \
ui/remoteMenu.js \
ui/runDialog.js \
ui/screencast.js \
ui/screenshot.js \
ui/screenShield.js \
ui/scripting.js \
ui/search.js \
ui/searchDisplay.js \
ui/shellDBus.js \
ui/status/accessibility.js \
ui/status/brightness.js \
ui/status/keyboard.js \
ui/status/network.js \
ui/status/power.js \
ui/status/rfkill.js \
ui/status/volume.js \
ui/status/bluetooth.js \
ui/status/screencast.js \
ui/status/system.js \
ui/switcherPopup.js \
ui/tweener.js \
ui/unlockDialog.js \
ui/userWidget.js \
ui/viewSelector.js \
ui/wanda.js \
ui/windowAttentionHandler.js \
ui/windowManager.js \
ui/workspace.js \
ui/workspaceThumbnail.js \
ui/workspacesView.js \
ui/workspaceSwitcherPopup.js \
ui/xdndHandler.js \
ui/components/__init__.js \
ui/components/autorunManager.js \
ui/components/automountManager.js \
ui/components/networkAgent.js \
ui/components/polkitAgent.js \
ui/components/telepathyClient.js \
ui/components/keyring.js \
$(NULL) $(NULL)

View File

@ -13,15 +13,13 @@ const _ = Gettext.gettext;
const Config = imports.misc.config; const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const GnomeShellIface = '<node> \ const GnomeShellIface = <interface name="org.gnome.Shell.Extensions">
<interface name="org.gnome.Shell.Extensions"> \ <signal name="ExtensionStatusChanged">
<signal name="ExtensionStatusChanged"> \ <arg type="s" name="uuid"/>
<arg type="s" name="uuid"/> \ <arg type="i" name="state"/>
<arg type="i" name="state"/> \ <arg type="s" name="error"/>
<arg type="s" name="error"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface); const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
@ -206,11 +204,11 @@ const Application = new Lang.Class({
_scanExtensions: function() { _scanExtensions: function() {
let finder = new ExtensionUtils.ExtensionFinder(); let finder = new ExtensionUtils.ExtensionFinder();
finder.connect('extension-found', Lang.bind(this, this._extensionFound)); finder.connect('extension-found', Lang.bind(this, this._extensionFound));
finder.connect('extensions-loaded', Lang.bind(this, this._extensionsLoaded));
finder.scanExtensions(); finder.scanExtensions();
this._extensionsLoaded();
}, },
_extensionFound: function(finder, extension) { _extensionFound: function(signals, extension) {
let iter = this._model.append(); let iter = this._model.append();
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]); this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
this._extensionIters[extension.uuid] = iter; this._extensionIters[extension.uuid] = iter;

View File

@ -59,7 +59,6 @@ const AuthPrompt = new Lang.Class({
this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete)); this._userVerifier.connect('verification-complete', Lang.bind(this, this._onVerificationComplete));
this._userVerifier.connect('reset', Lang.bind(this, this._onReset)); this._userVerifier.connect('reset', Lang.bind(this, this._onReset));
this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged)); this._userVerifier.connect('smartcard-status-changed', Lang.bind(this, this._onSmartcardStatusChanged));
this._userVerifier.connect('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated));
this.smartcardDetected = this._userVerifier.smartcardDetected; this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('next', Lang.bind(this, function() { this.connect('next', Lang.bind(this, function() {
@ -220,11 +219,6 @@ const AuthPrompt = new Lang.Class({
this.emit('prompted'); this.emit('prompted');
}, },
_onOVirtUserAuthenticated: function() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
},
_onSmartcardStatusChanged: function() { _onSmartcardStatusChanged: function() {
this.smartcardDetected = this._userVerifier.smartcardDetected; this.smartcardDetected = this._userVerifier.smartcardDetected;
@ -450,11 +444,10 @@ const AuthPrompt = new Lang.Class({
// The user is constant at the unlock screen, so it will immediately // The user is constant at the unlock screen, so it will immediately
// respond to the request with the username // respond to the request with the username
beginRequestType = BeginRequestType.PROVIDE_USERNAME; beginRequestType = BeginRequestType.PROVIDE_USERNAME;
} else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) || } else if (this.smartcardDetected &&
(this.smartcardDetected && this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
// We don't need to know the username if the user preempted the login screen // We don't need to know the username if the user preempted the login screen
// with a smartcard or with preauthenticated oVirt credentials // with a smartcard.
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME; beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
} else { } else {
// In all other cases, we should get the username up front. // In all other cases, we should get the username up front.

View File

@ -5,13 +5,11 @@ const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const FprintManagerIface = '<node> \ const FprintManagerIface = <interface name='net.reactivated.Fprint.Manager'>
<interface name="net.reactivated.Fprint.Manager"> \ <method name='GetDefaultDevice'>
<method name="GetDefaultDevice"> \ <arg type='o' direction='out' />
<arg type="o" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface); const FprintManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(FprintManagerIface);

View File

@ -59,7 +59,7 @@ const UserListItem = new Lang.Class({
this._userChangedId = this.user.connect('changed', this._userChangedId = this.user.connect('changed',
Lang.bind(this, this._onUserChanged)); Lang.bind(this, this._onUserChanged));
let layout = new St.BoxLayout({ vertical: true }); let layout = new St.BoxLayout({ vertical: false });
this.actor = new St.Button({ style_class: 'login-dialog-user-list-item', this.actor = new St.Button({ style_class: 'login-dialog-user-list-item',
button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE, button_mask: St.ButtonMask.ONE | St.ButtonMask.THREE,
can_focus: true, can_focus: true,
@ -68,18 +68,39 @@ const UserListItem = new Lang.Class({
x_align: St.Align.START, x_align: St.Align.START,
x_fill: true }); x_fill: true });
this._userWidget = new UserWidget.UserWidget(this.user); this._userAvatar = new UserWidget.Avatar(this.user,
layout.add(this._userWidget.actor); { styleClass: 'login-dialog-user-list-item-icon' });
layout.add(this._userAvatar.actor);
let textLayout = new St.BoxLayout({ style_class: 'login-dialog-user-list-item-text-box',
vertical: true });
layout.add(textLayout, { expand: true });
this._nameLabel = new St.Label({ style_class: 'login-dialog-user-list-item-name' });
this.actor.label_actor = this._nameLabel;
textLayout.add(this._nameLabel,
{ y_fill: false,
y_align: St.Align.MIDDLE,
expand: true });
this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator', this._timedLoginIndicator = new St.Bin({ style_class: 'login-dialog-timed-login-indicator',
scale_x: 0 }); scale_x: 0 });
layout.add(this._timedLoginIndicator); textLayout.add(this._timedLoginIndicator,
{ x_fill: true,
x_align: St.Align.MIDDLE,
y_fill: false,
y_align: St.Align.END });
this.actor.connect('clicked', Lang.bind(this, this._onClicked)); this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._onUserChanged(); this._onUserChanged();
}, },
_onUserChanged: function() { _onUserChanged: function() {
this._nameLabel.set_text(this.user.get_real_name());
this._userAvatar.update();
this._updateLoggedIn();
},
syncStyleClasses: function() {
this._updateLoggedIn(); this._updateLoggedIn();
}, },
@ -168,6 +189,7 @@ const UserList = new Lang.Class({
for (let userName in this._items) { for (let userName in this._items) {
let item = this._items[userName]; let item = this._items[userName];
item.actor.sync_hover(); item.actor.sync_hover();
item.syncStyleClasses();
} }
}, },

View File

@ -1,64 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals;
const OVirtCredentialsIface = '<node> \
<interface name="org.ovirt.vdsm.Credentials"> \
<signal name="UserAuthenticated"> \
<arg type="s" name="token"/> \
</signal> \
</interface> \
</node>';
const OVirtCredentialsInfo = Gio.DBusInterfaceInfo.new_for_xml(OVirtCredentialsIface);
let _oVirtCredentialsManager = null;
function OVirtCredentials() {
var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system,
g_interface_name: OVirtCredentialsInfo.name,
g_interface_info: OVirtCredentialsInfo,
g_name: 'org.ovirt.vdsm.Credentials',
g_object_path: '/org/ovirt/vdsm/Credentials',
g_flags: (Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
self.init(null);
return self;
}
const OVirtCredentialsManager = new Lang.Class({
Name: 'OVirtCredentialsManager',
_init: function() {
this._token = null;
this._credentials = new OVirtCredentials();
this._credentials.connectSignal('UserAuthenticated',
Lang.bind(this, this._onUserAuthenticated));
},
_onUserAuthenticated: function(proxy, sender, [token]) {
this._token = token;
this.emit('user-authenticated', token);
},
hasToken: function() {
return this._token != null;
},
getToken: function() {
return this._token;
},
resetToken: function() {
this._token = null;
}
});
Signals.addSignalMethods(OVirtCredentialsManager.prototype);
function getOVirtCredentialsManager() {
if (!_oVirtCredentialsManager)
_oVirtCredentialsManager = new OVirtCredentialsManager();
return _oVirtCredentialsManager;
}

View File

@ -5,58 +5,52 @@ const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const ProviderIface = '<node> \ const ProviderIface = <interface name='org.freedesktop.realmd.Provider'>
<interface name="org.freedesktop.realmd.Provider"> \ <property name="Name" type="s" access="read"/>
<property name="Name" type="s" access="read"/> \ <property name="Version" type="s" access="read"/>
<property name="Version" type="s" access="read"/> \ <property name="Realms" type="ao" access="read"/>
<property name="Realms" type="ao" access="read"/> \ <method name="Discover">
<method name="Discover"> \ <arg name="string" type="s" direction="in"/>
<arg name="string" type="s" direction="in"/> \ <arg name="options" type="a{sv}" direction="in"/>
<arg name="options" type="a{sv}" direction="in"/> \ <arg name="relevance" type="i" direction="out"/>
<arg name="relevance" type="i" direction="out"/> \ <arg name="realm" type="ao" direction="out"/>
<arg name="realm" type="ao" direction="out"/> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface); const Provider = Gio.DBusProxy.makeProxyWrapper(ProviderIface);
const ServiceIface = '<node> \ const ServiceIface = <interface name="org.freedesktop.realmd.Service">
<interface name="org.freedesktop.realmd.Service"> \ <method name="Cancel">
<method name="Cancel"> \ <arg name="operation" type="s" direction="in"/>
<arg name="operation" type="s" direction="in"/> \ </method>
</method> \ <method name="Release" />
<method name="Release" /> \ <method name="SetLocale">
<method name="SetLocale"> \ <arg name="locale" type="s" direction="in"/>
<arg name="locale" type="s" direction="in"/> \ </method>
</method> \ <signal name="Diagnostics">
<signal name="Diagnostics"> \ <arg name="data" type="s"/>
<arg name="data" type="s"/> \ <arg name="operation" type="s"/>
<arg name="operation" type="s"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface); const Service = Gio.DBusProxy.makeProxyWrapper(ServiceIface);
const RealmIface = '<node> \ const RealmIface = <interface name="org.freedesktop.realmd.Realm">
<interface name="org.freedesktop.realmd.Realm"> \ <property name="Name" type="s" access="read"/>
<property name="Name" type="s" access="read"/> \ <property name="Configured" type="s" access="read"/>
<property name="Configured" type="s" access="read"/> \ <property name="Details" type="a(ss)" access="read"/>
<property name="Details" type="a(ss)" access="read"/> \ <property name="LoginFormats" type="as" access="read"/>
<property name="LoginFormats" type="as" access="read"/> \ <property name="LoginPolicy" type="s" access="read"/>
<property name="LoginPolicy" type="s" access="read"/> \ <property name="PermittedLogins" type="as" access="read"/>
<property name="PermittedLogins" type="as" access="read"/> \ <property name="SupportedInterfaces" type="as" access="read"/>
<property name="SupportedInterfaces" type="as" access="read"/> \ <method name="ChangeLoginPolicy">
<method name="ChangeLoginPolicy"> \ <arg name="login_policy" type="s" direction="in"/>
<arg name="login_policy" type="s" direction="in"/> \ <arg name="permitted_add" type="as" direction="in"/>
<arg name="permitted_add" type="as" direction="in"/> \ <arg name="permitted_remove" type="as" direction="in"/>
<arg name="permitted_remove" type="as" direction="in"/> \ <arg name="options" type="a{sv}" direction="in"/>
<arg name="options" type="a{sv}" direction="in"/> \ </method>
</method> \ <method name="Deconfigure">
<method name="Deconfigure"> \ <arg name="options" type="a{sv}" direction="in"/>
<arg name="options" type="a{sv}" direction="in"/> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface); const Realm = Gio.DBusProxy.makeProxyWrapper(RealmIface);
const Manager = new Lang.Class({ const Manager = new Lang.Class({

View File

@ -10,7 +10,6 @@ const St = imports.gi.St;
const Batch = imports.gdm.batch; const Batch = imports.gdm.batch;
const Fprint = imports.gdm.fingerprint; const Fprint = imports.gdm.fingerprint;
const OVirt = imports.gdm.oVirt;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params; const Params = imports.misc.params;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
@ -20,7 +19,6 @@ const Tweener = imports.ui.tweener;
const PASSWORD_SERVICE_NAME = 'gdm-password'; const PASSWORD_SERVICE_NAME = 'gdm-password';
const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint'; const FINGERPRINT_SERVICE_NAME = 'gdm-fingerprint';
const SMARTCARD_SERVICE_NAME = 'gdm-smartcard'; const SMARTCARD_SERVICE_NAME = 'gdm-smartcard';
const OVIRT_SERVICE_NAME = 'gdm-ovirtcred';
const FADE_ANIMATION_TIME = 0.16; const FADE_ANIMATION_TIME = 0.16;
const CLONE_FADE_ANIMATION_TIME = 0.25; const CLONE_FADE_ANIMATION_TIME = 0.25;
@ -153,14 +151,6 @@ const ShellUserVerifier = new Lang.Class({
this.reauthenticating = false; this.reauthenticating = false;
this._failCounter = 0; this._failCounter = 0;
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
}, },
begin: function(userName, hold) { begin: function(userName, hold) {
@ -287,11 +277,6 @@ const ShellUserVerifier = new Lang.Class({
})); }));
}, },
_oVirtUserAuthenticated: function(token) {
this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated');
},
_checkForSmartcard: function() { _checkForSmartcard: function() {
let smartcardDetected; let smartcardDetected;
@ -470,12 +455,6 @@ const ShellUserVerifier = new Lang.Class({
if (!this.serviceIsForeground(serviceName)) if (!this.serviceIsForeground(serviceName))
return; return;
if (serviceName == OVIRT_SERVICE_NAME) {
// The only question asked by this service is "Token?"
this.answerQuery(serviceName, this._oVirtCredentialsManager.getToken());
return;
}
this.emit('ask-question', serviceName, secretQuestion, '\u25cf'); this.emit('ask-question', serviceName, secretQuestion, '\u25cf');
}, },
@ -536,16 +515,6 @@ const ShellUserVerifier = new Lang.Class({
}, },
_onConversationStopped: function(client, serviceName) { _onConversationStopped: function(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken();
this._preemptingService = null;
this._verificationFailed(false);
return;
}
// if the password service fails, then cancel everything. // if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give // But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed // password authentication a chance to succeed

View File

@ -1,108 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/org/gnome/shell">
<file>gdm/authPrompt.js</file>
<file>gdm/batch.js</file>
<file>gdm/fingerprint.js</file>
<file>gdm/loginDialog.js</file>
<file>gdm/oVirt.js</file>
<file>gdm/realmd.js</file>
<file>gdm/util.js</file>
<file>extensionPrefs/main.js</file>
<file>misc/config.js</file>
<file>misc/extensionUtils.js</file>
<file>misc/fileUtils.js</file>
<file>misc/gnomeSession.js</file>
<file>misc/hash.js</file>
<file>misc/history.js</file>
<file>misc/jsParse.js</file>
<file>misc/loginManager.js</file>
<file>misc/modemManager.js</file>
<file>misc/objectManager.js</file>
<file>misc/params.js</file>
<file>misc/smartcardManager.js</file>
<file>misc/util.js</file>
<file>perf/core.js</file>
<file>ui/altTab.js</file>
<file>ui/animation.js</file>
<file>ui/appDisplay.js</file>
<file>ui/appFavorites.js</file>
<file>ui/backgroundMenu.js</file>
<file>ui/background.js</file>
<file>ui/boxpointer.js</file>
<file>ui/calendar.js</file>
<file>ui/checkBox.js</file>
<file>ui/ctrlAltTab.js</file>
<file>ui/dash.js</file>
<file>ui/dateMenu.js</file>
<file>ui/dnd.js</file>
<file>ui/endSessionDialog.js</file>
<file>ui/extensionSystem.js</file>
<file>ui/extensionDownloader.js</file>
<file>ui/environment.js</file>
<file>ui/focusCaretTracker.js</file>
<file>ui/ibusCandidatePopup.js</file>
<file>ui/grabHelper.js</file>
<file>ui/iconGrid.js</file>
<file>ui/keyboard.js</file>
<file>ui/layout.js</file>
<file>ui/lightbox.js</file>
<file>ui/lookingGlass.js</file>
<file>ui/magnifier.js</file>
<file>ui/magnifierDBus.js</file>
<file>ui/main.js</file>
<file>ui/messageTray.js</file>
<file>ui/modalDialog.js</file>
<file>ui/separator.js</file>
<file>ui/sessionMode.js</file>
<file>ui/shellEntry.js</file>
<file>ui/shellMountOperation.js</file>
<file>ui/slider.js</file>
<file>ui/notificationDaemon.js</file>
<file>ui/osdWindow.js</file>
<file>ui/overview.js</file>
<file>ui/overviewControls.js</file>
<file>ui/panel.js</file>
<file>ui/panelMenu.js</file>
<file>ui/pointerWatcher.js</file>
<file>ui/popupMenu.js</file>
<file>ui/remoteSearch.js</file>
<file>ui/remoteMenu.js</file>
<file>ui/runDialog.js</file>
<file>ui/screencast.js</file>
<file>ui/screenshot.js</file>
<file>ui/screenShield.js</file>
<file>ui/scripting.js</file>
<file>ui/search.js</file>
<file>ui/shellDBus.js</file>
<file>ui/status/accessibility.js</file>
<file>ui/status/brightness.js</file>
<file>ui/status/keyboard.js</file>
<file>ui/status/network.js</file>
<file>ui/status/power.js</file>
<file>ui/status/rfkill.js</file>
<file>ui/status/volume.js</file>
<file>ui/status/bluetooth.js</file>
<file>ui/status/screencast.js</file>
<file>ui/status/system.js</file>
<file>ui/switcherPopup.js</file>
<file>ui/tweener.js</file>
<file>ui/unlockDialog.js</file>
<file>ui/userWidget.js</file>
<file>ui/viewSelector.js</file>
<file>ui/windowAttentionHandler.js</file>
<file>ui/windowManager.js</file>
<file>ui/workspace.js</file>
<file>ui/workspaceThumbnail.js</file>
<file>ui/workspacesView.js</file>
<file>ui/workspaceSwitcherPopup.js</file>
<file>ui/xdndHandler.js</file>
<file>ui/components/__init__.js</file>
<file>ui/components/autorunManager.js</file>
<file>ui/components/automountManager.js</file>
<file>ui/components/networkAgent.js</file>
<file>ui/components/polkitAgent.js</file>
<file>ui/components/telepathyClient.js</file>
<file>ui/components/keyring.js</file>
</gresource>
</gresources>

View File

@ -174,9 +174,17 @@ const ExtensionFinder = new Lang.Class({
this.emit('extension-found', extension); this.emit('extension-found', extension);
}, },
_extensionsLoaded: function() {
this.emit('extensions-loaded');
},
scanExtensions: function() { scanExtensions: function() {
let perUserDir = Gio.File.new_for_path(global.userdatadir); let perUserDir = Gio.File.new_for_path(global.userdatadir);
FileUtils.collectFromDatadirs('extensions', true, Lang.bind(this, this._loadExtension, perUserDir)); FileUtils.collectFromDatadirsAsync('extensions',
{ processFile: Lang.bind(this, this._loadExtension),
loadedCallback: Lang.bind(this, this._extensionsLoaded),
includeUserDir: true,
data: perUserDir });
} }
}); });
Signals.addSignalMethods(ExtensionFinder.prototype); Signals.addSignalMethods(ExtensionFinder.prototype);

View File

@ -25,27 +25,60 @@ function listDirAsync(file, callback) {
}); });
} }
function collectFromDatadirs(subdir, includeUserDir, processFile) { function _collectFromDirectoryAsync(dir, loadState) {
function done() {
loadState.numLoading--;
if (loadState.loadedCallback &&
loadState.numLoading == 0)
loadState.loadedCallback(loadState.data);
}
dir.query_info_async('standard::type', Gio.FileQueryInfoFlags.NONE,
GLib.PRIORITY_DEFAULT, null, function(object, res) {
try {
object.query_info_finish(res);
} catch (e) {
if (!e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND))
log(e.message);
done();
return;
}
listDirAsync(dir, Lang.bind(this, function(infos) {
for (let i = 0; i < infos.length; i++)
loadState.processFile(dir.get_child(infos[i].get_name()),
infos[i], loadState.data);
done();
}));
});
}
function collectFromDatadirsAsync(subdir, params) {
params = Params.parse(params, { includeUserDir: false,
processFile: null,
loadedCallback: null,
data: null });
let loadState = { data: params.data,
numLoading: 0,
loadedCallback: params.loadedCallback,
processFile: params.processFile };
if (params.processFile == null) {
if (params.loadedCallback)
params.loadedCallback(params.data);
return;
}
let dataDirs = GLib.get_system_data_dirs(); let dataDirs = GLib.get_system_data_dirs();
if (includeUserDir) if (params.includeUserDir)
dataDirs.unshift(GLib.get_user_data_dir()); dataDirs.unshift(GLib.get_user_data_dir());
loadState.numLoading = dataDirs.length;
for (let i = 0; i < dataDirs.length; i++) { for (let i = 0; i < dataDirs.length; i++) {
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]); let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', subdir]);
let dir = Gio.File.new_for_path(path); let dir = Gio.File.new_for_path(path);
let fileEnum; _collectFromDirectoryAsync(dir, loadState);
try {
fileEnum = dir.enumerate_children('standard::name,standard::type',
Gio.FileQueryInfoFlags.NONE, null);
} catch (e) {
fileEnum = null;
}
if (fileEnum != null) {
let info;
while ((info = fileEnum.next_file(null)))
processFile(fileEnum.get_child(info), info);
}
} }
} }

View File

@ -4,17 +4,15 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const PresenceIface = '<node> \ const PresenceIface = <interface name="org.gnome.SessionManager.Presence">
<interface name="org.gnome.SessionManager.Presence"> \ <method name="SetStatus">
<method name="SetStatus"> \ <arg type="u" direction="in"/>
<arg type="u" direction="in"/> \ </method>
</method> \ <property name="status" type="u" access="readwrite"/>
<property name="status" type="u" access="readwrite"/> \ <signal name="StatusChanged">
<signal name="StatusChanged"> \ <arg type="u" direction="out"/>
<arg type="u" direction="out"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const PresenceStatus = { const PresenceStatus = {
AVAILABLE: 0, AVAILABLE: 0,
@ -32,16 +30,14 @@ function Presence(initCallback, cancellable) {
// Note inhibitors are immutable objects, so they don't // Note inhibitors are immutable objects, so they don't
// change at runtime (changes always come in the form // change at runtime (changes always come in the form
// of new inhibitors) // of new inhibitors)
const InhibitorIface = '<node> \ const InhibitorIface = <interface name="org.gnome.SessionManager.Inhibitor">
<interface name="org.gnome.SessionManager.Inhibitor"> \ <method name="GetAppId">
<method name="GetAppId"> \ <arg type="s" direction="out" />
<arg type="s" direction="out" /> \ </method>
</method> \ <method name="GetReason">
<method name="GetReason"> \ <arg type="s" direction="out" />
<arg type="s" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface); var InhibitorProxy = Gio.DBusProxy.makeProxyWrapper(InhibitorIface);
function Inhibitor(objectPath, initCallback, cancellable) { function Inhibitor(objectPath, initCallback, cancellable) {
@ -49,29 +45,27 @@ function Inhibitor(objectPath, initCallback, cancellable) {
} }
// Not the full interface, only the methods we use // Not the full interface, only the methods we use
const SessionManagerIface = '<node> \ const SessionManagerIface = <interface name="org.gnome.SessionManager">
<interface name="org.gnome.SessionManager"> \ <method name="Logout">
<method name="Logout"> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ </method>
</method> \ <method name="Shutdown" />
<method name="Shutdown" /> \ <method name="Reboot" />
<method name="Reboot" /> \ <method name="CanShutdown">
<method name="CanShutdown"> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="IsInhibited">
<method name="IsInhibited"> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <property name="SessionIsActive" type="b" access="read"/>
<property name="SessionIsActive" type="b" access="read"/> \ <signal name="InhibitorAdded">
<signal name="InhibitorAdded"> \ <arg type="o" direction="out"/>
<arg type="o" direction="out"/> \ </signal>
</signal> \ <signal name="InhibitorRemoved">
<signal name="InhibitorRemoved"> \ <arg type="o" direction="out"/>
<arg type="o" direction="out"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface); var SessionManagerProxy = Gio.DBusProxy.makeProxyWrapper(SessionManagerIface);
function SessionManager(initCallback, cancellable) { function SessionManager(initCallback, cancellable) {

View File

@ -7,66 +7,58 @@ const Mainloop = imports.mainloop;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const SystemdLoginManagerIface = '<node> \ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager'>
<interface name="org.freedesktop.login1.Manager"> \ <method name='Suspend'>
<method name="Suspend"> \ <arg type='b' direction='in'/>
<arg type="b" direction="in"/> \ </method>
</method> \ <method name='CanSuspend'>
<method name="CanSuspend"> \ <arg type='s' direction='out'/>
<arg type="s" direction="out"/> \ </method>
</method> \ <method name='Inhibit'>
<method name="Inhibit"> \ <arg type='s' direction='in'/>
<arg type="s" direction="in"/> \ <arg type='s' direction='in'/>
<arg type="s" direction="in"/> \ <arg type='s' direction='in'/>
<arg type="s" direction="in"/> \ <arg type='s' direction='in'/>
<arg type="s" direction="in"/> \ <arg type='h' direction='out'/>
<arg type="h" direction="out"/> \ </method>
</method> \ <method name='GetSession'>
<method name="GetSession"> \ <arg type='s' direction='in'/>
<arg type="s" direction="in"/> \ <arg type='o' direction='out'/>
<arg type="o" direction="out"/> \ </method>
</method> \ <method name='ListSessions'>
<method name="ListSessions"> \ <arg name='sessions' type='a(susso)' direction='out'/>
<arg name="sessions" type="a(susso)" direction="out"/> \ </method>
</method> \ <signal name='PrepareForSleep'>
<signal name="PrepareForSleep"> \ <arg type='b' direction='out'/>
<arg type="b" direction="out"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const SystemdLoginSessionIface = '<node> \ const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
<interface name="org.freedesktop.login1.Session"> \ <signal name='Lock' />
<signal name="Lock" /> \ <signal name='Unlock' />
<signal name="Unlock" /> \ </interface>;
</interface> \
</node>';
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface);
const ConsoleKitManagerIface = '<node> \ const ConsoleKitManagerIface = <interface name='org.freedesktop.ConsoleKit.Manager'>
<interface name="org.freedesktop.ConsoleKit.Manager"> \ <method name='CanRestart'>
<method name="CanRestart"> \ <arg type='b' direction='out'/>
<arg type="b" direction="out"/> \ </method>
</method> \ <method name='CanStop'>
<method name="CanStop"> \ <arg type='b' direction='out'/>
<arg type="b" direction="out"/> \ </method>
</method> \ <method name='Restart' />
<method name="Restart" /> \ <method name='Stop' />
<method name="Stop" /> \ <method name='GetCurrentSession'>
<method name="GetCurrentSession"> \ <arg type='o' direction='out' />
<arg type="o" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const ConsoleKitSessionIface = '<node> \ const ConsoleKitSessionIface = <interface name='org.freedesktop.ConsoleKit.Session'>
<interface name="org.freedesktop.ConsoleKit.Session"> \ <signal name='Lock' />
<signal name="Lock" /> \ <signal name='Unlock' />
<signal name="Unlock" /> \ </interface>;
</interface> \
</node>';
const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface); const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);

View File

@ -92,41 +92,37 @@ function _findProviderForSid(sid) {
// The following are not the complete interfaces, just the methods we need // The following are not the complete interfaces, just the methods we need
// (or may need in the future) // (or may need in the future)
const ModemGsmNetworkInterface = '<node> \ const ModemGsmNetworkInterface = <interface name="org.freedesktop.ModemManager.Modem.Gsm.Network">
<interface name="org.freedesktop.ModemManager.Modem.Gsm.Network"> \ <method name="GetRegistrationInfo">
<method name="GetRegistrationInfo"> \ <arg type="(uss)" direction="out" />
<arg type="(uss)" direction="out" /> \ </method>
</method> \ <method name="GetSignalQuality">
<method name="GetSignalQuality"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </method>
</method> \ <property name="AccessTechnology" type="u" access="read" />
<property name="AccessTechnology" type="u" access="read" /> \ <signal name="SignalQuality">
<signal name="SignalQuality"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </signal>
</signal> \ <signal name="RegistrationInfo">
<signal name="RegistrationInfo"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ <arg type="s" direction="out" />
<arg type="s" direction="out" /> \ <arg type="s" direction="out" />
<arg type="s" direction="out" /> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface); const ModemGsmNetworkProxy = Gio.DBusProxy.makeProxyWrapper(ModemGsmNetworkInterface);
const ModemCdmaInterface = '<node> \ const ModemCdmaInterface = <interface name="org.freedesktop.ModemManager.Modem.Cdma">
<interface name="org.freedesktop.ModemManager.Modem.Cdma"> \ <method name="GetSignalQuality">
<method name="GetSignalQuality"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </method>
</method> \ <method name="GetServingSystem">
<method name="GetServingSystem"> \ <arg type="(usu)" direction="out" />
<arg type="(usu)" direction="out" /> \ </method>
</method> \ <signal name="SignalQuality">
<signal name="SignalQuality"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface); const ModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(ModemCdmaInterface);
@ -222,26 +218,20 @@ Signals.addSignalMethods(ModemCdma.prototype);
// Support for the new ModemManager1 interface (MM >= 0.7) // Support for the new ModemManager1 interface (MM >= 0.7)
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
const BroadbandModemInterface = '<node> \ const BroadbandModemInterface = <interface name="org.freedesktop.ModemManager1.Modem">
<interface name="org.freedesktop.ModemManager1.Modem"> \ <property name="SignalQuality" type="(ub)" access="read" />
<property name="SignalQuality" type="(ub)" access="read" /> \ </interface>;
</interface> \
</node>';
const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface); const BroadbandModemProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemInterface);
const BroadbandModem3gppInterface = '<node> \ const BroadbandModem3gppInterface = <interface name="org.freedesktop.ModemManager1.Modem.Modem3gpp">
<interface name="org.freedesktop.ModemManager1.Modem.Modem3gpp"> \ <property name="OperatorCode" type="s" access="read" />
<property name="OperatorCode" type="s" access="read" /> \ <property name="OperatorName" type="s" access="read" />
<property name="OperatorName" type="s" access="read" /> \ </interface>;
</interface> \
</node>';
const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gppInterface); const BroadbandModem3gppProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModem3gppInterface);
const BroadbandModemCdmaInterface = '<node> \ const BroadbandModemCdmaInterface = <interface name="org.freedesktop.ModemManager1.Modem.ModemCdma">
<interface name="org.freedesktop.ModemManager1.Modem.ModemCdma"> \ <property name="Sid" type="u" access="read" />
<property name="Sid" type="u" access="read" /> \ </interface>;
</interface> \
</node>';
const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface); const BroadbandModemCdmaProxy = Gio.DBusProxy.makeProxyWrapper(BroadbandModemCdmaInterface);
const BroadbandModem = new Lang.Class({ const BroadbandModem = new Lang.Class({

View File

@ -8,21 +8,19 @@ const Signals = imports.signals;
// Specified in the D-Bus specification here: // Specified in the D-Bus specification here:
// http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager // http://dbus.freedesktop.org/doc/dbus-specification.html#standard-interfaces-objectmanager
const ObjectManagerIface = '<node> \ const ObjectManagerIface = <interface name="org.freedesktop.DBus.ObjectManager">
<interface name="org.freedesktop.DBus.ObjectManager"> \ <method name="GetManagedObjects">
<method name="GetManagedObjects"> \ <arg name="objects" type="a{oa{sa{sv}}}" direction="out"/>
<arg name="objects" type="a{oa{sa{sv}}}" direction="out"/> \ </method>
</method> \ <signal name="InterfacesAdded">
<signal name="InterfacesAdded"> \ <arg name="objectPath" type="o"/>
<arg name="objectPath" type="o"/> \ <arg name="interfaces" type="a{sa{sv}}" />
<arg name="interfaces" type="a{sa{sv}}" /> \ </signal>
</signal> \ <signal name="InterfacesRemoved">
<signal name="InterfacesRemoved"> \ <arg name="objectPath" type="o"/>
<arg name="objectPath" type="o"/> \ <arg name="interfaces" type="as" />
<arg name="interfaces" type="as" /> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface); const ObjectManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ObjectManagerIface);

View File

@ -7,14 +7,12 @@ const Signals = imports.signals;
const ObjectManager = imports.misc.objectManager; const ObjectManager = imports.misc.objectManager;
const SmartcardTokenIface = '<node> \ const SmartcardTokenIface = <interface name="org.gnome.SettingsDaemon.Smartcard.Token">
<interface name="org.gnome.SettingsDaemon.Smartcard.Token"> \ <property name="Name" type="s" access="read"/>
<property name="Name" type="s" access="read"/> \ <property name="Driver" type="o" access="read"/>
<property name="Driver" type="o" access="read"/> \ <property name="IsInserted" type="b" access="read"/>
<property name="IsInserted" type="b" access="read"/> \ <property name="UsedToLogin" type="b" access="read"/>
<property name="UsedToLogin" type="b" access="read"/> \ </interface>;
</interface> \
</node>';
let _smartcardManager = null; let _smartcardManager = null;

View File

@ -1,7 +1,6 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
@ -80,22 +79,6 @@ function spawnCommandLine(command_line) {
} }
} }
// spawnApp:
// @argv: an argv array
//
// Runs @argv as if it was an application, handling startup notification
function spawnApp(argv) {
try {
let app = Gio.AppInfo.create_from_commandline(argv.join(' '), null,
Gio.AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION);
let context = global.create_app_launch_context();
app.launch([], context);
} catch(err) {
_handleSpawnError(argv[0], err);
}
}
// trySpawn: // trySpawn:
// @argv: an argv array // @argv: an argv array
// //

View File

@ -106,8 +106,6 @@ const AppSwitcherPopup = new Lang.Class({
this._switcherList = new AppSwitcher(apps, this); this._switcherList = new AppSwitcher(apps, this);
this._items = this._switcherList.icons; this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true; return true;
}, },
@ -377,9 +375,6 @@ const WindowSwitcherPopup = new Lang.Class({
this._switcherList = new WindowList(windows, mode); this._switcherList = new WindowList(windows, mode);
this._items = this._switcherList.icons; this._items = this._switcherList.icons;
if (this._items.length == 0)
return false;
return true; return true;
}, },

View File

@ -92,7 +92,7 @@ const BaseAppView = new Lang.Class({
}, },
removeAll: function() { removeAll: function() {
this._grid.destroyAll(); this._grid.removeAll();
this._items = {}; this._items = {};
this._allItems = []; this._allItems = [];
}, },
@ -613,10 +613,6 @@ const FrequentView = new Lang.Class({
return this._usage.get_most_used("").length >= MIN_FREQUENT_APPS_COUNT; return this._usage.get_most_used("").length >= MIN_FREQUENT_APPS_COUNT;
}, },
removeAll: function() {
this._grid.destroyAll();
},
loadApps: function() { loadApps: function() {
let mostUsed = this._usage.get_most_used (""); let mostUsed = this._usage.get_most_used ("");
let hasUsefulData = this.hasUsefulData(); let hasUsefulData = this.hasUsefulData();
@ -747,15 +743,10 @@ const AppDisplay = new Lang.Class({
this._views[i].control.connect('clicked', Lang.bind(this, this._views[i].control.connect('clicked', Lang.bind(this,
function(actor) { function(actor) {
this._showView(viewIndex); this._showView(viewIndex);
global.settings.set_uint('app-picker-view', viewIndex);
})); }));
} }
let initialView = Math.min(global.settings.get_uint('app-picker-view'),
this._views.length - 1);
let frequentUseful = this._views[Views.FREQUENT].view.hasUsefulData(); let frequentUseful = this._views[Views.FREQUENT].view.hasUsefulData();
if (initialView == Views.FREQUENT && !frequentUseful) this._showView(frequentUseful ? Views.FREQUENT : Views.ALL);
initialView = Views.ALL;
this._showView(initialView);
this._updateFrequentVisibility(); this._updateFrequentVisibility();
// We need a dummy actor to catch the keyboard focus if the // We need a dummy actor to catch the keyboard focus if the
@ -884,16 +875,19 @@ const AppSearchProvider = new Lang.Class({
callback(metas); callback(metas);
}, },
filterResults: function(results, maxNumber) { _compareResults: function(a, b) {
return results.slice(0, maxNumber); let usage = Shell.AppUsage.get_default();
return usage.compare('', a, b);
}, },
getInitialResultSet: function(terms, callback, cancellable) { getInitialResultSet: function(terms) {
callback(this._appSys.initial_search(terms)); let query = terms.join(' ');
let results = Gio.DesktopAppInfo.search(query, Lang.bind(this, this._compareResults), MAX_COLUMNS);
this.searchSystem.setResults(this, results);
}, },
getSubsearchResultSet: function(previousResults, terms, callback, cancellable) { getSubsearchResultSet: function(previousResults, terms) {
callback(this._appSys.subsearch(previousResults, terms)); this.getInitialResultSet(terms);
}, },
activateResult: function(result) { activateResult: function(result) {
@ -916,7 +910,7 @@ const AppSearchProvider = new Lang.Class({
app.open_new_window(workspace); app.open_new_window(workspace);
}, },
createResultObject: function (resultMeta) { createResultObject: function (resultMeta, terms) {
let app = this._appSys.lookup_app(resultMeta['id']); let app = this._appSys.lookup_app(resultMeta['id']);
return new AppIcon(app); return new AppIcon(app);
} }
@ -1355,9 +1349,7 @@ const AppIcon = new Lang.Class({
this._removeMenuTimeout(); this._removeMenuTimeout();
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT, this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
Lang.bind(this, function() { Lang.bind(this, function() {
this._menuTimeoutId = 0;
this.popupMenu(); this.popupMenu();
return false;
})); }));
} else if (button == 3) { } else if (button == 3) {
this.popupMenu(); this.popupMenu();

View File

@ -315,6 +315,7 @@ const Background = new Lang.Class({
this._brightness = 1.0; this._brightness = 1.0;
this._vignetteSharpness = 0.2; this._vignetteSharpness = 0.2;
this._saturation = 1.0;
this._cancellable = new Gio.Cancellable(); this._cancellable = new Gio.Cancellable();
this.isLoaded = false; this.isLoaded = false;
@ -415,6 +416,7 @@ const Background = new Lang.Class({
}, },
_addImage: function(content, index, filename) { _addImage: function(content, index, filename) {
content.saturation = this._saturation;
content.brightness = this._brightness; content.brightness = this._brightness;
content.vignette_sharpness = this._vignetteSharpness; content.vignette_sharpness = this._vignetteSharpness;
@ -430,6 +432,7 @@ const Background = new Lang.Class({
}, },
_updateImage: function(content, index, filename) { _updateImage: function(content, index, filename) {
content.saturation = this._saturation;
content.brightness = this._brightness; content.brightness = this._brightness;
content.vignette_sharpness = this._vignetteSharpness; content.vignette_sharpness = this._vignetteSharpness;
@ -587,6 +590,24 @@ const Background = new Lang.Class({
this._loadFile(filename); this._loadFile(filename);
}, },
get saturation() {
return this._saturation;
},
set saturation(saturation) {
this._saturation = saturation;
if (this._pattern && this._pattern.content)
this._pattern.content.saturation = saturation;
let keys = Object.keys(this._images);
for (let i = 0; i < keys.length; i++) {
let image = this._images[keys[i]];
if (image && image.content)
image.content.saturation = saturation;
}
},
get brightness() { get brightness() {
return this._brightness; return this._brightness;
}, },
@ -730,6 +751,7 @@ const BackgroundManager = new Lang.Class({
let newBackground = this._createBackground(monitorIndex); let newBackground = this._createBackground(monitorIndex);
newBackground.vignetteSharpness = background.vignetteSharpness; newBackground.vignetteSharpness = background.vignetteSharpness;
newBackground.brightness = background.brightness; newBackground.brightness = background.brightness;
newBackground.saturation = background.saturation;
newBackground.visible = background.visible; newBackground.visible = background.visible;
newBackground.loadedSignalId = newBackground.connect('loaded', newBackground.loadedSignalId = newBackground.connect('loaded',

View File

@ -185,9 +185,7 @@ const BoxPointer = new Lang.Class({
}, },
_getPreferredHeight: function(actor, forWidth, alloc) { _getPreferredHeight: function(actor, forWidth, alloc) {
let themeNode = this.actor.get_theme_node(); let [minSize, naturalSize] = this.bin.get_preferred_height(forWidth);
let borderWidth = themeNode.get_length('-arrow-border-width');
let [minSize, naturalSize] = this.bin.get_preferred_height(forWidth - 2 * borderWidth);
alloc.min_size = minSize; alloc.min_size = minSize;
alloc.natural_size = naturalSize; alloc.natural_size = naturalSize;
this._adjustAllocationForArrow(false, alloc); this._adjustAllocationForArrow(false, alloc);

View File

@ -190,18 +190,16 @@ const EmptyEventSource = new Lang.Class({
}); });
Signals.addSignalMethods(EmptyEventSource.prototype); Signals.addSignalMethods(EmptyEventSource.prototype);
const CalendarServerIface = '<node> \ const CalendarServerIface = <interface name="org.gnome.Shell.CalendarServer">
<interface name="org.gnome.Shell.CalendarServer"> \ <method name="GetEvents">
<method name="GetEvents"> \ <arg type="x" direction="in" />
<arg type="x" direction="in" /> \ <arg type="x" direction="in" />
<arg type="x" direction="in" /> \ <arg type="b" direction="in" />
<arg type="b" direction="in" /> \ <arg type="a(sssbxxa{sv})" direction="out" />
<arg type="a(sssbxxa{sv})" direction="out" /> \ </method>
</method> \ <property name="HasCalendars" type="b" access="read" />
<property name="HasCalendars" type="b" access="read" /> \ <signal name="Changed" />
<signal name="Changed" /> \ </interface>;
</interface> \
</node>';
const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface); const CalendarServerInfo = Gio.DBusInterfaceInfo.new_for_xml(CalendarServerIface);

View File

@ -75,14 +75,12 @@ function startAppForMount(app, mount) {
/******************************************/ /******************************************/
const HotplugSnifferIface = '<node> \ const HotplugSnifferIface = <interface name="org.gnome.Shell.HotplugSniffer">
<interface name="org.gnome.Shell.HotplugSniffer"> \ <method name="SniffURI">
<method name="SniffURI"> \ <arg type="s" direction="in" />
<arg type="s" direction="in" /> \ <arg type="as" direction="out" />
<arg type="as" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface); const HotplugSnifferProxy = Gio.DBusProxy.makeProxyWrapper(HotplugSnifferIface);
function HotplugSniffer() { function HotplugSniffer() {

View File

@ -13,6 +13,8 @@ const ModalDialog = imports.ui.modalDialog;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const CheckBox = imports.ui.checkBox; const CheckBox = imports.ui.checkBox;
let prompter = null;
const KeyringDialog = new Lang.Class({ const KeyringDialog = new Lang.Class({
Name: 'KeyringDialog', Name: 'KeyringDialog',
Extends: ModalDialog.ModalDialog, Extends: ModalDialog.ModalDialog,
@ -246,13 +248,11 @@ const KeyringPrompter = new Lang.Class({
function() { function() {
let dialog = this._enabled ? new KeyringDialog() let dialog = this._enabled ? new KeyringDialog()
: new KeyringDummyDialog(); : new KeyringDummyDialog();
this._currentPrompt = dialog.prompt; return dialog.prompt;
return this._currentPrompt;
})); }));
this._dbusId = null; this._dbusId = null;
this._registered = false; this._registered = false;
this._enabled = false; this._enabled = false;
this._currentPrompt = null;
}, },
enable: function() { enable: function() {
@ -267,10 +267,6 @@ const KeyringPrompter = new Lang.Class({
disable: function() { disable: function() {
this._enabled = false; this._enabled = false;
if (this._prompter.prompting)
this._currentPrompt.cancel();
this._currentPrompt = null;
} }
}); });

View File

@ -138,8 +138,6 @@ const NetworkSecretDialog = new Lang.Class({
key: Clutter.KEY_Escape, key: Clutter.KEY_Escape,
}, },
this._okButton]); this._okButton]);
this._updateOkButton();
}, },
_updateOkButton: function() { _updateOkButton: function() {
@ -434,7 +432,6 @@ const VPNRequestHandler = new Lang.Class({
}, },
_vpnChildFinished: function(pid, status, requestObj) { _vpnChildFinished: function(pid, status, requestObj) {
this._childWatch = 0;
if (this._newStylePlugin) { if (this._newStylePlugin) {
// For new style plugin, all work is done in the async reading functions // For new style plugin, all work is done in the async reading functions
// Just reap the process here // Just reap the process here

View File

@ -13,6 +13,7 @@ const Tp = imports.gi.TelepathyGLib;
const History = imports.misc.history; const History = imports.misc.history;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const Params = imports.misc.params; const Params = imports.misc.params;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@ -415,7 +416,7 @@ const TelepathyClient = new Lang.Class({
_ensureAppSource: function() { _ensureAppSource: function() {
if (this._appSource == null) { if (this._appSource == null) {
this._appSource = new MessageTray.Source(_("Chat"), 'empathy'); this._appSource = new MessageTray.Source(_("Chat"), 'empathy');
this._appSource.policy = new MessageTray.NotificationApplicationPolicy('empathy'); this._appSource.policy = new NotificationDaemon.NotificationApplicationPolicy('empathy');
Main.messageTray.add(this._appSource); Main.messageTray.add(this._appSource);
this._appSource.connect('destroy', Lang.bind(this, function () { this._appSource.connect('destroy', Lang.bind(this, function () {
@ -446,7 +447,6 @@ const ChatSource = new Lang.Class({
this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed)); this._closedId = this._channel.connect('invalidated', Lang.bind(this, this._channelClosed));
this._notification = new ChatNotification(this); this._notification = new ChatNotification(this);
this._notification.connect('clicked', Lang.bind(this, this.open));
this._notification.setUrgency(MessageTray.Urgency.HIGH); this._notification.setUrgency(MessageTray.Urgency.HIGH);
this._notifyTimeoutId = 0; this._notifyTimeoutId = 0;
@ -488,7 +488,7 @@ const ChatSource = new Lang.Class({
}, },
_createPolicy: function() { _createPolicy: function() {
return new MessageTray.NotificationApplicationPolicy('empathy'); return new NotificationDaemon.NotificationApplicationPolicy('empathy');
}, },
_updateAlias: function() { _updateAlias: function() {
@ -545,19 +545,20 @@ const ChatSource = new Lang.Class({
this._notification.update(this._notification.title, null, { customContent: true }); this._notification.update(this._notification.title, null, { customContent: true });
}, },
open: function() { open: function(notification) {
if (this._client.is_handling_channel(this._channel)) { if (this._client.is_handling_channel(this._channel)) {
// We are handling the channel, try to pass it to Empathy // We are handling the channel, try to pass it to Empathy
this._client.delegate_channels_async([this._channel], this._client.delegate_channels_async([this._channel],
global.get_current_time(), global.get_current_time(),
'org.freedesktop.Telepathy.Client.Empathy.Chat', null); 'org.freedesktop.Telepathy.Client.Empathy.Chat', null);
} else { }
// We are not the handler, just ask to present the channel else {
let dbus = Tp.DBusDaemon.dup(); // We are not the handler, just ask to present the channel
let cd = Tp.ChannelDispatcher.new(dbus); let dbus = Tp.DBusDaemon.dup();
let cd = Tp.ChannelDispatcher.new(dbus);
cd.present_channel_async(this._channel, global.get_current_time(), null); cd.present_channel_async(this._channel, global.get_current_time(), null);
} }
}, },
_getLogMessages: function() { _getLogMessages: function() {
@ -960,8 +961,6 @@ const ChatNotification = new Lang.Class({
}, },
appendTimestamp: function() { appendTimestamp: function() {
this._timestampTimeoutId = 0;
let lastMessageTime = this._history[0].time; let lastMessageTime = this._history[0].time;
let lastMessageDate = new Date(lastMessageTime * 1000); let lastMessageDate = new Date(lastMessageTime * 1000);
@ -1062,7 +1061,7 @@ const ApproverSource = new Lang.Class({
}, },
_createPolicy: function() { _createPolicy: function() {
return new MessageTray.NotificationApplicationPolicy('empathy'); return new NotificationDaemon.NotificationApplicationPolicy('empathy');
}, },
destroy: function() { destroy: function() {
@ -1097,16 +1096,22 @@ const RoomInviteNotification = new Lang.Class({
* for example. */ * for example. */
this.addBody(_("%s is inviting you to join %s").format(inviter.get_alias(), channel.get_identifier())); this.addBody(_("%s is inviting you to join %s").format(inviter.get_alias(), channel.get_identifier()));
this.addAction(_("Decline"), Lang.bind(this, function() { this.addButton('decline', _("Decline"));
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE, '', function(src, result) { this.addButton('accept', _("Accept"));
src.leave_channels_finish(result);
}); this.connect('action-invoked', Lang.bind(this, function(self, action) {
this.destroy(); switch (action) {
})); case 'decline':
this.addAction(_("Accept"), Lang.bind(this, function() { dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE,
dispatchOp.handle_with_time_async('', global.get_current_time(), function(src, result) { '', function(src, result) {
src.handle_with_time_finish(result); src.leave_channels_finish(result)});
}); break;
case 'accept':
dispatchOp.handle_with_time_async('', global.get_current_time(),
function(src, result) {
src.handle_with_time_finish(result)});
break;
}
this.destroy(); this.destroy();
})); }));
} }
@ -1132,17 +1137,23 @@ const AudioVideoNotification = new Lang.Class({
this.setUrgency(MessageTray.Urgency.CRITICAL); this.setUrgency(MessageTray.Urgency.CRITICAL);
this.addAction(_("Decline"), Lang.bind(this, function() { this.addButton('reject', _("Decline"));
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE, '', function(src, result) {
src.leave_channels_finish(result);
});
this.destroy();
}));
/* translators: this is a button label (verb), not a noun */ /* translators: this is a button label (verb), not a noun */
this.addAction(_("Answer"), Lang.bind(this, function() { this.addButton('answer', _("Answer"));
dispatchOp.handle_with_time_async('', global.get_current_time(), function(src, result) {
src.handle_with_time_finish(result); this.connect('action-invoked', Lang.bind(this, function(self, action) {
}); switch (action) {
case 'reject':
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE,
'', function(src, result) {
src.leave_channels_finish(result)});
break;
case 'answer':
dispatchOp.handle_with_time_async('', global.get_current_time(),
function(src, result) {
src.handle_with_time_finish(result)});
break;
}
this.destroy(); this.destroy();
})); }));
} }
@ -1166,16 +1177,22 @@ const FileTransferNotification = new Lang.Class({
{ customContent: true }); { customContent: true });
this.setResident(true); this.setResident(true);
this.addAction(_("Decline"), Lang.bind(this, function() { this.addButton('decline', _("Decline"));
dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE, '', function(src, result) { this.addButton('accept', _("Accept"));
src.leave_channels_finish(result);
}); this.connect('action-invoked', Lang.bind(this, function(self, action) {
this.destroy(); switch (action) {
})); case 'decline':
this.addAction(_("Accept"), Lang.bind(this, function() { dispatchOp.leave_channels_async(Tp.ChannelGroupChangeReason.NONE,
dispatchOp.handle_with_time_async('', global.get_current_time(), function(src, result) { '', function(src, result) {
src.handle_with_time_finish(result); src.leave_channels_finish(result)});
}); break;
case 'accept':
dispatchOp.handle_with_time_async('', global.get_current_time(),
function(src, result) {
src.handle_with_time_finish(result)});
break;
}
this.destroy(); this.destroy();
})); }));
} }
@ -1223,20 +1240,27 @@ const SubscriptionRequestNotification = new Lang.Class({
this.addActor(layout); this.addActor(layout);
this.addAction(_("Decline"), Lang.bind(this, function() { this.addButton('decline', _("Decline"));
contact.remove_async(function(src, result) { this.addButton('accept', _("Accept"));
src.remove_finish(result);
});
}));
this.addAction(_("Accept"), Lang.bind(this, function() {
// Authorize the contact and request to see his status as well
contact.authorize_publication_async(function(src, result) {
src.authorize_publication_finish(result);
});
contact.request_subscription_async('', function(src, result) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
src.request_subscription_finish(result); switch (action) {
}); case 'decline':
contact.remove_async(function(src, result) {
src.remove_finish(result)});
break;
case 'accept':
// Authorize the contact and request to see his status as well
contact.authorize_publication_async(function(src, result) {
src.authorize_publication_finish(result)});
contact.request_subscription_async('', function(src, result) {
src.request_subscription_finish(result)});
break;
}
// rely on _subscriptionStatesChangedCb to destroy the
// notification
})); }));
this._changedId = contact.connect('subscription-states-changed', this._changedId = contact.connect('subscription-states-changed',
@ -1335,11 +1359,18 @@ const AccountNotification = new Lang.Class({
this._account = account; this._account = account;
this.addAction(_("View account"), Lang.bind(this, function() { this.addButton('view', _("View account"));
let cmd = 'empathy-accounts --select-account=' +
account.get_path_suffix(); this.connect('action-invoked', Lang.bind(this, function(self, action) {
let app_info = Gio.app_info_create_from_commandline(cmd, null, 0); switch (action) {
app_info.launch([], global.create_app_launch_context()); case 'view':
let cmd = 'empathy-accounts --select-account=' +
account.get_path_suffix();
let app_info = Gio.app_info_create_from_commandline(cmd, null, 0);
app_info.launch([], global.create_app_launch_context());
break;
}
this.destroy();
})); }));
this._enabledId = account.connect('notify::enabled', this._enabledId = account.connect('notify::enabled',

View File

@ -576,7 +576,6 @@ const Dash = new Lang.Class({
Lang.bind(this, function() { Lang.bind(this, function() {
this._labelShowing = true; this._labelShowing = true;
item.showLabel(); item.showLabel();
this._showLabelTimeoutId = 0;
return false; return false;
})); }));
if (this._resetHoverTimeoutId > 0) { if (this._resetHoverTimeoutId > 0) {
@ -593,7 +592,6 @@ const Dash = new Lang.Class({
this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT, this._resetHoverTimeoutId = Mainloop.timeout_add(DASH_ITEM_HOVER_TIMEOUT,
Lang.bind(this, function() { Lang.bind(this, function() {
this._labelShowing = false; this._labelShowing = false;
this._resetHoverTimeoutId = 0;
return false; return false;
})); }));
} }

View File

@ -236,7 +236,7 @@ const _Draggable = new Lang.Class({
if (this.actor._delegate && this.actor._delegate.getDragActor) { if (this.actor._delegate && this.actor._delegate.getDragActor) {
this._dragActor = this.actor._delegate.getDragActor(); this._dragActor = this.actor._delegate.getDragActor();
Main.uiGroup.add_child(this._dragActor); this._dragActor.reparent(Main.uiGroup);
this._dragActor.raise_top(); this._dragActor.raise_top();
Shell.util_set_hidden_from_pick(this._dragActor, true); Shell.util_set_hidden_from_pick(this._dragActor, true);
@ -285,8 +285,7 @@ const _Draggable = new Lang.Class({
this._dragOffsetX = actorStageX - this._dragStartX; this._dragOffsetX = actorStageX - this._dragStartX;
this._dragOffsetY = actorStageY - this._dragStartY; this._dragOffsetY = actorStageY - this._dragStartY;
this._dragOrigParent.remove_actor(this._dragActor); this._dragActor.reparent(Main.uiGroup);
Main.uiGroup.add_child(this._dragActor);
this._dragActor.raise_top(); this._dragActor.raise_top();
Shell.util_set_hidden_from_pick(this._dragActor, true); Shell.util_set_hidden_from_pick(this._dragActor, true);
} }
@ -346,7 +345,6 @@ const _Draggable = new Lang.Class({
}, },
_updateDragHover : function () { _updateDragHover : function () {
this._updateHoverId = 0;
let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL, let target = this._dragActor.get_stage().get_actor_at_pos(Clutter.PickMode.ALL,
this._dragX, this._dragY); this._dragX, this._dragY);
let dragEvent = { let dragEvent = {
@ -391,7 +389,7 @@ const _Draggable = new Lang.Class({
_queueUpdateDragHover: function() { _queueUpdateDragHover: function() {
if (this._updateHoverId) if (this._updateHoverId)
return; GLib.source_remove(this._updateHoverId);
this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT, this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
Lang.bind(this, this._updateDragHover)); Lang.bind(this, this._updateDragHover));
@ -557,8 +555,7 @@ const _Draggable = new Lang.Class({
_onAnimationComplete : function (dragActor, eventTime) { _onAnimationComplete : function (dragActor, eventTime) {
if (this._dragOrigParent) { if (this._dragOrigParent) {
Main.uiGroup.remove_child(this._dragActor); dragActor.reparent(this._dragOrigParent);
this._dragOrigParent.add_actor(this._dragActor);
dragActor.set_scale(this._dragOrigScale, this._dragOrigScale); dragActor.set_scale(this._dragOrigScale, this._dragOrigScale);
dragActor.set_position(this._dragOrigX, this._dragOrigY); dragActor.set_position(this._dragOrigX, this._dragOrigY);
} else { } else {

View File

@ -43,22 +43,20 @@ const _DIALOG_ICON_SIZE = 32;
const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2; const GSM_SESSION_MANAGER_LOGOUT_FORCE = 2;
const EndSessionDialogIface = '<node> \ const EndSessionDialogIface = <interface name="org.gnome.SessionManager.EndSessionDialog">
<interface name="org.gnome.SessionManager.EndSessionDialog"> \ <method name="Open">
<method name="Open"> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ <arg type="ao" direction="in" />
<arg type="ao" direction="in" /> \ </method>
</method> \ <method name="Close" />
<method name="Close" /> \ <signal name="ConfirmedLogout" />
<signal name="ConfirmedLogout" /> \ <signal name="ConfirmedReboot" />
<signal name="ConfirmedReboot" /> \ <signal name="ConfirmedShutdown" />
<signal name="ConfirmedShutdown" /> \ <signal name="Canceled" />
<signal name="Canceled" /> \ <signal name="Closed" />
<signal name="Closed" /> \ </interface>;
</interface> \
</node>';
const logoutDialogContent = { const logoutDialogContent = {
subjectWithUser: C_("title", "Log Out %s"), subjectWithUser: C_("title", "Log Out %s"),
@ -133,15 +131,13 @@ const DialogContent = {
const MAX_USERS_IN_SESSION_DIALOG = 5; const MAX_USERS_IN_SESSION_DIALOG = 5;
const LogindSessionIface = '<node> \ const LogindSessionIface = <interface name='org.freedesktop.login1.Session'>
<interface name="org.freedesktop.login1.Session"> \ <property name="Id" type="s" access="read"/>
<property name="Id" type="s" access="read"/> \ <property name="Remote" type="b" access="read"/>
<property name="Remote" type="b" access="read"/> \ <property name="Class" type="s" access="read"/>
<property name="Class" type="s" access="read"/> \ <property name="Type" type="s" access="read"/>
<property name="Type" type="s" access="read"/> \ <property name="State" type="s" access="read"/>
<property name="State" type="s" access="read"/> \ </interface>;
</interface> \
</node>';
const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface); const LogindSession = Gio.DBusProxy.makeProxyWrapper(LogindSessionIface);
@ -273,15 +269,13 @@ const EndSessionDialog = new Lang.Class({
this._applicationHeader = new St.Label({ style_class: 'end-session-dialog-list-header', this._applicationHeader = new St.Label({ style_class: 'end-session-dialog-list-header',
text: _("Some applications are busy or have unsaved work.") }); text: _("Some applications are busy or have unsaved work.") });
this._applicationList = new St.BoxLayout({ style_class: 'end-session-dialog-app-list', this._applicationList = new St.BoxLayout({ vertical: true });
vertical: true });
this._inhibitorSection.add_actor(this._applicationHeader); this._inhibitorSection.add_actor(this._applicationHeader);
this._inhibitorSection.add_actor(this._applicationList); this._inhibitorSection.add_actor(this._applicationList);
this._sessionHeader = new St.Label({ style_class: 'end-session-dialog-list-header', this._sessionHeader = new St.Label({ style_class: 'end-session-dialog-list-header',
text: _("Other users are logged in.") }); text: _("Other users are logged in.") });
this._sessionList = new St.BoxLayout({ style_class: 'end-session-dialog-session-list', this._sessionList = new St.BoxLayout({ vertical: true });
vertical: true });
this._inhibitorSection.add_actor(this._sessionHeader); this._inhibitorSection.add_actor(this._sessionHeader);
this._inhibitorSection.add_actor(this._sessionList); this._inhibitorSection.add_actor(this._sessionList);
@ -415,7 +409,6 @@ const EndSessionDialog = new Lang.Class({
let dialogContent = DialogContent[this._type]; let dialogContent = DialogContent[this._type];
let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1]; let button = dialogContent.confirmButtons[dialogContent.confirmButtons.length - 1];
this._confirm(button.signal); this._confirm(button.signal);
this._timerId = 0;
return false; return false;
})); }));

View File

@ -76,11 +76,7 @@ function disableExtension(uuid) {
theme.unload_stylesheet(extension.stylesheet.get_path()); theme.unload_stylesheet(extension.stylesheet.get_path());
} }
try { extension.stateObj.disable();
extension.stateObj.disable();
} catch(e) {
logExtensionError(uuid, e);
}
for (let i = 0; i < order.length; i++) { for (let i = 0; i < order.length; i++) {
let uuid = order[i]; let uuid = order[i];
@ -93,10 +89,8 @@ function disableExtension(uuid) {
extensionOrder.splice(orderIdx, 1); extensionOrder.splice(orderIdx, 1);
if ( extension.state != ExtensionState.ERROR ) { extension.state = ExtensionState.DISABLED;
extension.state = ExtensionState.DISABLED; _signals.emit('extension-state-changed', extension);
_signals.emit('extension-state-changed', extension);
}
} }
function enableExtension(uuid) { function enableExtension(uuid) {
@ -123,15 +117,10 @@ function enableExtension(uuid) {
} }
} }
try { extension.stateObj.enable();
extension.stateObj.enable();
extension.state = ExtensionState.ENABLED; extension.state = ExtensionState.ENABLED;
_signals.emit('extension-state-changed', extension); _signals.emit('extension-state-changed', extension);
return;
} catch(e) {
logExtensionError(uuid, e);
return;
}
} }
function logExtensionError(uuid, error) { function logExtensionError(uuid, error) {
@ -161,8 +150,7 @@ function loadExtension(extension) {
} else { } else {
let enabled = enabledExtensions.indexOf(extension.uuid) != -1; let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
if (enabled) { if (enabled) {
if (!initExtension(extension.uuid)) initExtension(extension.uuid);
return;
if (extension.state == ExtensionState.DISABLED) if (extension.state == ExtensionState.DISABLED)
enableExtension(extension.uuid); enableExtension(extension.uuid);
} else { } else {
@ -217,12 +205,7 @@ function initExtension(uuid) {
extensionModule = extension.imports.extension; extensionModule = extension.imports.extension;
if (extensionModule.init) { if (extensionModule.init) {
try { extensionState = extensionModule.init(extension);
extensionState = extensionModule.init(extension);
} catch(e) {
logExtensionError(uuid, e);
return false;
}
} }
if (!extensionState) if (!extensionState)
@ -231,7 +214,6 @@ function initExtension(uuid) {
extension.state = ExtensionState.DISABLED; extension.state = ExtensionState.DISABLED;
_signals.emit('extension-loaded', uuid); _signals.emit('extension-loaded', uuid);
return true;
} }
function getEnabledExtensions() { function getEnabledExtensions() {
@ -253,7 +235,11 @@ function onEnabledExtensionsChanged() {
newEnabledExtensions.filter(function(uuid) { newEnabledExtensions.filter(function(uuid) {
return enabledExtensions.indexOf(uuid) == -1; return enabledExtensions.indexOf(uuid) == -1;
}).forEach(function(uuid) { }).forEach(function(uuid) {
enableExtension(uuid); try {
enableExtension(uuid);
} catch(e) {
logExtensionError(uuid, e);
}
}); });
// Find and disable all the newly disabled extensions: UUIDs found in the // Find and disable all the newly disabled extensions: UUIDs found in the
@ -261,7 +247,11 @@ function onEnabledExtensionsChanged() {
enabledExtensions.filter(function(item) { enabledExtensions.filter(function(item) {
return newEnabledExtensions.indexOf(item) == -1; return newEnabledExtensions.indexOf(item) == -1;
}).forEach(function(uuid) { }).forEach(function(uuid) {
disableExtension(uuid); try {
disableExtension(uuid);
} catch(e) {
logExtensionError(uuid, e);
}
}); });
enabledExtensions = newEnabledExtensions; enabledExtensions = newEnabledExtensions;
@ -272,8 +262,12 @@ function _loadExtensions() {
enabledExtensions = getEnabledExtensions(); enabledExtensions = getEnabledExtensions();
let finder = new ExtensionUtils.ExtensionFinder(); let finder = new ExtensionUtils.ExtensionFinder();
finder.connect('extension-found', function(finder, extension) { finder.connect('extension-found', function(signals, extension) {
loadExtension(extension); try {
loadExtension(extension);
} catch(e) {
logExtensionError(extension.uuid, e);
}
}); });
finder.scanExtensions(); finder.scanExtensions();
} }

View File

@ -413,18 +413,15 @@ const IconGrid = new Lang.Class({
}, },
removeAll: function() { removeAll: function() {
this._items = [];
this._grid.remove_all_children();
},
destroyAll: function() {
this._items = []; this._items = [];
this._grid.destroy_all_children(); this._grid.destroy_all_children();
}, },
addItem: function(item, index) { addItem: function(item, index) {
if (!item.icon instanceof BaseIcon) if (!item.icon || !item.icon instanceof BaseIcon) {
throw new Error('Only items with a BaseIcon icon property can be added to IconGrid'); log('Only items with a BaseIcon icon property can be added to IconGrid');
return;
}
this._items.push(item); this._items.push(item);
if (index !== undefined) if (index !== undefined)

View File

@ -23,29 +23,27 @@ const KEYBOARD_TYPE = 'keyboard-type';
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications'; const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
const SHOW_KEYBOARD = 'screen-keyboard-enabled'; const SHOW_KEYBOARD = 'screen-keyboard-enabled';
const CaribouKeyboardIface = '<node> \ const CaribouKeyboardIface = <interface name='org.gnome.Caribou.Keyboard'>
<interface name="org.gnome.Caribou.Keyboard"> \ <method name='Show'>
<method name="Show"> \ <arg type='u' direction='in' />
<arg type="u" direction="in" /> \ </method>
</method> \ <method name='Hide'>
<method name="Hide"> \ <arg type='u' direction='in' />
<arg type="u" direction="in" /> \ </method>
</method> \ <method name='SetCursorLocation'>
<method name="SetCursorLocation"> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ </method>
</method> \ <method name='SetEntryLocation'>
<method name="SetEntryLocation"> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ <arg type='i' direction='in' />
<arg type="i" direction="in" /> \ </method>
</method> \ <property name='Name' access='read' type='s' />
<property name="Name" access="read" type="s" /> \ </interface>;
</interface> \
</node>';
const Key = new Lang.Class({ const Key = new Lang.Class({
Name: 'Key', Name: 'Key',

View File

@ -251,7 +251,7 @@ const LayoutManager = new Lang.Class({
this._inOverview = true; this._inOverview = true;
this._updateVisibility(); this._updateVisibility();
this._updateRegions(); this._queueUpdateRegions();
}, },
hideOverview: function() { hideOverview: function() {

View File

@ -629,6 +629,55 @@ const Inspector = new Lang.Class({
Signals.addSignalMethods(Inspector.prototype); Signals.addSignalMethods(Inspector.prototype);
const Memory = new Lang.Class({
Name: 'Memory',
_init: function() {
this.actor = new St.BoxLayout({ vertical: true });
this._glibc_uordblks = new St.Label();
this.actor.add(this._glibc_uordblks);
this._js_bytes = new St.Label();
this.actor.add(this._js_bytes);
this._gjs_boxed = new St.Label();
this.actor.add(this._gjs_boxed);
this._gjs_gobject = new St.Label();
this.actor.add(this._gjs_gobject);
this._gjs_function = new St.Label();
this.actor.add(this._gjs_function);
this._gjs_closure = new St.Label();
this.actor.add(this._gjs_closure);
this._last_gc_seconds_ago = new St.Label();
this.actor.add(this._last_gc_seconds_ago);
this._gcbutton = new St.Button({ label: 'Full GC',
style_class: 'lg-obj-inspector-button' });
this._gcbutton.connect('clicked', Lang.bind(this, function () { System.gc(); this._renderText(); }));
this.actor.add(this._gcbutton, { x_align: St.Align.START,
x_fill: false });
this.actor.connect('notify::mapped', Lang.bind(this, this._renderText));
},
_renderText: function() {
if (!this.actor.mapped)
return;
let memInfo = global.get_memory_info();
this._glibc_uordblks.text = 'glibc_uordblks: ' + memInfo.glibc_uordblks;
this._js_bytes.text = 'js bytes: ' + memInfo.js_bytes;
this._gjs_boxed.text = 'gjs_boxed: ' + memInfo.gjs_boxed;
this._gjs_gobject.text = 'gjs_gobject: ' + memInfo.gjs_gobject;
this._gjs_function.text = 'gjs_function: ' + memInfo.gjs_function;
this._gjs_closure.text = 'gjs_closure: ' + memInfo.gjs_closure;
this._last_gc_seconds_ago.text = 'last_gc_seconds_ago: ' + memInfo.last_gc_seconds_ago;
}
});
const Extensions = new Lang.Class({ const Extensions = new Lang.Class({
Name: 'Extensions', Name: 'Extensions',
@ -831,19 +880,6 @@ const LookingGlass = new Lang.Class({
return true; return true;
})); }));
let gcIcon = new St.Icon({ icon_name: 'gnome-fs-trash-full',
icon_size: 24 });
toolbar.add_actor(gcIcon);
gcIcon.reactive = true;
gcIcon.connect('button-press-event', Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-empty';
System.gc();
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-full';
Mainloop.source_remove(this._timeoutId);
}));
}));
let notebook = new Notebook(); let notebook = new Notebook();
this._notebook = notebook; this._notebook = notebook;
this.actor.add(notebook.actor, { expand: true }); this.actor.add(notebook.actor, { expand: true });
@ -871,6 +907,9 @@ const LookingGlass = new Lang.Class({
this._windowList = new WindowList(this); this._windowList = new WindowList(this);
notebook.appendPage('Windows', this._windowList.actor); notebook.appendPage('Windows', this._windowList.actor);
this._memory = new Memory();
notebook.appendPage('Memory', this._memory.actor);
this._extensions = new Extensions(this); this._extensions = new Extensions(this);
notebook.appendPage('Extensions', this._extensions.actor); notebook.appendPage('Extensions', this._extensions.actor);

View File

@ -9,89 +9,85 @@ const ZOOM_SERVICE_PATH = '/org/gnome/Magnifier/ZoomRegion';
// Subset of gnome-mag's Magnifier dbus interface -- to be expanded. See: // Subset of gnome-mag's Magnifier dbus interface -- to be expanded. See:
// http://git.gnome.org/browse/gnome-mag/tree/xml/...Magnifier.xml // http://git.gnome.org/browse/gnome-mag/tree/xml/...Magnifier.xml
const MagnifierIface = '<node> \ const MagnifierIface = <interface name="org.gnome.Magnifier">
<interface name="org.gnome.Magnifier"> \ <method name="setActive">
<method name="setActive"> \ <arg type="b" direction="in" />
<arg type="b" direction="in" /> \ </method>
</method> \ <method name="isActive">
<method name="isActive"> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="showCursor" />
<method name="showCursor" /> \ <method name="hideCursor" />
<method name="hideCursor" /> \ <method name="createZoomRegion">
<method name="createZoomRegion"> \ <arg type="d" direction="in" />
<arg type="d" direction="in" /> \ <arg type="d" direction="in" />
<arg type="d" direction="in" /> \ <arg type="ai" direction="in" />
<arg type="ai" direction="in" /> \ <arg type="ai" direction="in" />
<arg type="ai" direction="in" /> \ <arg type="o" direction="out" />
<arg type="o" direction="out" /> \ </method>
</method> \ <method name="addZoomRegion">
<method name="addZoomRegion"> \ <arg type="o" direction="in" />
<arg type="o" direction="in" /> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="getZoomRegions">
<method name="getZoomRegions"> \ <arg type="ao" direction="out" />
<arg type="ao" direction="out" /> \ </method>
</method> \ <method name="clearAllZoomRegions" />
<method name="clearAllZoomRegions" /> \ <method name="fullScreenCapable">
<method name="fullScreenCapable"> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="setCrosswireSize">
<method name="setCrosswireSize"> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ </method>
</method> \ <method name="getCrosswireSize">
<method name="getCrosswireSize"> \ <arg type="i" direction="out" />
<arg type="i" direction="out" /> \ </method>
</method> \ <method name="setCrosswireLength">
<method name="setCrosswireLength"> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ </method>
</method> \ <method name="getCrosswireLength">
<method name="getCrosswireLength"> \ <arg type="i" direction="out" />
<arg type="i" direction="out" /> \ </method>
</method> \ <method name="setCrosswireClip">
<method name="setCrosswireClip"> \ <arg type="b" direction="in" />
<arg type="b" direction="in" /> \ </method>
</method> \ <method name="getCrosswireClip">
<method name="getCrosswireClip"> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="setCrosswireColor">
<method name="setCrosswireColor"> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ </method>
</method> \ <method name="getCrosswireColor">
<method name="getCrosswireColor"> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
// Subset of gnome-mag's ZoomRegion dbus interface -- to be expanded. See: // Subset of gnome-mag's ZoomRegion dbus interface -- to be expanded. See:
// http://git.gnome.org/browse/gnome-mag/tree/xml/...ZoomRegion.xml // http://git.gnome.org/browse/gnome-mag/tree/xml/...ZoomRegion.xml
const ZoomRegionIface = '<node> \ const ZoomRegionIface = <interface name="org.gnome.Magnifier.ZoomRegion">
<interface name="org.gnome.Magnifier.ZoomRegion"> \ <method name="setMagFactor">
<method name="setMagFactor"> \ <arg type="d" direction="in" />
<arg type="d" direction="in" /> \ <arg type="d" direction="in" />
<arg type="d" direction="in" /> \ </method>
</method> \ <method name="getMagFactor">
<method name="getMagFactor"> \ <arg type="d" direction="out" />
<arg type="d" direction="out" /> \ <arg type="d" direction="out" />
<arg type="d" direction="out" /> \ </method>
</method> \ <method name="setRoi">
<method name="setRoi"> \ <arg type="ai" direction="in" />
<arg type="ai" direction="in" /> \ </method>
</method> \ <method name="getRoi">
<method name="getRoi"> \ <arg type="ai" direction="out" />
<arg type="ai" direction="out" /> \ </method>
</method> \ <method name="shiftContentsTo">
<method name="shiftContentsTo"> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ <arg type="b" direction="out" />
<arg type="b" direction="out" /> \ </method>
</method> \ <method name="moveResize">
<method name="moveResize"> \ <arg type="ai" direction="in" />
<arg type="ai" direction="in" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
// For making unique ZoomRegion DBus proxy object paths of the form: // For making unique ZoomRegion DBus proxy object paths of the form:
// '/org/gnome/Magnifier/ZoomRegion/zoomer0', // '/org/gnome/Magnifier/ZoomRegion/zoomer0',

View File

@ -112,6 +112,11 @@ function start() {
Gio.DesktopAppInfo.set_desktop_env('GNOME'); Gio.DesktopAppInfo.set_desktop_env('GNOME');
sessionMode = new SessionMode.SessionMode(); sessionMode = new SessionMode.SessionMode();
sessionMode.connect('sessions-loaded', _sessionsLoaded);
sessionMode.init();
}
function _sessionsLoaded() {
sessionMode.connect('updated', _sessionUpdated); sessionMode.connect('updated', _sessionUpdated);
_initializePrefs(); _initializePrefs();
_initializeUI(); _initializeUI();

View File

@ -280,6 +280,10 @@ const URLHighlighter = new Lang.Class({
} }
}); });
function strHasSuffix(string, suffix) {
return string.substr(-suffix.length) == suffix;
}
// NotificationPolicy: // NotificationPolicy:
// An object that holds all bits of configurable policy related to a notification // An object that holds all bits of configurable policy related to a notification
// source, such as whether to play sound or honour the critical bit. // source, such as whether to play sound or honour the critical bit.
@ -306,126 +310,6 @@ const NotificationPolicy = new Lang.Class({
}); });
Signals.addSignalMethods(NotificationPolicy.prototype); Signals.addSignalMethods(NotificationPolicy.prototype);
const NotificationGenericPolicy = new Lang.Class({
Name: 'NotificationGenericPolicy',
Extends: NotificationPolicy,
_init: function() {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = 'generic';
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
},
store: function() { },
destroy: function() {
this._masterSettings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
get enable() {
return true;
},
get enableSound() {
return true;
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners');
},
get forceExpanded() {
return false;
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return false;
}
});
const NotificationApplicationPolicy = new Lang.Class({
Name: 'NotificationApplicationPolicy',
Extends: NotificationPolicy,
_init: function(id) {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = id;
this._canonicalId = this._canonicalizeId(id);
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
this._settings.connect('changed', Lang.bind(this, this._changed));
},
store: function() {
this._settings.set_string('application-id', this.id + '.desktop');
let apps = this._masterSettings.get_strv('application-children');
if (apps.indexOf(this._canonicalId) < 0) {
apps.push(this._canonicalId);
this._masterSettings.set_strv('application-children', apps);
}
},
destroy: function() {
this._masterSettings.run_dispose();
this._settings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
_canonicalizeId: function(id) {
// Keys are restricted to lowercase alphanumeric characters and dash,
// and two dashes cannot be in succession
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
},
get enable() {
return this._settings.get_boolean('enable');
},
get enableSound() {
return this._settings.get_boolean('enable-sound-alerts');
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners') &&
this._settings.get_boolean('show-banners');
},
get forceExpanded() {
return this._settings.get_boolean('force-expanded');
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen') &&
this._settings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return this._settings.get_boolean('details-in-lock-screen');
}
});
// Notification: // Notification:
// @source: the notification's Source // @source: the notification's Source
// @title: the title // @title: the title
@ -499,6 +383,7 @@ const Notification = new Lang.Class({
this.focused = false; this.focused = false;
this.acknowledged = false; this.acknowledged = false;
this._destroyed = false; this._destroyed = false;
this._useActionIcons = false;
this._customContent = false; this._customContent = false;
this.bannerBodyText = null; this.bannerBodyText = null;
this.bannerBodyMarkup = false; this.bannerBodyMarkup = false;
@ -553,12 +438,7 @@ const Notification = new Lang.Class({
this._bannerLabel = this._bannerUrlHighlighter.actor; this._bannerLabel = this._bannerUrlHighlighter.actor;
this._bannerBox.add_actor(this._bannerLabel); this._bannerBox.add_actor(this._bannerLabel);
// If called with only one argument we assume the caller this.update(title, banner, params);
// will call .update() later on. This is the case of
// NotificationDaemon, which wants to use the same code
// for new and updated notifications
if (arguments.length != 1)
this.update(title, banner, params);
}, },
// update: // update:
@ -831,8 +711,19 @@ const Notification = new Lang.Class({
} }
}, },
addButton: function(button, callback) { // addButton:
// @id: the action ID
// @label: the label for the action's button
//
// Adds a button with the given @label to the notification. All
// action buttons will appear in a single row at the bottom of
// the notification.
//
// If the button is clicked, the notification will emit the
// %action-invoked signal with @id as a parameter
addButton: function(id, label) {
if (!this._buttonBox) { if (!this._buttonBox) {
let box = new St.BoxLayout({ style_class: 'notification-actions' }); let box = new St.BoxLayout({ style_class: 'notification-actions' });
this.setActionArea(box, { x_expand: false, this.setActionArea(box, { x_expand: false,
y_expand: false, y_expand: false,
@ -840,40 +731,49 @@ const Notification = new Lang.Class({
y_fill: false, y_fill: false,
x_align: St.Align.END }); x_align: St.Align.END });
this._buttonBox = box; this._buttonBox = box;
global.focus_manager.add_group(this._buttonBox);
} }
this._buttonBox.add(button); let button = new St.Button({ can_focus: true });
button.connect('clicked', Lang.bind(this, function() { button._actionId = id;
callback();
if (!this.resident) { let iconName = strHasSuffix(id, '-symbolic') ? id : id + '-symbolic';
// We don't hide a resident notification when the user invokes one of its actions, if (this._useActionIcons && Gtk.IconTheme.get_default().has_icon(iconName)) {
// because it is common for such notifications to update themselves with new button.add_style_class_name('notification-icon-button');
// information based on the action. We'd like to display the updated information button.child = new St.Icon({ icon_name: iconName });
// in place, rather than pop-up a new notification. } else {
this.emit('done-displaying'); button.add_style_class_name('notification-button');
this.destroy(); button.label = label;
} }
}));
if (this._buttonBox.get_n_children() > 0)
global.focus_manager.remove_group(this._buttonBox);
this._buttonBox.add(button);
global.focus_manager.add_group(this._buttonBox);
button.connect('clicked', Lang.bind(this, this._onActionInvoked, id));
this.updated(); this.updated();
return button;
}, },
// addAction: // setButtonSensitive:
// @label: the label for the action's button // @id: the action ID
// @callback: the callback for the action // @sensitive: whether the button should be sensitive
// //
// Adds a button with the given @label to the notification. All // If the notification contains a button with action ID @id,
// action buttons will appear in a single row at the bottom of // its sensitivity will be set to @sensitive. Insensitive
// the notification. // buttons cannot be clicked.
addAction: function(label, callback) { setButtonSensitive: function(id, sensitive) {
let button = new St.Button({ style_class: 'notification-button', if (!this._buttonBox)
label: label, return;
can_focus: true });
return this.addButton(button, callback); let button = this._buttonBox.get_children().filter(function(b) {
return b._actionId == id;
})[0];
if (!button || button.reactive == sensitive)
return;
button.reactive = sensitive;
}, },
setUrgency: function(urgency) { setUrgency: function(urgency) {
@ -892,6 +792,10 @@ const Notification = new Lang.Class({
this.forFeedback = forFeedback; this.forFeedback = forFeedback;
}, },
setUseActionIcons: function(useIcons) {
this._useActionIcons = useIcons;
},
_styleChanged: function() { _styleChanged: function() {
this._spacing = this._table.get_theme_node().get_length('spacing-columns'); this._spacing = this._table.get_theme_node().get_length('spacing-columns');
}, },
@ -1116,6 +1020,18 @@ const Notification = new Lang.Class({
this.actor.add_style_class_name('notification-unexpanded'); this.actor.add_style_class_name('notification-unexpanded');
}, },
_onActionInvoked: function(actor, mouseButtonClicked, id) {
this.emit('action-invoked', id);
if (!this.resident) {
// We don't hide a resident notification when the user invokes one of its actions,
// because it is common for such notifications to update themselves with new
// information based on the action. We'd like to display the updated information
// in place, rather than pop-up a new notification.
this.emit('done-displaying');
this.destroy();
}
},
_onClicked: function() { _onClicked: function() {
this.emit('clicked'); this.emit('clicked');
// We hide all types of notifications once the user clicks on them because the common // We hide all types of notifications once the user clicks on them because the common
@ -1290,10 +1206,6 @@ const Source = new Lang.Class({
return this.count > 1; return this.count > 1;
}, },
get isClearable() {
return !this.trayIcon && !this.isChat && !this.resident;
},
countUpdated: function() { countUpdated: function() {
this.emit('count-updated'); this.emit('count-updated');
}, },
@ -1365,25 +1277,25 @@ const Source = new Lang.Class({
return this._mainIcon.actor; return this._mainIcon.actor;
}, },
_onNotificationDestroy: function(notification) {
let index = this.notifications.indexOf(notification);
if (index < 0)
return;
this.notifications.splice(index, 1);
if (this.notifications.length == 0)
this._lastNotificationRemoved();
this.countUpdated();
},
pushNotification: function(notification) { pushNotification: function(notification) {
if (this.notifications.indexOf(notification) >= 0) if (this.notifications.indexOf(notification) < 0) {
return; this.notifications.push(notification);
this.emit('notification-added', notification);
}
notification.connect('destroy', Lang.bind(this, this._onNotificationDestroy)); notification.connect('clicked', Lang.bind(this, this.open));
this.notifications.push(notification); notification.connect('destroy', Lang.bind(this,
this.emit('notification-added', notification); function () {
let index = this.notifications.indexOf(notification);
if (index < 0)
return;
this.notifications.splice(index, 1);
if (this.notifications.length == 0)
this._lastNotificationRemoved();
this.countUpdated();
}));
this.countUpdated(); this.countUpdated();
}, },
@ -1595,42 +1507,26 @@ const MessageTrayMenu = new Lang.Class({
this._tray = tray; this._tray = tray;
this._presence = new GnomeSession.Presence(Lang.bind(this, function(proxy, error) {
if (error) {
logError(error, 'Error while reading gnome-session presence');
return;
}
this._onStatusChanged(proxy.status);
}));
this._presence.connectSignal('StatusChanged', Lang.bind(this, function(proxy, senderName, [status]) {
this._onStatusChanged(status);
}));
this._accountManager = Tp.AccountManager.dup();
this._accountManager.connect('most-available-presence-changed',
Lang.bind(this, this._onIMPresenceChanged));
this._accountManager.prepare_async(null, Lang.bind(this, this._onIMPresenceChanged));
this.actor.hide(); this.actor.hide();
Main.layoutManager.addChrome(this.actor); Main.layoutManager.addChrome(this.actor);
this._busyItem = new PopupMenu.PopupSwitchMenuItem(_("Notifications"));
this._busyItem.connect('toggled', Lang.bind(this, this._updatePresence));
this.addMenuItem(this._busyItem);
let separator = new PopupMenu.PopupSeparatorMenuItem();
this.addMenuItem(separator);
this._clearItem = this.addAction(_("Clear Messages"), function() { this._clearItem = this.addAction(_("Clear Messages"), function() {
let toDestroy = tray.getSources().filter(function(source) { let toDestroy = [];
return source.isClearable; let sources = tray.getSources();
}) for (let i = 0; i < sources.length; i++) {
// We exclude trayIcons, chat and resident sources
if (sources[i].trayIcon ||
sources[i].isChat ||
sources[i].resident)
continue;
toDestroy.push(sources[i]);
}
toDestroy.forEach(function(source) { for (let i = 0; i < toDestroy.length; i++) {
source.destroy(); toDestroy[i].destroy();
}); }
toDestroy = null;
tray.close(); tray.close();
}); });
@ -1645,43 +1541,9 @@ const MessageTrayMenu = new Lang.Class({
settingsItem.connect('activate', function() { tray.close(); }); settingsItem.connect('activate', function() { tray.close(); });
}, },
_onStatusChanged: function(status) {
this._sessionStatus = status;
this._busyItem.setToggleState(status != GnomeSession.PresenceStatus.BUSY);
},
_onIMPresenceChanged: function(am, type) {
if (type == Tp.ConnectionPresenceType.AVAILABLE &&
this._sessionStatus == GnomeSession.PresenceStatus.BUSY)
this._presence.SetStatusRemote(GnomeSession.PresenceStatus.AVAILABLE);
},
_updateClearSensitivity: function() { _updateClearSensitivity: function() {
this._clearItem.setSensitive(this._tray.clearableCount > 0); this._clearItem.setSensitive(this._tray.clearableCount > 0);
}, },
_updatePresence: function(item, state) {
let status = state ? GnomeSession.PresenceStatus.AVAILABLE
: GnomeSession.PresenceStatus.BUSY;
this._presence.SetStatusRemote(status);
let [type, s ,msg] = this._accountManager.get_most_available_presence();
let newType = 0;
let newStatus;
if (status == GnomeSession.PresenceStatus.BUSY &&
type == Tp.ConnectionPresenceType.AVAILABLE) {
newType = Tp.ConnectionPresenceType.BUSY;
newStatus = 'busy';
} else if (status == GnomeSession.PresenceStatus.AVAILABLE &&
type == Tp.ConnectionPresenceType.BUSY) {
newType = Tp.ConnectionPresenceType.AVAILABLE;
newStatus = 'available';
}
if (newType > 0)
this._accountManager.set_all_requested_presences(newType,
newStatus, msg);
}
}); });
const MessageTrayMenuButton = new Lang.Class({ const MessageTrayMenuButton = new Lang.Class({
@ -2064,7 +1926,7 @@ const MessageTray = new Lang.Class({
this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount); this._summary.insert_child_at_index(summaryItem.actor, this._chatSummaryItemsCount);
} }
if (source.isClearable) if (!source.trayIcon && !source.isChat && !source.resident)
this.clearableCount++; this.clearableCount++;
this._sources.set(source, obj); this._sources.set(source, obj);
@ -2108,7 +1970,7 @@ const MessageTray = new Lang.Class({
if (source.isChat) if (source.isChat)
this._chatSummaryItemsCount--; this._chatSummaryItemsCount--;
if (source.isClearable) if (!source.trayIcon && !source.isChat && !source.resident)
this.clearableCount--; this.clearableCount--;
source.disconnect(obj.notifyId); source.disconnect(obj.notifyId);
@ -2173,10 +2035,7 @@ const MessageTray = new Lang.Class({
}, },
toggleAndNavigate: function() { toggleAndNavigate: function() {
if (!this.toggle()) if (this.toggle())
return;
if (this._traySummoned)
this._summary.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); this._summary.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}, },
@ -2373,6 +2232,7 @@ const MessageTray = new Lang.Class({
this._showNotification(); this._showNotification();
} }
} else if (this._notificationState == State.SHOWN) { } else if (this._notificationState == State.SHOWN) {
let pinned = this._pointerInNotification && !this._notificationRemoved;
let expired = (this._userActiveWhileNotificationShown && let expired = (this._userActiveWhileNotificationShown &&
this._notificationTimeoutId == 0 && this._notificationTimeoutId == 0 &&
!(this._notification.urgency == Urgency.CRITICAL) && !(this._notification.urgency == Urgency.CRITICAL) &&
@ -2383,9 +2243,9 @@ const MessageTray = new Lang.Class({
if (mustClose) { if (mustClose) {
let animate = hasNotifications && !this._notificationRemoved; let animate = hasNotifications && !this._notificationRemoved;
this._hideNotification(animate); this._hideNotification(animate);
} else if (this._pointerInNotification && !this._notification.expanded) { } else if (pinned && !this._notification.expanded) {
this._expandNotification(false); this._expandNotification(false);
} else if (this._pointerInNotification) { } else if (pinned) {
this._ensureNotificationFocused(); this._ensureNotificationFocused();
} }
} }
@ -2755,12 +2615,12 @@ const MessageTray = new Lang.Class({
} else if (this._notification.y != expandedY) { } else if (this._notification.y != expandedY) {
// Tween also opacity here, to override a possible tween that's // Tween also opacity here, to override a possible tween that's
// currently hiding the notification. // currently hiding the notification.
Tweener.addTween(this._notificationWidget, this._tween(this._notificationWidget, '_notificationState', State.SHOWN,
{ y: expandedY, { y: expandedY,
opacity: 255, opacity: 255,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
} }
}, },

View File

@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const GdkPixbuf = imports.gi.GdkPixbuf; const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
@ -16,56 +15,54 @@ const MessageTray = imports.ui.messageTray;
const Params = imports.misc.params; const Params = imports.misc.params;
const Util = imports.misc.util; const Util = imports.misc.util;
let nextNotificationId = 1;
// Should really be defined in Gio.js // Should really be defined in Gio.js
const BusIface = '<node> \ const BusIface = <interface name="org.freedesktop.DBus">
<interface name="org.freedesktop.DBus"> \ <method name="GetConnectionUnixProcessID">
<method name="GetConnectionUnixProcessID"> \ <arg type="s" direction="in" />
<arg type="s" direction="in" /> \ <arg type="u" direction="out" />
<arg type="u" direction="out" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface); var BusProxy = Gio.DBusProxy.makeProxyWrapper(BusIface);
function Bus() { function Bus() {
return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus'); return new BusProxy(Gio.DBus.session, 'org.freedesktop.DBus', '/org/freedesktop/DBus');
} }
const FdoNotificationsIface = '<node> \ const NotificationDaemonIface = <interface name="org.freedesktop.Notifications">
<interface name="org.freedesktop.Notifications"> \ <method name="Notify">
<method name="Notify"> \ <arg type="s" direction="in"/>
<arg type="s" direction="in"/> \ <arg type="u" direction="in"/>
<arg type="u" direction="in"/> \ <arg type="s" direction="in"/>
<arg type="s" direction="in"/> \ <arg type="s" direction="in"/>
<arg type="s" direction="in"/> \ <arg type="s" direction="in"/>
<arg type="s" direction="in"/> \ <arg type="as" direction="in"/>
<arg type="as" direction="in"/> \ <arg type="a{sv}" direction="in"/>
<arg type="a{sv}" direction="in"/> \ <arg type="i" direction="in"/>
<arg type="i" direction="in"/> \ <arg type="u" direction="out"/>
<arg type="u" direction="out"/> \ </method>
</method> \ <method name="CloseNotification">
<method name="CloseNotification"> \ <arg type="u" direction="in"/>
<arg type="u" direction="in"/> \ </method>
</method> \ <method name="GetCapabilities">
<method name="GetCapabilities"> \ <arg type="as" direction="out"/>
<arg type="as" direction="out"/> \ </method>
</method> \ <method name="GetServerInformation">
<method name="GetServerInformation"> \ <arg type="s" direction="out"/>
<arg type="s" direction="out"/> \ <arg type="s" direction="out"/>
<arg type="s" direction="out"/> \ <arg type="s" direction="out"/>
<arg type="s" direction="out"/> \ <arg type="s" direction="out"/>
<arg type="s" direction="out"/> \ </method>
</method> \ <signal name="NotificationClosed">
<signal name="NotificationClosed"> \ <arg type="u"/>
<arg type="u"/> \ <arg type="u"/>
<arg type="u"/> \ </signal>
</signal> \ <signal name="ActionInvoked">
<signal name="ActionInvoked"> \ <arg type="u"/>
<arg type="u"/> \ <arg type="s"/>
<arg type="s"/> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const NotificationClosedReason = { const NotificationClosedReason = {
EXPIRED: 1, EXPIRED: 1,
@ -106,11 +103,131 @@ const STANDARD_TRAY_ICON_IMPLEMENTATIONS = {
'ibus-ui-gtk': 'keyboard' 'ibus-ui-gtk': 'keyboard'
}; };
const FdoNotificationDaemon = new Lang.Class({ const NotificationGenericPolicy = new Lang.Class({
Name: 'FdoNotificationDaemon', Name: 'NotificationGenericPolicy',
Extends: MessageTray.NotificationPolicy,
_init: function() { _init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(FdoNotificationsIface, this); // Don't chain to parent, it would try setting
// our properties to the defaults
this.id = 'generic';
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
},
store: function() { },
destroy: function() {
this._masterSettings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
get enable() {
return true;
},
get enableSound() {
return true;
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners');
},
get forceExpanded() {
return false;
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return false;
}
});
const NotificationApplicationPolicy = new Lang.Class({
Name: 'NotificationApplicationPolicy',
Extends: MessageTray.NotificationPolicy,
_init: function(id) {
// Don't chain to parent, it would try setting
// our properties to the defaults
this.id = id;
this._canonicalId = this._canonicalizeId(id)
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
this._settings.connect('changed', Lang.bind(this, this._changed));
},
store: function() {
this._settings.set_string('application-id', this.id + '.desktop');
let apps = this._masterSettings.get_strv('application-children');
if (apps.indexOf(this._canonicalId) < 0) {
apps.push(this._canonicalId);
this._masterSettings.set_strv('application-children', apps);
}
},
destroy: function() {
this._masterSettings.run_dispose();
this._settings.run_dispose();
},
_changed: function(settings, key) {
this.emit('policy-changed', key);
},
_canonicalizeId: function(id) {
// Keys are restricted to lowercase alphanumeric characters and dash,
// and two dashes cannot be in succession
return id.toLowerCase().replace(/[^a-z0-9\-]/g, '-').replace(/--+/g, '-');
},
get enable() {
return this._settings.get_boolean('enable');
},
get enableSound() {
return this._settings.get_boolean('enable-sound-alerts');
},
get showBanners() {
return this._masterSettings.get_boolean('show-banners') &&
this._settings.get_boolean('show-banners');
},
get forceExpanded() {
return this._settings.get_boolean('force-expanded');
},
get showInLockScreen() {
return this._masterSettings.get_boolean('show-in-lock-screen') &&
this._settings.get_boolean('show-in-lock-screen');
},
get detailsInLockScreen() {
return this._settings.get_boolean('details-in-lock-screen');
}
});
const NotificationDaemon = new Lang.Class({
Name: 'NotificationDaemon',
_init: function() {
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(NotificationDaemonIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications'); this._dbusImpl.export(Gio.DBus.session, '/org/freedesktop/Notifications');
this._sources = []; this._sources = [];
@ -118,8 +235,6 @@ const FdoNotificationDaemon = new Lang.Class({
this._notifications = {}; this._notifications = {};
this._busProxy = new Bus(); this._busProxy = new Bus();
this._nextNotificationId = 1;
this._trayManager = new Shell.TrayManager(); this._trayManager = new Shell.TrayManager();
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded)); this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved)); this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
@ -218,7 +333,7 @@ const FdoNotificationDaemon = new Lang.Class({
} }
} }
let source = new FdoNotificationDaemonSource(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null); let source = new Source(title, pid, sender, trayIcon, ndata ? ndata.hints['desktop-entry'] : null);
source.setTransient(isForTransientNotification); source.setTransient(isForTransientNotification);
if (!isForTransientNotification) { if (!isForTransientNotification) {
@ -257,7 +372,7 @@ const FdoNotificationDaemon = new Lang.Class({
hints['category'] == 'presence.offline')) { hints['category'] == 'presence.offline')) {
// Ignore replacesId since we already sent back a // Ignore replacesId since we already sent back a
// NotificationClosed for that id. // NotificationClosed for that id.
id = this._nextNotificationId++; id = nextNotificationId++;
Mainloop.idle_add(Lang.bind(this, Mainloop.idle_add(Lang.bind(this,
function () { function () {
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED); this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
@ -281,13 +396,12 @@ const FdoNotificationDaemon = new Lang.Class({
if (!hints['image-path'] && hints['image_path']) if (!hints['image-path'] && hints['image_path'])
hints['image-path'] = hints['image_path']; // version 1.1 of the spec hints['image-path'] = hints['image_path']; // version 1.1 of the spec
if (!hints['image-data']) { if (!hints['image-data'])
if (hints['image_data']) if (hints['image_data'])
hints['image-data'] = hints['image_data']; // version 1.1 of the spec hints['image-data'] = hints['image_data']; // version 1.1 of the spec
else if (hints['icon_data'] && !hints['image-path']) else if (hints['icon_data'] && !hints['image-path'])
// early versions of the spec; 'icon_data' should only be used if 'image-path' is not available // early versions of the spec; 'icon_data' should only be used if 'image-path' is not available
hints['image-data'] = hints['icon_data']; hints['image-data'] = hints['icon_data'];
}
let ndata = { appName: appName, let ndata = { appName: appName,
icon: icon, icon: icon,
@ -301,7 +415,7 @@ const FdoNotificationDaemon = new Lang.Class({
ndata.notification = this._notifications[replacesId].notification; ndata.notification = this._notifications[replacesId].notification;
} else { } else {
replacesId = 0; replacesId = 0;
ndata.id = id = this._nextNotificationId++; ndata.id = id = nextNotificationId++;
} }
this._notifications[id] = ndata; this._notifications[id] = ndata;
@ -356,19 +470,6 @@ const FdoNotificationDaemon = new Lang.Class({
return invocation.return_value(GLib.Variant.new('(u)', [id])); return invocation.return_value(GLib.Variant.new('(u)', [id]));
}, },
_makeButton: function(id, label, useActionIcons) {
let button = new St.Button({ can_focus: true });
let iconName = id.endsWith('-symbolic') ? id : id + '-symbolic';
if (useActionIcons && Gtk.IconTheme.get_default().has_icon(iconName)) {
button.add_style_class_name('notification-icon-button');
button.child = new St.Icon({ icon_name: iconName });
} else {
button.add_style_class_name('notification-button');
button.label = label;
}
return button;
},
_notifyForSource: function(source, ndata) { _notifyForSource: function(source, ndata) {
let [id, icon, summary, body, actions, hints, notification] = let [id, icon, summary, body, actions, hints, notification] =
[ndata.id, ndata.icon, ndata.summary, ndata.body, [ndata.id, ndata.icon, ndata.summary, ndata.body,
@ -394,6 +495,10 @@ const FdoNotificationDaemon = new Lang.Class({
} }
this._emitNotificationClosed(ndata.id, notificationClosedReason); this._emitNotificationClosed(ndata.id, notificationClosedReason);
})); }));
notification.connect('action-invoked', Lang.bind(this,
function(n, actionId) {
this._emitActionInvoked(ndata.id, actionId);
}));
} }
// Mark music notifications so they can be shown in the screen shield // Mark music notifications so they can be shown in the screen shield
@ -427,33 +532,18 @@ const FdoNotificationDaemon = new Lang.Class({
soundName: hints['sound-name'] }); soundName: hints['sound-name'] });
notification.setImage(image); notification.setImage(image);
let hasDefaultAction = false;
if (actions.length) { if (actions.length) {
let useActionIcons = (hints['action-icons'] == true); notification.setUseActionIcons(hints['action-icons'] == true);
for (let i = 0; i < actions.length - 1; i += 2) { for (let i = 0; i < actions.length - 1; i += 2) {
let [actionId, label] = [actions[i], actions[i+1]]; if (actions[i] == 'default')
if (actionId == 'default') { notification.connect('clicked', Lang.bind(this,
hasDefaultAction = true; function() {
} else { this._emitActionInvoked(ndata.id, "default");
notification.addButton(this._makeButton(actionId, label, useActionIcons), Lang.bind(this, function() { }));
this._emitActionInvoked(ndata.id, actionId); else
})); notification.addButton(actions[i], actions[i + 1]);
}
} }
} }
if (hasDefaultAction) {
notification.connect('clicked', Lang.bind(this, function() {
this._emitActionInvoked(ndata.id, 'default');
}));
} else {
notification.connect('clicked', Lang.bind(this, function() {
source.open();
}));
}
switch (hints.urgency) { switch (hints.urgency) {
case Urgency.LOW: case Urgency.LOW:
notification.setUrgency(MessageTray.Urgency.LOW); notification.setUrgency(MessageTray.Urgency.LOW);
@ -546,8 +636,8 @@ const FdoNotificationDaemon = new Lang.Class({
} }
}); });
const FdoNotificationDaemonSource = new Lang.Class({ const Source = new Lang.Class({
Name: 'FdoNotificationDaemonSource', Name: 'NotificationDaemonSource',
Extends: MessageTray.Source, Extends: MessageTray.Source,
_init: function(title, pid, sender, trayIcon, appId) { _init: function(title, pid, sender, trayIcon, appId) {
@ -582,11 +672,11 @@ const FdoNotificationDaemonSource = new Lang.Class({
}, },
_createPolicy: function() { _createPolicy: function() {
if (this.app && this.app.get_app_info()) { if (this.app) {
let id = this.app.get_id().replace(/\.desktop$/,''); let id = this.app.get_id().replace(/\.desktop$/,'');
return new MessageTray.NotificationApplicationPolicy(id); return new NotificationApplicationPolicy(id);
} else { } else {
return new MessageTray.NotificationGenericPolicy(); return new NotificationGenericPolicy();
} }
}, },
@ -662,6 +752,22 @@ const FdoNotificationDaemonSource = new Lang.Class({
return null; return null;
}, },
_setApp: function(appId) {
if (this.app)
return;
this.app = this._getApp(appId);
if (!this.app)
return;
// Only override the icon if we were previously using
// notification-based icons (ie, not a trayicon) or if it was unset before
if (!this.trayIcon) {
this.useNotificationIcon = false;
this.iconUpdated();
}
},
setTitle: function(title) { setTitle: function(title) {
// Do nothing if .app is set, we don't want to override the // Do nothing if .app is set, we don't want to override the
// app name with whatever is provided through libnotify (usually // app name with whatever is provided through libnotify (usually
@ -672,9 +778,9 @@ const FdoNotificationDaemonSource = new Lang.Class({
this.parent(title); this.parent(title);
}, },
open: function() { open: function(notification) {
this.openApp();
this.destroyNonResidentNotifications(); this.destroyNonResidentNotifications();
this.openApp();
}, },
_lastNotificationRemoved: function() { _lastNotificationRemoved: function() {
@ -686,8 +792,11 @@ const FdoNotificationDaemonSource = new Lang.Class({
if (this.app == null) if (this.app == null)
return; return;
this.app.activate(); let windows = this.app.get_windows();
Main.overview.hide(); if (windows.length > 0) {
let mostRecentWindow = windows[0];
Main.activateWindow(mostRecentWindow);
}
}, },
destroy: function() { destroy: function() {
@ -714,276 +823,3 @@ const FdoNotificationDaemonSource = new Lang.Class({
} }
} }
}); });
const GtkNotificationDaemonNotification = new Lang.Class({
Name: 'GtkNotificationDaemonNotification',
Extends: MessageTray.Notification,
_init: function(source, notification) {
this.parent(source);
this._serialized = GLib.Variant.new('a{sv}', notification);
let { "title": title,
"body": body,
"icon": gicon,
"urgent": urgent,
"buttons": buttons,
"default-action": defaultAction,
"default-action-target": defaultActionTarget } = notification;
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
: MessageTray.Urgency.NORMAL);
if (buttons) {
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
this.addAction(button.label.unpack(),
Lang.bind(this, this._onButtonClicked, button));
}));
}
this._defaultAction = defaultAction ? defaultAction.unpack() : null;
this._defaultActionTarget = defaultActionTarget;
this.update(title.unpack(), body ? body.unpack() : null,
{ gicon: gicon ? Gio.icon_deserialize(gicon) : null });
},
_activateAction: function(namespacedActionId, target) {
if (namespacedActionId) {
if (namespacedActionId.startsWith('app.')) {
let actionId = namespacedActionId.slice('app.'.length);
this.source.activateAction(actionId, target);
}
} else {
this.source.open();
}
},
_onButtonClicked: function(button) {
let { 'action': action, 'target': actionTarget } = button;
this._activateAction(action.unpack(), actionTarget);
},
_onClicked: function() {
this._activateAction(this._defaultAction, this._defaultActionTarget);
this.parent();
},
serialize: function() {
return this._serialized;
},
});
const FdoApplicationIface = '<node> \
<interface name="org.freedesktop.Application"> \
<method name="ActivateAction"> \
<arg type="s" direction="in" /> \
<arg type="av" direction="in" /> \
<arg type="a{sv}" direction="in" /> \
</method> \
<method name="Activate"> \
<arg type="a{sv}" direction="in" /> \
</method> \
</interface> \
</node>';
const FdoApplicationProxy = Gio.DBusProxy.makeProxyWrapper(FdoApplicationIface);
function objectPathFromAppId(appId) {
return '/' + appId.replace(/\./g, '/');
}
function getPlatformData() {
let startupId = GLib.Variant.new('s', '_TIME' + global.get_current_time());
return { "desktop-startup-id": startupId };
}
function InvalidAppError() {}
const GtkNotificationDaemonAppSource = new Lang.Class({
Name: 'GtkNotificationDaemonAppSource',
Extends: MessageTray.Source,
_init: function(appId) {
this._appId = appId;
this._objectPath = objectPathFromAppId(appId);
this._app = Shell.AppSystem.get_default().lookup_app(appId + '.desktop');
if (!this._app)
throw new InvalidAppError();
this._notifications = {};
this.parent(this._app.get_name());
},
createIcon: function(size) {
return this._app.create_icon_texture(size);
},
_createPolicy: function() {
return new MessageTray.NotificationApplicationPolicy(this._appId);
},
_createApp: function() {
return new FdoApplicationProxy(Gio.DBus.session, this._appId, this._objectPath);
},
activateAction: function(actionId, target) {
let app = this._createApp();
app.ActivateActionRemote(actionId, target ? [target] : [], getPlatformData());
},
open: function() {
let app = this._createApp();
app.ActivateRemote(getPlatformData());
},
addNotification: function(notificationId, notificationParams, showBanner) {
if (this._notifications[notificationId])
this._notifications[notificationId].destroy();
let notification = new GtkNotificationDaemonNotification(this, notificationParams);
notification.connect('destroy', Lang.bind(this, function() {
delete this._notifications[notificationId];
}));
this._notifications[notificationId] = notification;
if (showBanner)
this.notify(notification);
else
this.pushNotification(notification);
},
removeNotification: function(notificationId) {
if (this._notifications[notificationId])
this._notifications[notificationId].destroy(MessageTray.NotificationDestroyedReason.SOURCE_CLOSED);
},
serialize: function() {
let notifications = [];
for (let notificationId in this._notifications) {
let notification = this._notifications[notificationId];
notifications.push([notificationId, notification.serialize()]);
}
return [this._appId, notifications];
},
});
const GtkNotificationsIface = '<node> \
<interface name="org.gtk.Notifications"> \
<method name="AddNotification"> \
<arg type="s" direction="in" /> \
<arg type="s" direction="in" /> \
<arg type="a{sv}" direction="in" /> \
</method> \
<method name="RemoveNotification"> \
<arg type="s" direction="in" /> \
<arg type="s" direction="in" /> \
</method> \
</interface> \
</node>';
const GtkNotificationDaemon = new Lang.Class({
Name: 'GtkNotificationDaemon',
_init: function() {
this._sources = {};
this._loadNotifications();
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(GtkNotificationsIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gtk/Notifications');
Gio.DBus.session.own_name('org.gtk.Notifications', Gio.BusNameOwnerFlags.REPLACE, null, null);
},
_ensureAppSource: function(appId) {
if (this._sources[appId])
return this._sources[appId];
let source = new GtkNotificationDaemonAppSource(appId);
source.connect('destroy', Lang.bind(this, function() {
delete this._sources[appId];
this._saveNotifications();
}));
source.connect('count-updated', Lang.bind(this, this._saveNotifications));
Main.messageTray.add(source);
this._sources[appId] = source;
return source;
},
_loadNotifications: function() {
this._isLoading = true;
let value = global.get_persistent_state('a(sa(sv))', 'notifications');
if (value) {
let sources = value.deep_unpack();
sources.forEach(Lang.bind(this, function([appId, notifications]) {
if (notifications.length == 0)
return;
let source;
try {
source = this._ensureAppSource(appId);
} catch(e if e instanceof InvalidAppError) {
return;
}
notifications.forEach(function([notificationId, notification]) {
source.addNotification(notificationId, notification.deep_unpack(), false);
});
}));
}
this._isLoading = false;
},
_saveNotifications: function() {
if (this._isLoading)
return;
let sources = [];
for (let appId in this._sources) {
let source = this._sources[appId];
sources.push(source.serialize());
}
global.set_persistent_state('notifications', new GLib.Variant('a(sa(sv))', sources));
},
AddNotificationAsync: function(params, invocation) {
let [appId, notificationId, notification] = params;
let source;
try {
source = this._ensureAppSource(appId);
} catch(e if e instanceof InvalidAppError) {
invocation.return_dbus_error('org.gtk.Notifications.InvalidApp', 'The app by ID "%s" could not be found'.format(appId));
return;
}
source.addNotification(notificationId, notification, true);
invocation.return_value(null);
},
RemoveNotificationAsync: function(params, invocation) {
let [appId, notificationId] = params;
let source = this._sources[appId];
if (source)
source.removeNotification(notificationId);
invocation.return_value(null);
},
});
const NotificationDaemon = new Lang.Class({
Name: 'NotificationDaemon',
_init: function() {
this._fdoNotificationDaemon = new FdoNotificationDaemon();
this._gtkNotificationDaemon = new GtkNotificationDaemon();
},
});

View File

@ -78,8 +78,10 @@ const ShellInfo = new Lang.Class({
} }
this._undoCallback = undoCallback; this._undoCallback = undoCallback;
if (undoCallback) if (undoCallback) {
notification.addAction(_("Undo"), Lang.bind(this, this._onUndoClicked)); notification.addButton('system-undo', _("Undo"));
notification.connect('action-invoked', Lang.bind(this, this._onUndoClicked));
}
this._source.notify(notification); this._source.notify(notification);
} }
@ -311,6 +313,9 @@ const Overview = new Lang.Class({
}, },
_onDragEnd: function(time) { _onDragEnd: function(time) {
if (this.animationInProgress)
return;
this._inXdndDrag = false; this._inXdndDrag = false;
// In case the drag was canceled while in the overview // In case the drag was canceled while in the overview
@ -363,13 +368,11 @@ const Overview = new Lang.Class({
this._lastHoveredWindow = dragEvent.targetActor._delegate.metaWindow; this._lastHoveredWindow = dragEvent.targetActor._delegate.metaWindow;
this._windowSwitchTimeoutId = Mainloop.timeout_add(DND_WINDOW_SWITCH_TIMEOUT, this._windowSwitchTimeoutId = Mainloop.timeout_add(DND_WINDOW_SWITCH_TIMEOUT,
Lang.bind(this, function() { Lang.bind(this, function() {
this._windowSwitchTimeoutId = 0;
this._needsFakePointerEvent = true; this._needsFakePointerEvent = true;
Main.activateWindow(dragEvent.targetActor._delegate.metaWindow, Main.activateWindow(dragEvent.targetActor._delegate.metaWindow,
this._windowSwitchTimestamp); this._windowSwitchTimestamp);
this.hide(); this.hide();
this._lastHoveredWindow = null; this._lastHoveredWindow = null;
return false;
})); }));
} }
@ -445,17 +448,17 @@ const Overview = new Lang.Class({
this._inDrag = false; this._inDrag = false;
}, },
beginWindowDrag: function(clone) { beginWindowDrag: function(source) {
this.emit('window-drag-begin', clone); this.emit('window-drag-begin');
this._inDrag = true; this._inDrag = true;
}, },
cancelledWindowDrag: function(clone) { cancelledWindowDrag: function(source) {
this.emit('window-drag-cancelled', clone); this.emit('window-drag-cancelled');
}, },
endWindowDrag: function(clone) { endWindowDrag: function(source) {
this.emit('window-drag-end', clone); this.emit('window-drag-end');
this._inDrag = false; this._inDrag = false;
}, },

View File

@ -36,7 +36,6 @@ const SlideLayout = new Lang.Class({
_init: function(params) { _init: function(params) {
this._slideX = 1; this._slideX = 1;
this._translationX = 0;
this._direction = SlideDirection.LEFT; this._direction = SlideDirection.LEFT;
this.parent(params); this.parent(params);
@ -56,21 +55,18 @@ const SlideLayout = new Lang.Class({
vfunc_allocate: function(container, box, flags) { vfunc_allocate: function(container, box, flags) {
let child = container.get_first_child(); let child = container.get_first_child();
let [, , natWidth, natHeight] = child.get_preferred_size();
let availWidth = Math.round(box.x2 - box.x1); let availWidth = Math.round(box.x2 - box.x1);
let availHeight = Math.round(box.y2 - box.y1); let availHeight = Math.round(box.y2 - box.y1);
let [, natWidth] = child.get_preferred_width(availHeight);
// Align the actor inside the clipped box, as the actor's alignment
// flags only determine what to do if the allocated box is bigger
// than the actor's box.
let realDirection = getRtlSlideDirection(this._direction, child); let realDirection = getRtlSlideDirection(this._direction, child);
let alignX = (realDirection == SlideDirection.LEFT) ? (availWidth - natWidth) : 0; let translationX = (realDirection == SlideDirection.LEFT) ?
(availWidth - natWidth) : (natWidth - availWidth);
let actorBox = new Clutter.ActorBox(); let actorBox = new Clutter.ActorBox({ x1: translationX,
actorBox.x1 = box.x1 + alignX + this._translationX; y1: 0,
actorBox.x2 = actorBox.x1 + (child.x_expand ? availWidth : natWidth); x2: child.x_expand ? availWidth : natWidth,
actorBox.y1 = box.y1; y2: child.y_expand ? availHeight : natHeight });
actorBox.y2 = actorBox.y1 + availHeight;
child.allocate(actorBox, flags); child.allocate(actorBox, flags);
}, },
@ -91,16 +87,7 @@ const SlideLayout = new Lang.Class({
get slideDirection() { get slideDirection() {
return this._direction; return this._direction;
}, }
set translationX(value) {
this._translationX = value;
this.layout_changed();
},
get translationX() {
return this._translationX;
},
}); });
const SlidingControl = new Lang.Class({ const SlidingControl = new Lang.Class({
@ -109,8 +96,8 @@ const SlidingControl = new Lang.Class({
_init: function(params) { _init: function(params) {
params = Params.parse(params, { slideDirection: SlideDirection.LEFT }); params = Params.parse(params, { slideDirection: SlideDirection.LEFT });
this._visible = true; this.visible = true;
this._inDrag = false; this.inDrag = false;
this.layout = new SlideLayout(); this.layout = new SlideLayout();
this.layout.slideDirection = params.slideDirection; this.layout.slideDirection = params.slideDirection;
@ -119,7 +106,6 @@ const SlidingControl = new Lang.Class({
clip_to_allocation: true }); clip_to_allocation: true });
Main.overview.connect('showing', Lang.bind(this, this._onOverviewShowing)); Main.overview.connect('showing', Lang.bind(this, this._onOverviewShowing));
Main.overview.connect('hiding', Lang.bind(this, this._onOverviewHiding));
Main.overview.connect('item-drag-begin', Lang.bind(this, this._onDragBegin)); Main.overview.connect('item-drag-begin', Lang.bind(this, this._onDragBegin));
Main.overview.connect('item-drag-end', Lang.bind(this, this._onDragEnd)); Main.overview.connect('item-drag-end', Lang.bind(this, this._onDragEnd));
@ -130,12 +116,12 @@ const SlidingControl = new Lang.Class({
Main.overview.connect('window-drag-end', Lang.bind(this, this._onWindowDragEnd)); Main.overview.connect('window-drag-end', Lang.bind(this, this._onWindowDragEnd));
}, },
_getSlide: function() { getSlide: function() {
throw new Error('getSlide() must be overridden'); throw new Error('getSlide() must be overridden');
}, },
_updateSlide: function() { updateSlide: function() {
Tweener.addTween(this.layout, { slideX: this._getSlide(), Tweener.addTween(this.layout, { slideX: this.getSlide(),
time: SIDE_CONTROLS_ANIMATION_TIME, time: SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
}, },
@ -162,30 +148,28 @@ const SlidingControl = new Lang.Class({
let translationEnd = 0; let translationEnd = 0;
let translation = this._getTranslation(); let translation = this._getTranslation();
if (this._visible) { if (this.visible) {
translationStart = translation; translationStart = translation;
} else { } else {
translationEnd = translation; translationEnd = translation;
} }
if (this.layout.translationX == translationEnd) if (this.actor.translation_x == translationEnd)
return; return;
this.layout.translationX = translationStart; this.actor.translation_x = translationStart;
Tweener.addTween(this.layout, { translationX: translationEnd, Tweener.addTween(this.actor, { translation_x: translationEnd,
time: SIDE_CONTROLS_ANIMATION_TIME, time: SIDE_CONTROLS_ANIMATION_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad'
});
}, },
_onOverviewShowing: function() { _onOverviewShowing: function() {
this._visible = true; // reset any translation and make sure the actor is visible when
this.layout.slideX = this._getSlide(); // entering the overview
this.layout.translationX = this._getTranslation(); this.visible = true;
this.slideIn(); this.layout.slideX = this.getSlide();
}, this.actor.translation_x = 0;
_onOverviewHiding: function() {
this.slideOut();
}, },
_onWindowDragBegin: function() { _onWindowDragBegin: function() {
@ -197,14 +181,14 @@ const SlidingControl = new Lang.Class({
}, },
_onDragBegin: function() { _onDragBegin: function() {
this._inDrag = true; this.inDrag = true;
this.layout.translationX = 0; this.actor.translation_x = 0;
this._updateSlide(); this.updateSlide();
}, },
_onDragEnd: function() { _onDragEnd: function() {
this._inDrag = false; this.inDrag = false;
this._updateSlide(); this.updateSlide();
}, },
fadeIn: function() { fadeIn: function() {
@ -222,13 +206,13 @@ const SlidingControl = new Lang.Class({
}, },
slideIn: function() { slideIn: function() {
this._visible = true; this.visible = true;
this._updateTranslation(); this._updateTranslation();
// we will update slideX and the translation from pageEmpty // we will update slideX and the translation from pageEmpty
}, },
slideOut: function() { slideOut: function() {
this._visible = false; this.visible = false;
this._updateTranslation(); this._updateTranslation();
// we will update slideX from pageEmpty // we will update slideX from pageEmpty
}, },
@ -238,7 +222,7 @@ const SlidingControl = new Lang.Class({
// selector; this means we can now safely set the full slide for // selector; this means we can now safely set the full slide for
// the next page, since slideIn or slideOut might have been called, // the next page, since slideIn or slideOut might have been called,
// changing the visiblity // changing the visiblity
this.layout.slideX = this._getSlide(); this.layout.slideX = this.getSlide();
this._updateTranslation(); this._updateTranslation();
} }
}); });
@ -252,20 +236,26 @@ const ThumbnailsSlider = new Lang.Class({
this._thumbnailsBox = thumbnailsBox; this._thumbnailsBox = thumbnailsBox;
// SlideLayout reads the actor's expand flags to decide
// whether to allocate the natural size to its child, or the whole
// available allocation
this._thumbnailsBox.actor.y_expand = true;
this.actor.request_mode = Clutter.RequestMode.WIDTH_FOR_HEIGHT; this.actor.request_mode = Clutter.RequestMode.WIDTH_FOR_HEIGHT;
this.actor.reactive = true; this.actor.reactive = true;
this.actor.track_hover = true; this.actor.track_hover = true;
this.actor.add_actor(this._thumbnailsBox.actor); this.actor.add_actor(this._thumbnailsBox.actor);
Main.layoutManager.connect('monitors-changed', Lang.bind(this, this._updateSlide)); Main.layoutManager.connect('monitors-changed', Lang.bind(this, this.updateSlide));
this.actor.connect('notify::hover', Lang.bind(this, this._updateSlide)); Main.overview.connect('hiding', Lang.bind(this, this.slideOut));
this.actor.connect('notify::hover', Lang.bind(this, this.updateSlide));
this._thumbnailsBox.actor.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE); this._thumbnailsBox.actor.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
}, },
_getAlwaysZoomOut: function() { _getAlwaysZoomOut: function() {
// Always show the pager when hover, during a drag, or if workspaces are // Always show the pager when hover, during a drag, or if workspaces are
// actually used, e.g. there are windows on more than one // actually used, e.g. there are windows on more than one
let alwaysZoomOut = this.actor.hover || this._inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2; let alwaysZoomOut = this.actor.hover || this.inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2;
if (!alwaysZoomOut) { if (!alwaysZoomOut) {
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
@ -285,13 +275,20 @@ const ThumbnailsSlider = new Lang.Class({
return alwaysZoomOut; return alwaysZoomOut;
}, },
_onOverviewShowing: function() {
this.visible = true;
this.layout.slideX = this.getSlide();
this.actor.translation_x = this._getTranslation();
this.slideIn();
},
getNonExpandedWidth: function() { getNonExpandedWidth: function() {
let child = this.actor.get_first_child(); let child = this.actor.get_first_child();
return child.get_theme_node().get_length('visible-width'); return child.get_theme_node().get_length('visible-width');
}, },
_getSlide: function() { getSlide: function() {
if (!this._visible) if (!this.visible)
return 0; return 0;
let alwaysZoomOut = this._getAlwaysZoomOut(); let alwaysZoomOut = this._getAlwaysZoomOut();
@ -327,23 +324,31 @@ const DashSlider = new Lang.Class({
// whether to allocate the natural size to its child, or the whole // whether to allocate the natural size to its child, or the whole
// available allocation // available allocation
this._dash.actor.x_expand = true; this._dash.actor.x_expand = true;
this._dash.actor.y_expand = true;
this.actor.x_expand = true;
this.actor.x_align = Clutter.ActorAlign.START; this.actor.x_align = Clutter.ActorAlign.START;
this.actor.y_expand = true; this.actor.y_expand = true;
this.actor.add_actor(this._dash.actor); this.actor.add_actor(this._dash.actor);
this._dash.connect('icon-size-changed', Lang.bind(this, this._updateSlide)); this._dash.connect('icon-size-changed', Lang.bind(this, this.updateSlide));
Main.overview.connect('hiding', Lang.bind(this, this.slideOut));
}, },
_getSlide: function() { getSlide: function() {
if (this._visible || this._inDrag) if (this.visible || this.inDrag)
return 1; return 1;
else else
return 0; return 0;
}, },
_onOverviewShowing: function() {
this.visible = true;
this.layout.slideX = this.getSlide();
this.actor.translation_x = this._getTranslation();
this.slideIn();
},
_onWindowDragBegin: function() { _onWindowDragBegin: function() {
this.fadeHalf(); this.fadeHalf();
}, },

View File

@ -213,7 +213,9 @@ const AppMenuButton = new Lang.Class({
this._label = new TextShadower(); this._label = new TextShadower();
this._label.actor.y_align = Clutter.ActorAlign.CENTER; this._label.actor.y_align = Clutter.ActorAlign.CENTER;
this._hbox.add_actor(this._label.actor); this._hbox.add_actor(this._label.actor);
this._arrow = PopupMenu.unicodeArrow(St.Side.BOTTOM); this._arrow = new St.Label({ text: '\u25BE',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
this._hbox.add_actor(this._arrow); this._hbox.add_actor(this._arrow);
this._iconBottomClip = 0; this._iconBottomClip = 0;
@ -831,7 +833,9 @@ const AggregateMenu = new Lang.Class({
this._indicators.add_child(this._rfkill.indicators); this._indicators.add_child(this._rfkill.indicators);
this._indicators.add_child(this._volume.indicators); this._indicators.add_child(this._volume.indicators);
this._indicators.add_child(this._power.indicators); this._indicators.add_child(this._power.indicators);
this._indicators.add_child(PopupMenu.unicodeArrow(St.Side.BOTTOM)); this._indicators.add_child(new St.Label({ text: '\u25BE',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER }));
this.menu.addMenuItem(this._volume.menu); this.menu.addMenuItem(this._volume.menu);
this.menu.addMenuItem(this._brightness.menu); this.menu.addMenuItem(this._brightness.menu);

View File

@ -42,33 +42,6 @@ function isPopupMenuItemVisible(child) {
return child.visible; return child.visible;
} }
/**
* @side Side to which the arrow points.
*/
function unicodeArrow(side) {
let arrowChar;
switch (side) {
case St.Side.TOP:
arrowChar = '\u25B4';
break;
case St.Side.RIGHT:
arrowChar = '\u25B8';
break;
case St.Side.BOTTOM:
arrowChar = '\u25BE';
break;
case St.Side.LEFT:
arrowChar = '\u25C2';
break;
}
return new St.Label({ text: arrowChar,
style_class: 'unicode-arrow',
accessible_role: Atk.Role.ARROW,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
}
const PopupBaseMenuItem = new Lang.Class({ const PopupBaseMenuItem = new Lang.Class({
Name: 'PopupBaseMenuItem', Name: 'PopupBaseMenuItem',
@ -989,7 +962,8 @@ const PopupSubMenuMenuItem = new Lang.Class({
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this.actor.add_child(this.status); this.actor.add_child(this.status);
this._triangle = unicodeArrow(St.Side.RIGHT); this._triangle = new St.Label({ text: '\u25B8',
style_class: 'popup-submenu-menu-item-triangle' });
this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 }); this._triangle.pivot_point = new Clutter.Point({ x: 0.5, y: 0.6 });
this._triangleBin = new St.Widget({ y_expand: true, this._triangleBin = new St.Widget({ y_expand: true,
@ -1114,7 +1088,7 @@ const PopupMenuManager = new Lang.Class({
removeMenu: function(menu) { removeMenu: function(menu) {
if (menu == this.activeMenu) if (menu == this.activeMenu)
this._closeMenu(false, menu); this._closeMenu(menu);
let position = this._findMenu(menu); let position = this._findMenu(menu);
if (position == -1) // not a menu we manage if (position == -1) // not a menu we manage

View File

@ -7,63 +7,58 @@ const Lang = imports.lang;
const St = imports.gi.St; const St = imports.gi.St;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const FileUtils = imports.misc.fileUtils;
const Search = imports.ui.search; const Search = imports.ui.search;
const KEY_FILE_GROUP = 'Shell Search Provider'; const KEY_FILE_GROUP = 'Shell Search Provider';
const SearchProviderIface = '<node> \ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
<interface name="org.gnome.Shell.SearchProvider"> \ <method name="GetInitialResultSet">
<method name="GetInitialResultSet"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="out" />
<arg type="as" direction="out" /> \ </method>
</method> \ <method name="GetSubsearchResultSet">
<method name="GetSubsearchResultSet"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="out" />
<arg type="as" direction="out" /> \ </method>
</method> \ <method name="GetResultMetas">
<method name="GetResultMetas"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="aa{sv}" direction="out" />
<arg type="aa{sv}" direction="out" /> \ </method>
</method> \ <method name="ActivateResult">
<method name="ActivateResult"> \ <arg type="s" direction="in" />
<arg type="s" direction="in" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const SearchProvider2Iface = '<node> \ const SearchProvider2Iface = <interface name="org.gnome.Shell.SearchProvider2">
<interface name="org.gnome.Shell.SearchProvider2"> \ <method name="GetInitialResultSet">
<method name="GetInitialResultSet"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="out" />
<arg type="as" direction="out" /> \ </method>
</method> \ <method name="GetSubsearchResultSet">
<method name="GetSubsearchResultSet"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="as" direction="out" />
<arg type="as" direction="out" /> \ </method>
</method> \ <method name="GetResultMetas">
<method name="GetResultMetas"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="aa{sv}" direction="out" />
<arg type="aa{sv}" direction="out" /> \ </method>
</method> \ <method name="ActivateResult">
<method name="ActivateResult"> \ <arg type="s" direction="in" />
<arg type="s" direction="in" /> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ </method>
</method> \ <method name="LaunchSearch">
<method name="LaunchSearch"> \ <arg type="as" direction="in" />
<arg type="as" direction="in" /> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
var SearchProviderProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProviderIface); var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
var SearchProvider2ProxyInfo = Gio.DBusInterfaceInfo.new_for_xml(SearchProvider2Iface); var SearchProvider2Proxy = Gio.DBusProxy.makeProxyWrapper(SearchProvider2Iface);
function loadRemoteSearchProviders(callback) { function loadRemoteSearchProviders(addProviderCallback) {
let objectPaths = {}; let objectPaths = {};
let loadedProviders = []; let loadedProviders = [];
@ -117,25 +112,30 @@ function loadRemoteSearchProviders(callback) {
} }
} }
let dataDirs = GLib.get_system_data_dirs();
dataDirs.forEach(function(dataDir) {
let path = GLib.build_filenamev([dataDir, 'gnome-shell', 'search-providers']);
let dir = Gio.File.new_for_path(path);
let fileEnum;
try {
fileEnum = dir.enumerate_children('standard::name,standard::type',
Gio.FileQueryInfoFlags.NONE, null);
} catch (e) {
fileEnum = null;
}
if (fileEnum != null) {
let info;
while ((info = fileEnum.next_file(null)))
loadRemoteSearchProvider(fileEnum.get_child(info));
}
});
let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA }); let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
if (searchSettings.get_boolean('disable-external')) {
callback([]);
return;
}
FileUtils.collectFromDatadirs('search-providers', false, loadRemoteSearchProvider);
let sortOrder = searchSettings.get_strv('sort-order'); let sortOrder = searchSettings.get_strv('sort-order');
// Special case gnome-control-center to be always active and always first // Special case gnome-control-center to be always active and always first
sortOrder.unshift('gnome-control-center.desktop'); sortOrder.unshift('gnome-control-center.desktop');
loadedProviders = loadedProviders.filter(function(provider) {
let appId = provider.appInfo.get_id();
let disabled = searchSettings.get_strv('disabled');
return disabled.indexOf(appId) == -1;
});
loadedProviders.sort(function(providerA, providerB) { loadedProviders.sort(function(providerA, providerB) {
let idxA, idxB; let idxA, idxB;
let appIdA, appIdB; let appIdA, appIdB;
@ -166,28 +166,28 @@ function loadRemoteSearchProviders(callback) {
return (idxA - idxB); return (idxA - idxB);
}); });
callback(loadedProviders); loadedProviders.forEach(addProviderCallback);
} }
const RemoteSearchProvider = new Lang.Class({ const RemoteSearchProvider = new Lang.Class({
Name: 'RemoteSearchProvider', Name: 'RemoteSearchProvider',
_init: function(appInfo, dbusName, dbusPath, proxyInfo) { _init: function(appInfo, dbusName, dbusPath, proxyType) {
if (!proxyInfo) if (!proxyType)
proxyInfo = SearchProviderProxyInfo; proxyType = SearchProviderProxy;
this.proxy = new Gio.DBusProxy({ g_bus_type: Gio.BusType.SESSION, this.proxy = new proxyType(Gio.DBus.session,
g_name: dbusName, dbusName, dbusPath, Lang.bind(this, this._onProxyConstructed));
g_object_path: dbusPath,
g_interface_info: proxyInfo,
g_interface_name: proxyInfo.name,
g_flags: (Gio.DBusProxyFlags.DO_NOT_AUTO_START_AT_CONSTRUCTION |
Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES) });
this.proxy.init_async(GLib.PRIORITY_DEFAULT, null, null);
this.appInfo = appInfo; this.appInfo = appInfo;
this.id = appInfo.get_id(); this.id = appInfo.get_id();
this.isRemoteProvider = true; this.isRemoteProvider = true;
this._cancellable = new Gio.Cancellable();
},
_onProxyConstructed: function(proxy) {
// Do nothing
}, },
createIcon: function(size, meta) { createIcon: function(size, meta) {
@ -207,43 +207,40 @@ const RemoteSearchProvider = new Lang.Class({
icon_size: size }); icon_size: size });
}, },
filterResults: function(results, maxNumber) { _getResultsFinished: function(results, error) {
if (results.length <= maxNumber) if (error)
return results;
let regularResults = results.filter(function(r) { return !r.startsWith('special:'); });
let specialResults = results.filter(function(r) { return r.startsWith('special:'); });
return regularResults.slice(0, maxNumber).concat(specialResults.slice(0, maxNumber));
},
_getResultsFinished: function(results, error, callback) {
if (error) {
if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from DBus search provider %s: %s'.format(this.id, String(error)));
callback([]);
return; return;
this.searchSystem.setResults(this, results[0]);
},
getInitialResultSet: function(terms) {
this._cancellable.cancel();
this._cancellable.reset();
try {
this.proxy.GetInitialResultSetRemote(terms,
Lang.bind(this, this._getResultsFinished),
this._cancellable);
} catch(e) {
log('Error calling GetInitialResultSet for provider %s: %s'.format(this.id, e.toString()));
this.searchSystem.setResults(this, []);
} }
callback(results[0]);
}, },
getInitialResultSet: function(terms, callback, cancellable) { getSubsearchResultSet: function(previousResults, newTerms) {
this.proxy.GetInitialResultSetRemote(terms, this._cancellable.cancel();
Lang.bind(this, this._getResultsFinished, callback), this._cancellable.reset();
cancellable); try {
}, this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms,
Lang.bind(this, this._getResultsFinished),
getSubsearchResultSet: function(previousResults, newTerms, callback, cancellable) { this._cancellable);
this.proxy.GetSubsearchResultSetRemote(previousResults, newTerms, } catch(e) {
Lang.bind(this, this._getResultsFinished, callback), log('Error calling GetSubsearchResultSet for provider %s: %s'.format(this.id, e.toString()));
cancellable); this.searchSystem.setResults(this, []);
}
}, },
_getResultMetasFinished: function(results, error, callback) { _getResultMetasFinished: function(results, error, callback) {
if (error) { if (error) {
if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
log('Received error from DBus search provider %s during GetResultMetas: %s'.format(this.id, String(error)));
callback([]); callback([]);
return; return;
} }
@ -265,10 +262,17 @@ const RemoteSearchProvider = new Lang.Class({
callback(resultMetas); callback(resultMetas);
}, },
getResultMetas: function(ids, callback, cancellable) { getResultMetas: function(ids, callback) {
this.proxy.GetResultMetasRemote(ids, this._cancellable.cancel();
Lang.bind(this, this._getResultMetasFinished, callback), this._cancellable.reset();
cancellable); try {
this.proxy.GetResultMetasRemote(ids,
Lang.bind(this, this._getResultMetasFinished, callback),
this._cancellable);
} catch(e) {
log('Error calling GetResultMetas for provider %s: %s'.format(this.id, e.toString()));
callback([]);
}
}, },
activateResult: function(id) { activateResult: function(id) {
@ -288,7 +292,7 @@ const RemoteSearchProvider2 = new Lang.Class({
Extends: RemoteSearchProvider, Extends: RemoteSearchProvider,
_init: function(appInfo, dbusName, dbusPath) { _init: function(appInfo, dbusName, dbusPath) {
this.parent(appInfo, dbusName, dbusPath, SearchProvider2ProxyInfo); this.parent(appInfo, dbusName, dbusPath, SearchProvider2Proxy);
this.canLaunchSearch = true; this.canLaunchSearch = true;
}, },

View File

@ -19,7 +19,6 @@ const Background = imports.ui.background;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const Hash = imports.misc.hash; const Hash = imports.misc.hash;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const OVirt = imports.gdm.oVirt;
const LoginManager = imports.misc.loginManager; const LoginManager = imports.misc.loginManager;
const Lightbox = imports.ui.lightbox; const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -198,8 +197,8 @@ const NotificationsBox = new Lang.Class({
let body = ''; let body = '';
if (n.bannerBodyText) { if (n.bannerBodyText) {
body = n.bannerBodyMarkup ? n.bannerBodyText body = n.bannerBodyMarkup ? n.bannerBodyText :
: GLib.markup_escape_text(n.bannerBodyText, -1); GLib.markup_escape_text(n.bannerBodyMarkup, -1);
} }
let label = new St.Label({ style_class: 'screen-shield-notification-count-text' }); let label = new St.Label({ style_class: 'screen-shield-notification-count-text' });
@ -546,13 +545,6 @@ const ScreenShield = new Lang.Class({
this._liftShield(true, 0); this._liftShield(true, 0);
})); }));
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, function() {
if (this._isLocked)
this._liftShield(true, 0);
}));
this._inhibitor = null; this._inhibitor = null;
this._aboutToSuspend = false; this._aboutToSuspend = false;
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();

View File

@ -9,29 +9,27 @@ const Signals = imports.signals;
const Hash = imports.misc.hash; const Hash = imports.misc.hash;
const Main = imports.ui.main; const Main = imports.ui.main;
const ScreencastIface = '<node> \ const ScreencastIface = <interface name="org.gnome.Shell.Screencast">
<interface name="org.gnome.Shell.Screencast"> \ <method name="Screencast">
<method name="Screencast"> \ <arg type="s" direction="in" name="file_template"/>
<arg type="s" direction="in" name="file_template"/> \ <arg type="a{sv}" direction="in" name="options"/>
<arg type="a{sv}" direction="in" name="options"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ <arg type="s" direction="out" name="filename_used"/>
<arg type="s" direction="out" name="filename_used"/> \ </method>
</method> \ <method name="ScreencastArea">
<method name="ScreencastArea"> \ <arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="x"/> \ <arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="y"/> \ <arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="width"/> \ <arg type="i" direction="in" name="height"/>
<arg type="i" direction="in" name="height"/> \ <arg type="s" direction="in" name="file_template"/>
<arg type="s" direction="in" name="file_template"/> \ <arg type="a{sv}" direction="in" name="options"/>
<arg type="a{sv}" direction="in" name="options"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ <arg type="s" direction="out" name="filename_used"/>
<arg type="s" direction="out" name="filename_used"/> \ </method>
</method> \ <method name="StopScreencast">
<method name="StopScreencast"> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const ScreencastService = new Lang.Class({ const ScreencastService = new Lang.Class({
Name: 'ScreencastService', Name: 'ScreencastService',
@ -105,10 +103,8 @@ const ScreencastService = new Lang.Class({
ScreencastAsync: function(params, invocation) { ScreencastAsync: function(params, invocation) {
let returnValue = [false, '']; let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast) { if (!Main.sessionMode.allowScreencast)
invocation.return_value(GLib.Variant.new('(bs)', returnValue)); invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender); let recorder = this._ensureRecorderForSender(sender);
@ -126,10 +122,8 @@ const ScreencastService = new Lang.Class({
ScreencastAreaAsync: function(params, invocation) { ScreencastAreaAsync: function(params, invocation) {
let returnValue = [false, '']; let returnValue = [false, ''];
if (!Main.sessionMode.allowScreencast) { if (!Main.sessionMode.allowScreencast)
invocation.return_value(GLib.Variant.new('(bs)', returnValue)); invocation.return_value(GLib.Variant.new('(bs)', returnValue));
return;
}
let sender = invocation.get_sender(); let sender = invocation.get_sender();
let recorder = this._ensureRecorderForSender(sender); let recorder = this._ensureRecorderForSender(sender);
@ -137,16 +131,6 @@ const ScreencastService = new Lang.Class({
if (!recorder.is_recording()) { if (!recorder.is_recording()) {
let [x, y, width, height, fileTemplate, options] = params; let [x, y, width, height, fileTemplate, options] = params;
if (x < 0 || y < 0 ||
width <= 0 || height <= 0 ||
x + width > global.screen_width ||
y + height > global.screen_height) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");
return;
}
recorder.set_file_template(fileTemplate); recorder.set_file_template(fileTemplate);
recorder.set_area(x, y, width, height); recorder.set_area(x, y, width, height);
this._applyOptionalParameters(recorder, options); this._applyOptionalParameters(recorder, options);

View File

@ -15,47 +15,45 @@ const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const ScreenshotIface = '<node> \ const ScreenshotIface = <interface name="org.gnome.Shell.Screenshot">
<interface name="org.gnome.Shell.Screenshot"> \ <method name="ScreenshotArea">
<method name="ScreenshotArea"> \ <arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="x"/> \ <arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="y"/> \ <arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="width"/> \ <arg type="i" direction="in" name="height"/>
<arg type="i" direction="in" name="height"/> \ <arg type="b" direction="in" name="flash"/>
<arg type="b" direction="in" name="flash"/> \ <arg type="s" direction="in" name="filename"/>
<arg type="s" direction="in" name="filename"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ <arg type="s" direction="out" name="filename_used"/>
<arg type="s" direction="out" name="filename_used"/> \ </method>
</method> \ <method name="ScreenshotWindow">
<method name="ScreenshotWindow"> \ <arg type="b" direction="in" name="include_frame"/>
<arg type="b" direction="in" name="include_frame"/> \ <arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="include_cursor"/> \ <arg type="b" direction="in" name="flash"/>
<arg type="b" direction="in" name="flash"/> \ <arg type="s" direction="in" name="filename"/>
<arg type="s" direction="in" name="filename"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ <arg type="s" direction="out" name="filename_used"/>
<arg type="s" direction="out" name="filename_used"/> \ </method>
</method> \ <method name="Screenshot">
<method name="Screenshot"> \ <arg type="b" direction="in" name="include_cursor"/>
<arg type="b" direction="in" name="include_cursor"/> \ <arg type="b" direction="in" name="flash"/>
<arg type="b" direction="in" name="flash"/> \ <arg type="s" direction="in" name="filename"/>
<arg type="s" direction="in" name="filename"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ <arg type="s" direction="out" name="filename_used"/>
<arg type="s" direction="out" name="filename_used"/> \ </method>
</method> \ <method name="SelectArea">
<method name="SelectArea"> \ <arg type="i" direction="out" name="x"/>
<arg type="i" direction="out" name="x"/> \ <arg type="i" direction="out" name="y"/>
<arg type="i" direction="out" name="y"/> \ <arg type="i" direction="out" name="width"/>
<arg type="i" direction="out" name="width"/> \ <arg type="i" direction="out" name="height"/>
<arg type="i" direction="out" name="height"/> \ </method>
</method> \ <method name="FlashArea">
<method name="FlashArea"> \ <arg type="i" direction="in" name="x"/>
<arg type="i" direction="in" name="x"/> \ <arg type="i" direction="in" name="y"/>
<arg type="i" direction="in" name="y"/> \ <arg type="i" direction="in" name="width"/>
<arg type="i" direction="in" name="width"/> \ <arg type="i" direction="in" name="height"/>
<arg type="i" direction="in" name="height"/> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const ScreenshotService = new Lang.Class({ const ScreenshotService = new Lang.Class({
Name: 'ScreenshotService', Name: 'ScreenshotService',
@ -79,9 +77,7 @@ const ScreenshotService = new Lang.Class({
ScreenshotAreaAsync : function (params, invocation) { ScreenshotAreaAsync : function (params, invocation) {
let [x, y, width, height, flash, filename, callback] = params; let [x, y, width, height, flash, filename, callback] = params;
if (x < 0 || y < 0 || if (height <= 0 || width <= 0) {
width <= 0 || height <= 0 ||
x + width > global.screen_width || y + height > global.screen_height) {
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
"Invalid params"); "Invalid params");
return; return;

View File

@ -69,18 +69,16 @@ function waitLeisure() {
}; };
} }
const PerfHelperIface = '<node> \ const PerfHelperIface = <interface name="org.gnome.Shell.PerfHelper">
<interface name="org.gnome.Shell.PerfHelper"> \ <method name="CreateWindow">
<method name="CreateWindow"> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ <arg type="i" direction="in" />
<arg type="i" direction="in" /> \ <arg type="b" direction="in" />
<arg type="b" direction="in" /> \ <arg type="b" direction="in" />
<arg type="b" direction="in" /> \ </method>
</method> \ <method name="WaitWindows" />
<method name="WaitWindows" /> \ <method name="DestroyWindows" />
<method name="DestroyWindows" /> \ </interface>;
</interface> \
</node>';
var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface); var PerfHelperProxy = Gio.DBusProxy.makeProxyWrapper(PerfHelperIface);
function PerfHelper() { function PerfHelper() {

View File

@ -1,706 +1,105 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St;
const Atk = imports.gi.Atk;
const AppDisplay = imports.ui.appDisplay;
const DND = imports.ui.dnd;
const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
const RemoteSearch = imports.ui.remoteSearch;
const Separator = imports.ui.separator;
const Util = imports.misc.util;
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers'; const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const SearchSystem = new Lang.Class({ const SearchSystem = new Lang.Class({
Name: 'SearchSystem', Name: 'SearchSystem',
_init: function() { _init: function() {
this._providers = []; this._providers = [];
this._remoteProviders = [];
this._registerProvider(new AppDisplay.AppSearchProvider()); this.reset();
this._searchSettings = new Gio.Settings({ schema: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
this._reloadRemoteProviders();
this._cancellable = new Gio.Cancellable();
}, },
addProvider: function(provider) { registerProvider: function (provider) {
provider.searchSystem = this;
this._providers.push(provider); this._providers.push(provider);
this.emit('providers-changed');
if (provider.isRemoteProvider)
this._remoteProviders.push(provider);
}, },
_reloadRemoteProviders: function() { unregisterProvider: function (provider) {
let remoteProviders = this._providers.filter(function(provider) {
return provider.isRemoteProvider;
});
remoteProviders.forEach(Lang.bind(this, function(provider) {
this._unregisterProvider(provider);
}));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, function(providers) {
providers.forEach(Lang.bind(this, this._registerProvider));
}));
this.emit('providers-changed');
},
_registerProvider: function (provider) {
this._providers.push(provider);
},
_unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider); let index = this._providers.indexOf(provider);
if (index == -1)
return;
provider.searchSystem = null;
this._providers.splice(index, 1); this._providers.splice(index, 1);
let remoteIndex = this._remoteProviders.indexOf(provider);
if (remoteIndex != -1)
this._remoteProviders.splice(remoteIndex, 1);
}, },
getProviders: function() { getProviders: function() {
return this._providers; return this._providers;
}, },
getRemoteProviders: function() {
return this._remoteProviders;
},
getTerms: function() { getTerms: function() {
return this._terms; return this._previousTerms;
}, },
reset: function() { reset: function() {
this._terms = []; this._previousTerms = [];
this._results = {}; this._previousResults = [];
}, },
_gotResults: function(results, provider) { setResults: function(provider, results) {
this._results[provider.id] = results; let i = this._providers.indexOf(provider);
this.emit('search-updated', provider, results); if (i == -1)
return;
this._previousResults[i] = [provider, results];
this.emit('search-updated', this._previousResults[i]);
}, },
setTerms: function(terms) { updateSearchResults: function(terms) {
this._cancellable.cancel();
this._cancellable.reset();
let previousResults = this._results;
let previousTerms = this._terms;
this.reset();
if (!terms) if (!terms)
return; return;
let searchString = terms.join(' '); let searchString = terms.join(' ');
let previousSearchString = previousTerms.join(' '); let previousSearchString = this._previousTerms.join(' ');
if (searchString == previousSearchString) if (searchString == previousSearchString)
return; return;
let isSubSearch = false; let isSubSearch = false;
if (previousTerms.length > 0) if (this._previousTerms.length > 0)
isSubSearch = searchString.indexOf(previousSearchString) == 0; isSubSearch = searchString.indexOf(previousSearchString) == 0;
this._terms = terms; let previousResultsArr = this._previousResults;
this._providers.forEach(Lang.bind(this, function(provider) { let results = [];
let previousProviderResults = previousResults[provider.id]; this._previousTerms = terms;
if (isSubSearch && previousProviderResults) this._previousResults = results;
provider.getSubsearchResultSet(previousProviderResults, terms, Lang.bind(this, this._gotResults, provider), this._cancellable);
else if (isSubSearch) {
provider.getInitialResultSet(terms, Lang.bind(this, this._gotResults, provider), this._cancellable); for (let i = 0; i < this._providers.length; i++) {
})); let [provider, previousResults] = previousResultsArr[i];
try {
results.push([provider, []]);
provider.getSubsearchResultSet(previousResults, terms);
} catch (error) {
log('A ' + error.name + ' has occured in ' + provider.id + ': ' + error.message);
}
}
} else {
for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i];
try {
results.push([provider, []]);
provider.getInitialResultSet(terms);
} catch (error) {
log('A ' + error.name + ' has occured in ' + provider.id + ': ' + error.message);
}
}
}
} }
}); });
Signals.addSignalMethods(SearchSystem.prototype); Signals.addSignalMethods(SearchSystem.prototype);
const MaxWidthBin = new Lang.Class({
Name: 'MaxWidthBin',
Extends: St.Bin,
vfunc_allocate: function(box, flags) {
let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width();
let availWidth = box.x2 - box.x1;
let adjustedBox = box;
if (availWidth > maxWidth) {
let excessWidth = availWidth - maxWidth;
adjustedBox.x1 += Math.floor(excessWidth / 2);
adjustedBox.x2 -= Math.floor(excessWidth / 2);
}
this.parent(adjustedBox, flags);
}
});
const SearchResult = new Lang.Class({
Name: 'SearchResult',
_init: function(provider, metaInfo) {
this.provider = provider;
this.metaInfo = metaInfo;
this.actor = new St.Button({ reactive: true,
can_focus: true,
track_hover: true,
x_align: St.Align.START,
y_fill: true });
this.actor._delegate = this;
this.actor.connect('clicked', Lang.bind(this, this.activate));
},
activate: function() {
this.emit('activate', this.metaInfo.id);
},
setSelected: function(selected) {
if (selected)
this.actor.add_style_pseudo_class('selected');
else
this.actor.remove_style_pseudo_class('selected');
}
});
Signals.addSignalMethods(SearchResult.prototype);
const ListSearchResult = new Lang.Class({
Name: 'ListSearchResult',
Extends: SearchResult,
ICON_SIZE: 64,
_init: function(provider, metaInfo) {
this.parent(provider, metaInfo);
this.actor.style_class = 'list-search-result';
this.actor.x_fill = true;
let content = new St.BoxLayout({ style_class: 'list-search-result-content',
vertical: false });
this.actor.set_child(content);
// An icon for, or thumbnail of, content
let icon = this.metaInfo['createIcon'](this.ICON_SIZE);
if (icon) {
content.add(icon);
}
let details = new St.BoxLayout({ vertical: true });
content.add(details, { x_fill: true,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
let title = new St.Label({ style_class: 'list-search-result-title',
text: this.metaInfo['name'] })
details.add(title, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this.actor.label_actor = title;
if (this.metaInfo['description']) {
let description = new St.Label({ style_class: 'list-search-result-description' });
description.clutter_text.set_markup(this.metaInfo['description']);
details.add(description, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.END });
}
}
});
const GridSearchResult = new Lang.Class({
Name: 'GridSearchResult',
Extends: SearchResult,
_init: function(provider, metaInfo) {
this.parent(provider, metaInfo);
this.actor.style_class = 'grid-search-result';
let content = provider.createResultObject(metaInfo);
let dragSource = null;
if (content == null) {
let actor = new St.Bin();
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] });
actor.set_child(icon.actor);
actor.label_actor = icon.label;
dragSource = icon.icon;
content = { actor: actor, icon: icon };
} else {
if (content._delegate && content._delegate.getDragActorSource)
dragSource = content._delegate.getDragActorSource();
}
this.actor.set_child(content.actor);
this.actor.label_actor = content.actor.label_actor;
this.icon = content.icon;
let draggable = DND.makeDraggable(this.actor);
draggable.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
draggable.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledItemDrag(this);
}));
draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
}));
if (!dragSource)
// not exactly right, but alignment problems are hard to notice
dragSource = content;
this._dragActorSource = dragSource;
},
getDragActorSource: function() {
return this._dragActorSource;
},
getDragActor: function() {
return this.metaInfo['createIcon'](Main.overview.dashIconSize);
},
shellWorkspaceLaunch: function(params) {
if (this.provider.dragActivateResult)
this.provider.dragActivateResult(this.metaInfo.id, params);
else
this.provider.activateResult(this.metaInfo.id, this.terms);
}
});
const SearchResultsBase = new Lang.Class({
Name: 'SearchResultsBase',
_init: function(provider) {
this.provider = provider;
this._terms = [];
this.actor = new St.BoxLayout({ style_class: 'search-section',
vertical: true });
this._resultDisplayBin = new St.Bin({ x_fill: true,
y_fill: true });
this.actor.add(this._resultDisplayBin, { expand: true });
let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' });
this.actor.add(separator.actor);
this._resultDisplays = {};
this._cancellable = new Gio.Cancellable();
},
destroy: function() {
this.actor.destroy();
this._terms = [];
},
_clearResultDisplay: function() {
},
clear: function() {
this._resultDisplays = {};
this._clearResultDisplay();
this.actor.hide();
},
_keyFocusIn: function(actor) {
this.emit('key-focus-in', actor);
},
_activateResult: function(result, id) {
this.provider.activateResult(id, this._terms);
Main.overview.toggle();
},
_setMoreIconVisible: function(visible) {
},
_ensureResultActors: function(results, callback) {
let metasNeeded = results.filter(Lang.bind(this, function(resultId) {
return this._resultDisplays[resultId] === undefined;
}));
if (metasNeeded.length === 0) {
callback();
} else {
this._cancellable.cancel();
this._cancellable.reset();
this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) {
metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
let meta = metas[i];
let display = this._createResultDisplay(meta);
display.connect('activate', Lang.bind(this, this._activateResult));
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._resultDisplays[resultId] = display;
}));
callback();
}), this._cancellable);
}
},
updateSearch: function(providerResults, terms, callback) {
this._terms = terms;
if (providerResults.length == 0) {
this._clearResultDisplay();
this.actor.hide();
callback();
} else {
let maxResults = this._getMaxDisplayedResults();
let results = this.provider.filterResults(providerResults, maxResults);
let hasMoreResults = results.length < providerResults.length;
this._ensureResultActors(results, Lang.bind(this, function() {
this._clearResultDisplay();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this.actor.hide();
this._clearResultDisplay();
results.forEach(Lang.bind(this, function(resultId) {
this._addItem(this._resultDisplays[resultId]);
}));
this._setMoreIconVisible(hasMoreResults && this.provider.canLaunchSearch);
this.actor.show();
callback();
}));
}
}
});
const ListSearchResults = new Lang.Class({
Name: 'ListSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
this._container = new St.BoxLayout({ style_class: 'search-section-content' });
this.providerIcon = new ProviderIcon(provider);
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this.providerIcon.connect('clicked', Lang.bind(this,
function() {
provider.launchSearch(this._terms);
Main.overview.toggle();
}));
this._container.add(this.providerIcon, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this._content = new St.BoxLayout({ style_class: 'list-search-results',
vertical: true });
this._container.add(this._content, { expand: true });
this._resultDisplayBin.set_child(this._container);
},
_setMoreIconVisible: function(visible) {
this.providerIcon.moreIcon.visible = true;
},
_getMaxDisplayedResults: function() {
return MAX_LIST_SEARCH_RESULTS_ROWS;
},
_clearResultDisplay: function () {
this._content.remove_all_children();
},
_createResultDisplay: function(meta) {
return new ListSearchResult(this.provider, meta);
},
_addItem: function(display) {
this._content.add_actor(display.actor);
},
getFirstResult: function() {
if (this._content.get_n_children() > 0)
return this._content.get_child_at_index(0)._delegate;
else
return null;
}
});
Signals.addSignalMethods(ListSearchResults.prototype);
const GridSearchResults = new Lang.Class({
Name: 'GridSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
this._bin = new St.Bin({ x_align: St.Align.MIDDLE });
this._bin.set_child(this._grid.actor);
this._resultDisplayBin.set_child(this._bin);
},
_getMaxDisplayedResults: function() {
return this._grid.columnsForWidth(this._bin.width) * this._grid.getRowLimit();
},
_renderResults: function(metas) {
for (let i = 0; i < metas.length; i++) {
let display = new GridSearchResult(this.provider, metas[i]);
display.connect('activate', Lang.bind(this, this._activateResult));
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._grid.addItem(display);
}
},
_clearResultDisplay: function () {
this._grid.removeAll();
},
_createResultDisplay: function(meta) {
return new GridSearchResult(this.provider, meta);
},
_addItem: function(display) {
this._grid.addItem(display);
},
getFirstResult: function() {
if (this._grid.visibleItemsCount() > 0)
return this._grid.getItemAtIndex(0)._delegate;
else
return null;
}
});
Signals.addSignalMethods(GridSearchResults.prototype);
const SearchResults = new Lang.Class({
Name: 'SearchResults',
_init: function() {
this.actor = new St.BoxLayout({ name: 'searchResults',
vertical: true });
this._content = new St.BoxLayout({ name: 'searchResultsContent',
vertical: true });
this._contentBin = new MaxWidthBin({ name: 'searchResultsBin',
x_fill: true,
y_fill: true,
child: this._content });
let scrollChild = new St.BoxLayout();
scrollChild.add(this._contentBin, { expand: true });
this._scrollView = new St.ScrollView({ x_fill: true,
y_fill: false,
overlay_scrollbars: true,
style_class: 'search-display vfade' });
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this._scrollView.add_actor(scrollChild);
let action = new Clutter.PanAction({ interpolate: true });
action.connect('pan', Lang.bind(this, this._onPan));
this._scrollView.add_action(action);
this.actor.add(this._scrollView, { x_fill: true,
y_fill: true,
expand: true,
x_align: St.Align.START,
y_align: St.Align.START });
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._content.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText);
this._highlightDefault = false;
this._defaultResult = null;
this._searchSystem = new SearchSystem();
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this._searchSystem.connect('providers-changed', Lang.bind(this, this._updateProviderDisplays));
this._updateProviderDisplays();
},
_onPan: function(action) {
let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this._scrollView.vscroll.adjustment;
adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
return false;
},
_keyFocusIn: function(provider, actor) {
Util.ensureActorVisibleInScrollView(this._scrollView, actor);
},
_ensureProviderDisplay: function(provider) {
if (provider.display)
return;
let providerDisplay;
if (provider.appInfo)
providerDisplay = new ListSearchResults(provider);
else
providerDisplay = new GridSearchResults(provider);
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._content.add(providerDisplay.actor);
provider.display = providerDisplay;
},
_updateProviderDisplays: function() {
this._searchSystem.getProviders().forEach(Lang.bind(this, this._ensureProviderDisplay));
},
_clearDisplay: function() {
this._searchSystem.getProviders().forEach(function(provider) {
provider.display.clear();
});
},
reset: function() {
this._searchSystem.reset();
this._statusBin.hide();
this._clearDisplay();
this._defaultResult = null;
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching…"));
this._statusBin.show();
},
setTerms: function(terms) {
this._searchSystem.setTerms(terms);
},
_maybeSetInitialSelection: function() {
let newDefaultResult = null;
let providers = this._searchSystem.getProviders();
for (let i = 0; i < providers.length; i++) {
let provider = providers[i];
let display = provider.display;
if (!display.actor.visible)
continue;
let firstResult = display.getFirstResult();
if (firstResult) {
newDefaultResult = firstResult;
break; // select this one!
}
}
if (newDefaultResult != this._defaultResult) {
if (this._defaultResult)
this._defaultResult.setSelected(false);
if (newDefaultResult)
newDefaultResult.setSelected(this._highlightDefault);
this._defaultResult = newDefaultResult;
}
},
_updateStatusText: function () {
let haveResults = this._searchSystem.getProviders().some(function(provider) {
let display = provider.display;
return (display.getFirstResult() != null);
});
if (!haveResults) {
this._statusText.set_text(_("No results."));
this._statusBin.show();
} else {
this._statusBin.hide();
}
},
_updateResults: function(searchSystem, provider, results) {
let terms = searchSystem.getTerms();
let display = provider.display;
display.updateSearch(results, terms, Lang.bind(this, function() {
this._maybeSetInitialSelection();
this._updateStatusText();
}));
},
activateDefault: function() {
if (this._defaultResult)
this._defaultResult.activate();
},
highlightDefault: function(highlight) {
this._highlightDefault = highlight;
if (this._defaultResult)
this._defaultResult.setSelected(highlight);
},
navigateFocus: function(direction) {
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
if (direction == Gtk.DirectionType.TAB_BACKWARD ||
direction == (rtl ? Gtk.DirectionType.RIGHT
: Gtk.DirectionType.LEFT) ||
direction == Gtk.DirectionType.UP) {
this.actor.navigate_focus(null, direction, false);
return;
}
let from = this._defaultResult ? this._defaultResult.actor : null;
this.actor.navigate_focus(from, direction, false);
}
});
const ProviderIcon = new Lang.Class({
Name: 'ProviderIcon',
Extends: St.Button,
PROVIDER_ICON_SIZE: 48,
_init: function(provider) {
this.provider = provider;
this.parent({ style_class: 'search-provider-icon',
reactive: true,
can_focus: true,
accessible_name: provider.appInfo.get_name(),
track_hover: true });
this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this.set_child(this._content);
let rtl = (this.get_text_direction() == Clutter.TextDirection.RTL);
this.moreIcon = new St.Widget({ style_class: 'search-provider-icon-more',
visible: false,
x_align: rtl ? Clutter.ActorAlign.START : Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.END,
x_expand: true,
y_expand: true });
let icon = new St.Icon({ icon_size: this.PROVIDER_ICON_SIZE,
gicon: provider.appInfo.get_icon() });
this._content.add_actor(icon);
this._content.add_actor(this.moreIcon);
}
});

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

@ -0,0 +1,567 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
const St = imports.gi.St;
const Atk = imports.gi.Atk;
const DND = imports.ui.dnd;
const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
const Separator = imports.ui.separator;
const Search = imports.ui.search;
const Util = imports.misc.util;
const MAX_LIST_SEARCH_RESULTS_ROWS = 3;
const MAX_GRID_SEARCH_RESULTS_ROWS = 1;
const MaxWidthBin = new Lang.Class({
Name: 'MaxWidthBin',
Extends: St.Bin,
vfunc_allocate: function(box, flags) {
let themeNode = this.get_theme_node();
let maxWidth = themeNode.get_max_width();
let availWidth = box.x2 - box.x1;
let adjustedBox = box;
if (availWidth > maxWidth) {
let excessWidth = availWidth - maxWidth;
adjustedBox.x1 += Math.floor(excessWidth / 2);
adjustedBox.x2 -= Math.floor(excessWidth / 2);
}
this.parent(adjustedBox, flags);
}
});
const SearchResult = new Lang.Class({
Name: 'SearchResult',
_init: function(provider, metaInfo, terms) {
this.provider = provider;
this.metaInfo = metaInfo;
this.terms = terms;
this.actor = new St.Button({ reactive: true,
can_focus: true,
track_hover: true,
x_align: St.Align.START,
y_fill: true });
this.actor._delegate = this;
this.actor.connect('clicked', Lang.bind(this, this.activate));
},
activate: function() {
this.provider.activateResult(this.metaInfo.id, this.terms);
Main.overview.toggle();
},
setSelected: function(selected) {
if (selected)
this.actor.add_style_pseudo_class('selected');
else
this.actor.remove_style_pseudo_class('selected');
}
});
const ListSearchResult = new Lang.Class({
Name: 'ListSearchResult',
Extends: SearchResult,
ICON_SIZE: 64,
_init: function(provider, metaInfo, terms) {
this.parent(provider, metaInfo, terms);
this.actor.style_class = 'list-search-result';
this.actor.x_fill = true;
let content = new St.BoxLayout({ style_class: 'list-search-result-content',
vertical: false });
this.actor.set_child(content);
// An icon for, or thumbnail of, content
let icon = this.metaInfo['createIcon'](this.ICON_SIZE);
if (icon) {
content.add(icon);
}
let details = new St.BoxLayout({ vertical: true });
content.add(details, { x_fill: true,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.MIDDLE });
let title = new St.Label({ style_class: 'list-search-result-title',
text: this.metaInfo['name'] })
details.add(title, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this.actor.label_actor = title;
if (this.metaInfo['description']) {
let description = new St.Label({ style_class: 'list-search-result-description' });
description.clutter_text.set_markup(this.metaInfo['description']);
details.add(description, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.END });
}
}
});
const GridSearchResult = new Lang.Class({
Name: 'GridSearchResult',
Extends: SearchResult,
_init: function(provider, metaInfo, terms) {
this.parent(provider, metaInfo, terms);
this.actor.style_class = 'grid-search-result';
let content = provider.createResultObject(metaInfo, terms);
let dragSource = null;
if (content == null) {
let actor = new St.Bin();
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
{ createIcon: this.metaInfo['createIcon'] });
actor.set_child(icon.actor);
actor.label_actor = icon.label;
dragSource = icon.icon;
content = { actor: actor, icon: icon };
} else {
if (content._delegate && content._delegate.getDragActorSource)
dragSource = content._delegate.getDragActorSource();
}
this.actor.set_child(content.actor);
this.actor.label_actor = content.actor.label_actor;
this.icon = content.icon;
let draggable = DND.makeDraggable(this.actor);
draggable.connect('drag-begin',
Lang.bind(this, function() {
Main.overview.beginItemDrag(this);
}));
draggable.connect('drag-cancelled',
Lang.bind(this, function() {
Main.overview.cancelledItemDrag(this);
}));
draggable.connect('drag-end',
Lang.bind(this, function() {
Main.overview.endItemDrag(this);
}));
if (!dragSource)
// not exactly right, but alignment problems are hard to notice
dragSource = content;
this._dragActorSource = dragSource;
},
getDragActorSource: function() {
return this._dragActorSource;
},
getDragActor: function() {
return this.metaInfo['createIcon'](Main.overview.dashIconSize);
},
shellWorkspaceLaunch: function(params) {
if (this.provider.dragActivateResult)
this.provider.dragActivateResult(this.metaInfo.id, params);
else
this.provider.activateResult(this.metaInfo.id, this.terms);
}
});
const SearchResultsBase = new Lang.Class({
Name: 'SearchResultsBase',
_init: function(provider) {
this.provider = provider;
this._terms = [];
this.actor = new St.BoxLayout({ style_class: 'search-section',
vertical: true });
this._resultDisplayBin = new St.Bin({ x_fill: true,
y_fill: true });
this.actor.add(this._resultDisplayBin, { expand: true });
let separator = new Separator.HorizontalSeparator({ style_class: 'search-section-separator' });
this.actor.add(separator.actor);
},
destroy: function() {
this.actor.destroy();
this._terms = [];
},
_clearResultDisplay: function() {
},
clear: function() {
this._clearResultDisplay();
this.actor.hide();
},
_keyFocusIn: function(actor) {
this.emit('key-focus-in', actor);
},
_setMoreIconVisible: function(visible) {
},
updateSearch: function(providerResults, terms, callback) {
this._terms = terms;
if (providerResults.length == 0) {
this._clearResultDisplay();
this.actor.hide();
callback();
} else {
let maxResults = this._getMaxDisplayedResults();
let results = providerResults.slice(0, maxResults);
let hasMoreResults = results.length < providerResults.length;
this.provider.getResultMetas(results, Lang.bind(this, function(metas) {
this.clear();
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
// content while filling in the results.
this.actor.hide();
this._clearResultDisplay();
this._renderResults(metas);
this._setMoreIconVisible(hasMoreResults && this.provider.canLaunchSearch);
this.actor.show();
callback();
}));
}
}
});
const ListSearchResults = new Lang.Class({
Name: 'ListSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
this._container = new St.BoxLayout({ style_class: 'search-section-content' });
this.providerIcon = new ProviderIcon(provider);
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this.providerIcon.connect('clicked', Lang.bind(this,
function() {
provider.launchSearch(this._terms);
Main.overview.toggle();
}));
this._container.add(this.providerIcon, { x_fill: false,
y_fill: false,
x_align: St.Align.START,
y_align: St.Align.START });
this._content = new St.BoxLayout({ style_class: 'list-search-results',
vertical: true });
this._container.add(this._content, { expand: true });
this._resultDisplayBin.set_child(this._container);
},
_setMoreIconVisible: function(visible) {
this.providerIcon.moreIcon.visible = true;
},
_getMaxDisplayedResults: function() {
return MAX_LIST_SEARCH_RESULTS_ROWS;
},
_renderResults: function(metas) {
for (let i = 0; i < metas.length; i++) {
let display = new ListSearchResult(this.provider, metas[i], this._terms);
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._content.add_actor(display.actor);
}
},
_clearResultDisplay: function () {
this._content.destroy_all_children();
},
getFirstResult: function() {
if (this._content.get_n_children() > 0)
return this._content.get_child_at_index(0)._delegate;
else
return null;
}
});
Signals.addSignalMethods(ListSearchResults.prototype);
const GridSearchResults = new Lang.Class({
Name: 'GridSearchResults',
Extends: SearchResultsBase,
_init: function(provider) {
this.parent(provider);
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
xAlign: St.Align.START });
this._bin = new St.Bin({ x_align: St.Align.MIDDLE });
this._bin.set_child(this._grid.actor);
this._resultDisplayBin.set_child(this._bin);
},
_getMaxDisplayedResults: function() {
return this._grid.columnsForWidth(this._bin.width) * this._grid.getRowLimit();
},
_renderResults: function(metas) {
for (let i = 0; i < metas.length; i++) {
let display = new GridSearchResult(this.provider, metas[i], this._terms);
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._grid.addItem(display);
}
},
_clearResultDisplay: function () {
this._grid.removeAll();
},
getFirstResult: function() {
if (this._grid.visibleItemsCount() > 0)
return this._grid.getItemAtIndex(0)._delegate;
else
return null;
}
});
Signals.addSignalMethods(GridSearchResults.prototype);
const SearchResults = new Lang.Class({
Name: 'SearchResults',
_init: function(searchSystem) {
this._searchSystem = searchSystem;
this._searchSystem.connect('search-updated', Lang.bind(this, this._updateResults));
this.actor = new St.BoxLayout({ name: 'searchResults',
vertical: true });
this._content = new St.BoxLayout({ name: 'searchResultsContent',
vertical: true });
this._contentBin = new MaxWidthBin({ name: 'searchResultsBin',
x_fill: true,
y_fill: true,
child: this._content });
let scrollChild = new St.BoxLayout();
scrollChild.add(this._contentBin, { expand: true });
this._scrollView = new St.ScrollView({ x_fill: true,
y_fill: false,
overlay_scrollbars: true,
style_class: 'search-display vfade' });
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
this._scrollView.add_actor(scrollChild);
let action = new Clutter.PanAction({ interpolate: true });
action.connect('pan', Lang.bind(this, this._onPan));
this._scrollView.add_action(action);
this.actor.add(this._scrollView, { x_fill: true,
y_fill: true,
expand: true,
x_align: St.Align.START,
y_align: St.Align.START });
this._statusText = new St.Label({ style_class: 'search-statustext' });
this._statusBin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._content.add(this._statusBin, { expand: true });
this._statusBin.add_actor(this._statusText);
this._providers = this._searchSystem.getProviders();
this._providerDisplays = {};
for (let i = 0; i < this._providers.length; i++) {
this.createProviderDisplay(this._providers[i]);
}
this._highlightDefault = false;
this._defaultResult = null;
},
_onPan: function(action) {
let [dist, dx, dy] = action.get_motion_delta(0);
let adjustment = this._scrollView.vscroll.adjustment;
adjustment.value -= (dy / this.actor.height) * adjustment.page_size;
return false;
},
_keyFocusIn: function(provider, actor) {
Util.ensureActorVisibleInScrollView(this._scrollView, actor);
},
createProviderDisplay: function(provider) {
let providerDisplay = null;
if (provider.appInfo) {
providerDisplay = new ListSearchResults(provider);
} else {
providerDisplay = new GridSearchResults(provider);
}
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._providerDisplays[provider.id] = providerDisplay;
this._content.add(providerDisplay.actor);
},
destroyProviderDisplay: function(provider) {
this._providerDisplays[provider.id].destroy();
delete this._providerDisplays[provider.id];
},
_clearDisplay: function() {
for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i];
let providerDisplay = this._providerDisplays[provider.id];
providerDisplay.clear();
}
},
reset: function() {
this._searchSystem.reset();
this._statusBin.hide();
this._clearDisplay();
this._defaultResult = null;
},
startingSearch: function() {
this.reset();
this._statusText.set_text(_("Searching…"));
this._statusBin.show();
},
_maybeSetInitialSelection: function() {
let newDefaultResult = null;
for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i];
let display = this._providerDisplays[provider.id];
if (!display.actor.visible)
continue;
let firstResult = display.getFirstResult();
if (firstResult) {
newDefaultResult = firstResult;
break; // select this one!
}
}
if (newDefaultResult != this._defaultResult) {
if (this._defaultResult)
this._defaultResult.setSelected(false);
if (newDefaultResult)
newDefaultResult.setSelected(this._highlightDefault);
this._defaultResult = newDefaultResult;
}
},
_updateStatusText: function () {
let haveResults = false;
for (let i = 0; i < this._providers.length; i++) {
let provider = this._providers[i];
let display = this._providerDisplays[provider.id];
if (display.getFirstResult()) {
haveResults = true;
break;
}
}
if (!haveResults) {
this._statusText.set_text(_("No results."));
this._statusBin.show();
} else {
this._statusBin.hide();
}
},
_updateResults: function(searchSystem, results) {
let terms = searchSystem.getTerms();
let [provider, providerResults] = results;
let display = this._providerDisplays[provider.id];
display.updateSearch(providerResults, terms, Lang.bind(this, function() {
this._maybeSetInitialSelection();
this._updateStatusText();
}));
},
activateDefault: function() {
if (this._defaultResult)
this._defaultResult.activate();
},
highlightDefault: function(highlight) {
this._highlightDefault = highlight;
if (this._defaultResult)
this._defaultResult.setSelected(highlight);
},
navigateFocus: function(direction) {
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
if (direction == Gtk.DirectionType.TAB_BACKWARD ||
direction == (rtl ? Gtk.DirectionType.RIGHT
: Gtk.DirectionType.LEFT) ||
direction == Gtk.DirectionType.UP) {
this.actor.navigate_focus(null, direction, false);
return;
}
let from = this._defaultResult ? this._defaultResult.actor : null;
this.actor.navigate_focus(from, direction, false);
}
});
const ProviderIcon = new Lang.Class({
Name: 'ProviderIcon',
Extends: St.Button,
PROVIDER_ICON_SIZE: 48,
_init: function(provider) {
this.provider = provider;
this.parent({ style_class: 'search-provider-icon',
reactive: true,
can_focus: true,
accessible_name: provider.appInfo.get_name(),
track_hover: true });
this._content = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this.set_child(this._content);
let rtl = (this.get_text_direction() == Clutter.TextDirection.RTL);
this.moreIcon = new St.Widget({ style_class: 'search-provider-icon-more',
visible: false,
x_align: rtl ? Clutter.ActorAlign.START : Clutter.ActorAlign.END,
y_align: Clutter.ActorAlign.END,
x_expand: true,
y_expand: true });
let icon = new St.Icon({ icon_size: this.PROVIDER_ICON_SIZE,
gicon: provider.appInfo.get_icon() });
this._content.add_actor(icon);
this._content.add_actor(this.moreIcon);
}
});

View File

@ -102,12 +102,19 @@ const _modes = {
} }
}; };
function _loadMode(file, info) { function _getModes(modesLoadedCallback) {
FileUtils.collectFromDatadirsAsync('modes',
{ processFile: _loadMode,
loadedCallback: modesLoadedCallback,
data: _modes });
}
function _loadMode(file, info, loadedData) {
let name = info.get_name(); let name = info.get_name();
let suffix = name.indexOf('.json'); let suffix = name.indexOf('.json');
let modeName = suffix == -1 ? name : name.slice(name, suffix); let modeName = suffix == -1 ? name : name.slice(name, suffix);
if (_modes.hasOwnProperty(modeName)) if (loadedData.hasOwnProperty(modeName))
return; return;
let fileContent, success, tag, newMode; let fileContent, success, tag, newMode;
@ -118,23 +125,18 @@ function _loadMode(file, info) {
return; return;
} }
_modes[modeName] = {}; loadedData[modeName] = {};
let propBlacklist = ['unlockDialog']; let propBlacklist = ['unlockDialog'];
for (let prop in loadedData[DEFAULT_MODE]) { for (let prop in loadedData[DEFAULT_MODE]) {
if (newMode[prop] !== undefined && if (newMode[prop] !== undefined &&
propBlacklist.indexOf(prop) == -1) propBlacklist.indexOf(prop) == -1)
loadedData[modeName][prop] = newMode[prop]; loadedData[modeName][prop]= newMode[prop];
} }
_modes[modeName]['isPrimary'] = true; loadedData[modeName]['isPrimary'] = true;
}
function _getModes() {
FileUtils.collectFromDatadirs('modes', false, _loadMode);
} }
function listModes() { function listModes() {
let modes = _getModes(); _getModes(function(modes) {
modes.forEach(function() {
let names = Object.getOwnPropertyNames(modes); let names = Object.getOwnPropertyNames(modes);
for (let i = 0; i < names.length; i++) for (let i = 0; i < names.length; i++)
if (_modes[names[i]].isPrimary) if (_modes[names[i]].isPrimary)
@ -147,12 +149,17 @@ function listModes() {
const SessionMode = new Lang.Class({ const SessionMode = new Lang.Class({
Name: 'SessionMode', Name: 'SessionMode',
_init: function() { init: function() {
let isPrimary = (_modes[global.session_mode] && _getModes(Lang.bind(this, function(modes) {
_modes[global.session_mode].isPrimary); this._modes = modes;
let mode = isPrimary ? global.session_mode : 'user'; let primary = modes[global.session_mode] &&
this._modeStack = [mode]; modes[global.session_mode].isPrimary;
this._sync(); let mode = primary ? global.session_mode : 'user';
this._modeStack = [mode];
this._sync();
this.emit('sessions-loaded');
}));
}, },
pushMode: function(mode) { pushMode: function(mode) {
@ -179,13 +186,13 @@ const SessionMode = new Lang.Class({
}, },
_sync: function() { _sync: function() {
let params = _modes[this.currentMode]; let params = this._modes[this.currentMode];
let defaults; let defaults;
if (params.parentMode) if (params.parentMode)
defaults = Params.parse(_modes[params.parentMode], defaults = Params.parse(this._modes[params.parentMode],
_modes[DEFAULT_MODE]); this._modes[DEFAULT_MODE]);
else else
defaults = _modes[DEFAULT_MODE]; defaults = this._modes[DEFAULT_MODE];
params = Params.parse(params, defaults); params = Params.parse(params, defaults);
// A simplified version of Lang.copyProperties, handles // A simplified version of Lang.copyProperties, handles

View File

@ -15,63 +15,59 @@ const Main = imports.ui.main;
const Screenshot = imports.ui.screenshot; const Screenshot = imports.ui.screenshot;
const ViewSelector = imports.ui.viewSelector; const ViewSelector = imports.ui.viewSelector;
const GnomeShellIface = '<node> \ const GnomeShellIface = <interface name="org.gnome.Shell">
<interface name="org.gnome.Shell"> \ <method name="Eval">
<method name="Eval"> \ <arg type="s" direction="in" name="script" />
<arg type="s" direction="in" name="script" /> \ <arg type="b" direction="out" name="success" />
<arg type="b" direction="out" name="success" /> \ <arg type="s" direction="out" name="result" />
<arg type="s" direction="out" name="result" /> \ </method>
</method> \ <method name="FocusSearch"/>
<method name="FocusSearch"/> \ <method name="ShowOSD">
<method name="ShowOSD"> \ <arg type="a{sv}" direction="in" name="params"/>
<arg type="a{sv}" direction="in" name="params"/> \ </method>
</method> \ <method name="FocusApp">
<method name="FocusApp"> \ <arg type="s" direction="in" name="id"/>
<arg type="s" direction="in" name="id"/> \ </method>
</method> \ <method name="ShowApplications" />
<method name="ShowApplications" /> \ <method name="GrabAccelerator">
<method name="GrabAccelerator"> \ <arg type="s" direction="in" name="accelerator"/>
<arg type="s" direction="in" name="accelerator"/> \ <arg type="u" direction="in" name="flags"/>
<arg type="u" direction="in" name="flags"/> \ <arg type="u" direction="out" name="action"/>
<arg type="u" direction="out" name="action"/> \ </method>
</method> \ <method name="GrabAccelerators">
<method name="GrabAccelerators"> \ <arg type="a(su)" direction="in" name="accelerators"/>
<arg type="a(su)" direction="in" name="accelerators"/> \ <arg type="au" direction="out" name="actions"/>
<arg type="au" direction="out" name="actions"/> \ </method>
</method> \ <method name="UngrabAccelerator">
<method name="UngrabAccelerator"> \ <arg type="u" direction="in" name="action"/>
<arg type="u" direction="in" name="action"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ </method>
</method> \ <signal name="AcceleratorActivated">
<signal name="AcceleratorActivated"> \ <arg name="action" type="u" />
<arg name="action" type="u" /> \ <arg name="deviceid" type="u" />
<arg name="deviceid" type="u" /> \ <arg name="timestamp" type="u" />
<arg name="timestamp" type="u" /> \ </signal>
</signal> \ <property name="Mode" type="s" access="read" />
<property name="Mode" type="s" access="read" /> \ <property name="OverviewActive" type="b" access="readwrite" />
<property name="OverviewActive" type="b" access="readwrite" /> \ <property name="ShellVersion" type="s" access="read" />
<property name="ShellVersion" type="s" access="read" /> \ </interface>;
</interface> \
</node>';
const ScreenSaverIface = '<node> \ const ScreenSaverIface = <interface name="org.gnome.ScreenSaver">
<interface name="org.gnome.ScreenSaver"> \ <method name="Lock">
<method name="Lock"> \ </method>
</method> \ <method name="GetActive">
<method name="GetActive"> \ <arg name="active" direction="out" type="b" />
<arg name="active" direction="out" type="b" /> \ </method>
</method> \ <method name="SetActive">
<method name="SetActive"> \ <arg name="value" direction="in" type="b" />
<arg name="value" direction="in" type="b" /> \ </method>
</method> \ <method name="GetActiveTime">
<method name="GetActiveTime"> \ <arg name="value" direction="out" type="u" />
<arg name="value" direction="out" type="u" /> \ </method>
</method> \ <signal name="ActiveChanged">
<signal name="ActiveChanged"> \ <arg name="new_value" type="b" />
<arg name="new_value" type="b" /> \ </signal>
</signal> \ </interface>;
</interface> \
</node>';
const GnomeShell = new Lang.Class({ const GnomeShell = new Lang.Class({
Name: 'GnomeShellDBus', Name: 'GnomeShellDBus',
@ -119,7 +115,7 @@ const GnomeShell = new Lang.Class({
returnValue = ''; returnValue = '';
success = true; success = true;
} catch (e) { } catch (e) {
returnValue = '' + e; returnValue = JSON.stringify(e);
success = false; success = false;
} }
return [success, returnValue]; return [success, returnValue];
@ -250,43 +246,41 @@ const GnomeShell = new Lang.Class({
ShellVersion: Config.PACKAGE_VERSION ShellVersion: Config.PACKAGE_VERSION
}); });
const GnomeShellExtensionsIface = '<node> \ const GnomeShellExtensionsIface = <interface name="org.gnome.Shell.Extensions">
<interface name="org.gnome.Shell.Extensions"> \ <method name="ListExtensions">
<method name="ListExtensions"> \ <arg type="a{sa{sv}}" direction="out" name="extensions" />
<arg type="a{sa{sv}}" direction="out" name="extensions" /> \ </method>
</method> \ <method name="GetExtensionInfo">
<method name="GetExtensionInfo"> \ <arg type="s" direction="in" name="extension" />
<arg type="s" direction="in" name="extension" /> \ <arg type="a{sv}" direction="out" name="info" />
<arg type="a{sv}" direction="out" name="info" /> \ </method>
</method> \ <method name="GetExtensionErrors">
<method name="GetExtensionErrors"> \ <arg type="s" direction="in" name="extension" />
<arg type="s" direction="in" name="extension" /> \ <arg type="as" direction="out" name="errors" />
<arg type="as" direction="out" name="errors" /> \ </method>
</method> \ <signal name="ExtensionStatusChanged">
<signal name="ExtensionStatusChanged"> \ <arg type="s" name="uuid"/>
<arg type="s" name="uuid"/> \ <arg type="i" name="state"/>
<arg type="i" name="state"/> \ <arg type="s" name="error"/>
<arg type="s" name="error"/> \ </signal>
</signal> \ <method name="InstallRemoteExtension">
<method name="InstallRemoteExtension"> \ <arg type="s" direction="in" name="uuid"/>
<arg type="s" direction="in" name="uuid"/> \ <arg type="s" direction="out" name="result"/>
<arg type="s" direction="out" name="result"/> \ </method>
</method> \ <method name="UninstallExtension">
<method name="UninstallExtension"> \ <arg type="s" direction="in" name="uuid"/>
<arg type="s" direction="in" name="uuid"/> \ <arg type="b" direction="out" name="success"/>
<arg type="b" direction="out" name="success"/> \ </method>
</method> \ <method name="LaunchExtensionPrefs">
<method name="LaunchExtensionPrefs"> \ <arg type="s" direction="in" name="uuid"/>
<arg type="s" direction="in" name="uuid"/> \ </method>
</method> \ <method name="ReloadExtension">
<method name="ReloadExtension"> \ <arg type="s" direction="in" name="uuid"/>
<arg type="s" direction="in" name="uuid"/> \ </method>
</method> \ <method name="CheckForUpdates">
<method name="CheckForUpdates"> \ </method>
</method> \ <property name="ShellVersion" type="s" access="read" />
<property name="ShellVersion" type="s" access="read" /> \ </interface>;
</interface> \
</node>';
const GnomeShellExtensions = new Lang.Class({ const GnomeShellExtensions = new Lang.Class({
Name: 'GnomeShellExtensionsDBus', Name: 'GnomeShellExtensionsDBus',

View File

@ -521,38 +521,36 @@ const ShellProcessesDialog = new Lang.Class({
}); });
Signals.addSignalMethods(ShellProcessesDialog.prototype); Signals.addSignalMethods(ShellProcessesDialog.prototype);
const GnomeShellMountOpIface = '<node> \ const GnomeShellMountOpIface = <interface name="org.Gtk.MountOperationHandler">
<interface name="org.Gtk.MountOperationHandler"> \ <method name="AskPassword">
<method name="AskPassword"> \ <arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="object_id"/> \ <arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="message"/> \ <arg type="s" direction="in" name="icon_name"/>
<arg type="s" direction="in" name="icon_name"/> \ <arg type="s" direction="in" name="default_user"/>
<arg type="s" direction="in" name="default_user"/> \ <arg type="s" direction="in" name="default_domain"/>
<arg type="s" direction="in" name="default_domain"/> \ <arg type="u" direction="in" name="flags"/>
<arg type="u" direction="in" name="flags"/> \ <arg type="u" direction="out" name="response"/>
<arg type="u" direction="out" name="response"/> \ <arg type="a{sv}" direction="out" name="response_details"/>
<arg type="a{sv}" direction="out" name="response_details"/> \ </method>
</method> \ <method name="AskQuestion">
<method name="AskQuestion"> \ <arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="object_id"/> \ <arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="message"/> \ <arg type="s" direction="in" name="icon_name"/>
<arg type="s" direction="in" name="icon_name"/> \ <arg type="as" direction="in" name="choices"/>
<arg type="as" direction="in" name="choices"/> \ <arg type="u" direction="out" name="response"/>
<arg type="u" direction="out" name="response"/> \ <arg type="a{sv}" direction="out" name="response_details"/>
<arg type="a{sv}" direction="out" name="response_details"/> \ </method>
</method> \ <method name="ShowProcesses">
<method name="ShowProcesses"> \ <arg type="s" direction="in" name="object_id"/>
<arg type="s" direction="in" name="object_id"/> \ <arg type="s" direction="in" name="message"/>
<arg type="s" direction="in" name="message"/> \ <arg type="s" direction="in" name="icon_name"/>
<arg type="s" direction="in" name="icon_name"/> \ <arg type="ai" direction="in" name="application_pids"/>
<arg type="ai" direction="in" name="application_pids"/> \ <arg type="as" direction="in" name="choices"/>
<arg type="as" direction="in" name="choices"/> \ <arg type="u" direction="out" name="response"/>
<arg type="u" direction="out" name="response"/> \ <arg type="a{sv}" direction="out" name="response_details"/>
<arg type="a{sv}" direction="out" name="response_details"/> \ </method>
</method> \ <method name="Close"/>
<method name="Close"/> \ </interface>;
</interface> \
</node>';
const ShellMountOperationType = { const ShellMountOperationType = {
NONE: 0, NONE: 0,

View File

@ -43,7 +43,9 @@ const ATIndicator = new Lang.Class({
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon', this._hbox.add_child(new St.Icon({ style_class: 'system-status-icon',
icon_name: 'preferences-desktop-accessibility-symbolic' })); icon_name: 'preferences-desktop-accessibility-symbolic' }));
this._hbox.add_child(PopupMenu.unicodeArrow(St.Side.BOTTOM)); this._hbox.add_child(new St.Label({ text: '\u25BE',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER }));
this.actor.add_child(this._hbox); this.actor.add_child(this._hbox);

View File

@ -9,6 +9,7 @@ const St = imports.gi.St;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
@ -54,13 +55,13 @@ const Indicator = new Lang.Class({
this._item.actor.visible = on; this._item.actor.visible = on;
if (on) if (on)
this._item.status.text = ngettext("%d Connected Device", "%d Connected Devices", nDevices).format(nDevices); this._item.status.text = ngettext("%d Connected Device", "%d Connected Devices").format(nDevices);
}, },
_ensureSource: function() { _ensureSource: function() {
if (!this._source) { if (!this._source) {
this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active'); this._source = new MessageTray.Source(_("Bluetooth"), 'bluetooth-active');
this._source.policy = new MessageTray.NotificationApplicationPolicy('gnome-bluetooth-panel'); this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-bluetooth-panel');
Main.messageTray.add(this._source); Main.messageTray.add(this._source);
} }
}, },
@ -105,8 +106,8 @@ const AuthNotification = new Lang.Class({
this._devicePath = device_path; this._devicePath = device_path;
this.addBody(_("Device %s wants to pair with this computer").format(long_name)); this.addBody(_("Device %s wants to pair with this computer").format(long_name));
this.addAction('allow', _("Allow")); this.addButton('allow', _("Allow"));
this.addAction('deny', _("Deny")); this.addButton('deny', _("Deny"));
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'allow') if (action == 'allow')
@ -133,9 +134,9 @@ const AuthServiceNotification = new Lang.Class({
this._devicePath = device_path; this._devicePath = device_path;
this.addBody(_("Device %s wants access to the service '%s'").format(long_name, uuid)); this.addBody(_("Device %s wants access to the service '%s'").format(long_name, uuid));
this.addAction('always-grant', _("Always grant access")); this.addButton('always-grant', _("Always grant access"));
this.addAction('grant', _("Grant this time only")); this.addButton('grant', _("Grant this time only"));
this.addAction('reject', _("Reject")); this.addButton('reject', _("Reject"));
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
switch (action) { switch (action) {
@ -172,8 +173,8 @@ const ConfirmNotification = new Lang.Class({
this.addBody(_("Please confirm whether the Passkey '%06d' matches the one on the device.").format(pin)); this.addBody(_("Please confirm whether the Passkey '%06d' matches the one on the device.").format(pin));
/* Translators: this is the verb, not the noun */ /* Translators: this is the verb, not the noun */
this.addAction('matches', _("Matches")); this.addButton('matches', _("Matches"));
this.addAction('does-not-match', _("Does not match")); this.addButton('does-not-match', _("Does not match"));
this.connect('action-invoked', Lang.bind(this, function(self, action) { this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (action == 'matches') if (action == 'matches')
@ -207,46 +208,45 @@ const PinNotification = new Lang.Class({
let key = event.get_key_symbol(); let key = event.get_key_symbol();
if (key == Clutter.KEY_Return) { if (key == Clutter.KEY_Return) {
if (this._canActivateOkButton()) if (this._canActivateOkButton())
this._ok(); this.emit('action-invoked', 'ok');
return true; return true;
} else if (key == Clutter.KEY_Escape) { } else if (key == Clutter.KEY_Escape) {
this._cancel(); this.emit('action-invoked', 'cancel');
return true; return true;
} }
return false; return false;
})); }));
this.addActor(this._entry); this.addActor(this._entry);
let okButton = this.addAction(_("OK"), Lang.bind(this, this._ok)); this.addButton('ok', _("OK"));
this.addAction(_("Cancel"), Lang.bind(this, this._cancel)); this.addButton('cancel', _("Cancel"));
okButton.reactive = this._canActivateOkButton(); this.setButtonSensitive('ok', this._canActivateOkButton());
this._entry.clutter_text.connect('text-changed', Lang.bind(this, function() { this._entry.clutter_text.connect('text-changed', Lang.bind(this,
okButton.reactive = this._canActivateOkButton(); function() {
})); this.setButtonSensitive('ok', this._canActivateOkButton());
}, }));
_ok: function() { this.connect('action-invoked', Lang.bind(this, function(self, action) {
if (this._numeric) { if (action == 'ok') {
let num = parseInt(this._entry.text, 10); if (this._numeric) {
if (isNaN(num)) { let num = parseInt(this._entry.text);
// user reply was empty, or was invalid if (isNaN(num)) {
// cancel the operation // user reply was empty, or was invalid
num = -1; // cancel the operation
num = -1;
}
this._applet.agent_reply_passkey(this._devicePath, num);
} else
this._applet.agent_reply_pincode(this._devicePath, this._entry.text);
} else {
if (this._numeric)
this._applet.agent_reply_passkey(this._devicePath, -1);
else
this._applet.agent_reply_pincode(this._devicePath, null);
} }
this._applet.agent_reply_passkey(this._devicePath, num); this.destroy();
} else { }));
this._applet.agent_reply_pincode(this._devicePath, this._entry.text);
}
this.destroy();
},
_cancel: function() {
if (this._numeric)
this._applet.agent_reply_passkey(this._devicePath, -1);
else
this._applet.agent_reply_pincode(this._devicePath, null);
this.destroy();
}, },
_canActivateOkButton: function() { _canActivateOkButton: function() {

View File

@ -11,11 +11,9 @@ const Slider = imports.ui.slider;
const BUS_NAME = 'org.gnome.SettingsDaemon.Power'; const BUS_NAME = 'org.gnome.SettingsDaemon.Power';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
const BrightnessInterface = '<node> \ const BrightnessInterface = <interface name="org.gnome.SettingsDaemon.Power.Screen">
<interface name="org.gnome.SettingsDaemon.Power.Screen"> \ <property name='Brightness' type='i' access='readwrite'/>
<property name="Brightness" type="i" access="readwrite"/> \ </interface>;
</interface> \
</node>';
const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface); const BrightnessProxy = Gio.DBusProxy.makeProxyWrapper(BrightnessInterface);

View File

@ -41,13 +41,11 @@ const MAX_INPUT_SOURCE_ACTIVATION_TIME = 4000; // ms
const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard'; const BUS_NAME = 'org.gnome.SettingsDaemon.Keyboard';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Keyboard';
const KeyboardManagerInterface = '<node> \ const KeyboardManagerInterface = <interface name="org.gnome.SettingsDaemon.Keyboard">
<interface name="org.gnome.SettingsDaemon.Keyboard"> \ <method name="SetInputSource">
<method name="SetInputSource"> \ <arg type="u" direction="in" />
<arg type="u" direction="in" /> \ </method>
</method> \ </interface>;
</interface> \
</node>';
const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface); const KeyboardManagerProxy = Gio.DBusProxy.makeProxyWrapper(KeyboardManagerInterface);
@ -341,7 +339,9 @@ const InputSourceIndicator = new Lang.Class({
this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' }); this._hbox = new St.BoxLayout({ style_class: 'panel-status-menu-box' });
this._hbox.add_child(this._container); this._hbox.add_child(this._container);
this._hbox.add_child(PopupMenu.unicodeArrow(St.Side.BOTTOM)); this._hbox.add_child(new St.Label({ text: '\u25BE',
y_expand: true,
y_align: Clutter.ActorAlign.CENTER }));
this.actor.add_child(this._hbox); this.actor.add_child(this._hbox);
this.actor.add_style_class_name('panel-status-button'); this.actor.add_style_class_name('panel-status-button');

View File

@ -16,6 +16,7 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const NotificationDaemon = imports.ui.notificationDaemon;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const ModemManager = imports.misc.modemManager; const ModemManager = imports.misc.modemManager;
const Util = imports.misc.util; const Util = imports.misc.util;
@ -72,27 +73,6 @@ function ssidToLabel(ssid) {
return label; return label;
} }
function ensureActiveConnectionProps(active, settings) {
if (!active._connection) {
active._connection = settings.get_connection_by_path(active.connection);
// This list is guaranteed to have only one device in it.
let device = active.get_devices()[0]._delegate;
active._primaryDevice = device;
}
}
function createSettingsAction(label, device) {
let item = new PopupMenu.PopupMenuItem(label);
item.connect('activate', function() {
Util.spawnApp(['gnome-control-center', 'network', 'show-device',
device.get_path()]);
});
return item;
}
const NMConnectionItem = new Lang.Class({ const NMConnectionItem = new Lang.Class({
Name: 'NMConnectionItem', Name: 'NMConnectionItem',
@ -190,7 +170,8 @@ const NMConnectionSection = new Lang.Class({
}, },
destroy: function() { destroy: function() {
this.item.destroy(); this.statusItem.destroy();
this.section.destroy();
}, },
_sync: function() { _sync: function() {
@ -287,12 +268,12 @@ const NMConnectionDevice = new Lang.Class({
Extends: NMConnectionSection, Extends: NMConnectionSection,
Abstract: true, Abstract: true,
_init: function(client, device, settings) { _init: function(client, device) {
this.parent(client); this.parent(client);
this._device = device; this._device = device;
this._settings = settings;
this._autoConnectItem = this.item.menu.addAction(_("Connect"), Lang.bind(this, this._autoConnect)); this._autoConnectItem = this.item.menu.addAction(_("Connect"), Lang.bind(this, this._autoConnect));
this.item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged)); this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
this._activeConnectionChangedId = this._device.connect('notify::active-connection', Lang.bind(this, this._activeConnectionChanged)); this._activeConnectionChangedId = this._device.connect('notify::active-connection', Lang.bind(this, this._activeConnectionChanged));
@ -320,7 +301,6 @@ const NMConnectionDevice = new Lang.Class({
this._activeConnection = this._device.active_connection; this._activeConnection = this._device.active_connection;
if (this._activeConnection) { if (this._activeConnection) {
ensureActiveConnectionProps(this._activeConnection, this._settings);
let item = this._connectionItems.get(this._activeConnection._connection.get_uuid()); let item = this._connectionItems.get(this._activeConnection._connection.get_uuid());
item.setActiveConnection(this._activeConnection); item.setActiveConnection(this._activeConnection);
} }
@ -376,9 +356,8 @@ const NMConnectionDevice = new Lang.Class({
switch(this._device.state) { switch(this._device.state) {
case NetworkManager.DeviceState.DISCONNECTED: case NetworkManager.DeviceState.DISCONNECTED:
return _("Off");
case NetworkManager.DeviceState.ACTIVATED: case NetworkManager.DeviceState.ACTIVATED:
return this.parent(); return '';
case NetworkManager.DeviceState.UNMANAGED: case NetworkManager.DeviceState.UNMANAGED:
/* Translators: this is for network devices that are physically present but are not /* Translators: this is for network devices that are physically present but are not
under NetworkManager's control (and thus cannot be used in the menu) */ under NetworkManager's control (and thus cannot be used in the menu) */
@ -420,11 +399,8 @@ const NMDeviceModem = new Lang.Class({
Extends: NMConnectionDevice, Extends: NMConnectionDevice,
category: NMConnectionCategory.WWAN, category: NMConnectionCategory.WWAN,
_init: function(client, device, settings) { _init: function(client, device) {
this.parent(client, device, settings); this.parent(client, device);
this.item.menu.addMenuItem(createSettingsAction(_("Mobile Broadband Settings"), device));
this._mobileDevice = null; this._mobileDevice = null;
let capabilities = device.current_capabilities; let capabilities = device.current_capabilities;
@ -438,7 +414,16 @@ const NMDeviceModem = new Lang.Class({
this._mobileDevice = new ModemManager.ModemGsm(device.udi); this._mobileDevice = new ModemManager.ModemGsm(device.udi);
if (this._mobileDevice) { if (this._mobileDevice) {
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync)); this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, function() {
if (this._operatorItem) {
let name = this._mobileDevice.operator_name;
if (name) {
this._operatorItem.label.text = name;
this._operatorItem.actor.show();
} else
this._operatorItem.actor.hide();
}
}));
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() { this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
this.emit('icon-changed'); this.emit('icon-changed');
})); }));
@ -463,20 +448,6 @@ const NMDeviceModem = new Lang.Class({
this.parent(); this.parent();
}, },
_getStatus: function() {
if (!this._client.wwan_hardware_enabled)
return _("Hardware Disabled");
else if (!this._client.wwan_enabled)
/* Translators: this is for a network device that cannot be activated
because it's disabled by rfkill (airplane mode) */
return _("Disabled");
else if (this._device.state == NetworkManager.DeviceState.ACTIVATED &&
this._mobileDevice && this._mobileDevice.operator_name)
return this._mobileDevice.operator_name;
else
return this.parent();
},
_getMenuIcon: function() { _getMenuIcon: function() {
if (this._device.active_connection) if (this._device.active_connection)
return this.getIndicatorIcon(); return this.getIndicatorIcon();
@ -506,12 +477,6 @@ const NMDeviceBluetooth = new Lang.Class({
Extends: NMConnectionDevice, Extends: NMConnectionDevice,
category: NMConnectionCategory.WWAN, category: NMConnectionCategory.WWAN,
_init: function(client, device, settings) {
this.parent(client, device, settings);
this.item.menu.addMenuItem(createSettingsAction(_("Mobile Broadband Settings"), device));
},
_autoConnect: function() { _autoConnect: function() {
// FIXME: DUN devices are configured like modems, so // FIXME: DUN devices are configured like modems, so
// We need to spawn the mobile wizard // We need to spawn the mobile wizard
@ -549,30 +514,31 @@ const NMWirelessDialogItem = new Lang.Class({
this._network = network; this._network = network;
this._ap = network.accessPoints[0]; this._ap = network.accessPoints[0];
this.actor = new St.BoxLayout({ style_class: 'nm-dialog-item', this.actor = new St.Button({ style_class: 'nm-dialog-item',
can_focus: true, can_focus: true,
reactive: true }); x_fill: true });
this.actor.connect('key-focus-in', Lang.bind(this, function() { this.actor.connect('key-focus-in', Lang.bind(this, function() {
this.emit('selected'); this.emit('selected');
})); }));
let action = new Clutter.ClickAction(); this.actor.connect('clicked', Lang.bind(this, function() {
action.connect('clicked', Lang.bind(this, function() {
this.actor.grab_key_focus(); this.actor.grab_key_focus();
})); }));
this.actor.add_action(action);
this._content = new St.BoxLayout({ style_class: 'nm-dialog-item-box' });
this.actor.set_child(this._content);
let title = ssidToLabel(this._ap.get_ssid()); let title = ssidToLabel(this._ap.get_ssid());
this._label = new St.Label({ text: title }); this._label = new St.Label({ text: title });
this.actor.label_actor = this._label; this.actor.label_actor = this._label;
this.actor.add(this._label, { x_align: St.Align.START }); this._content.add(this._label, { x_align: St.Align.START });
this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon', this._selectedIcon = new St.Icon({ style_class: 'nm-dialog-icon',
icon_name: 'object-select-symbolic' }); icon_name: 'object-select-symbolic' });
this.actor.add(this._selectedIcon); this._content.add(this._selectedIcon);
this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' }); this._icons = new St.BoxLayout({ style_class: 'nm-dialog-icons' });
this.actor.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END }); this._content.add(this._icons, { expand: true, x_fill: false, x_align: St.Align.END });
this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' }); this._secureIcon = new St.Icon({ style_class: 'nm-dialog-icon' });
if (this._ap._secType != NMAccessPointSecurity.NONE) if (this._ap._secType != NMAccessPointSecurity.NONE)
@ -955,13 +921,13 @@ const NMWirelessDialog = new Lang.Class({
_selectNetwork: function(network) { _selectNetwork: function(network) {
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.actor.remove_style_pseudo_class('selected'); this._selectedNetwork.item.actor.checked = false;
this._selectedNetwork = network; this._selectedNetwork = network;
this._updateSensitivity(); this._updateSensitivity();
if (this._selectedNetwork) if (this._selectedNetwork)
this._selectedNetwork.item.actor.add_style_pseudo_class('selected'); this._selectedNetwork.item.actor.checked = true;
}, },
_createNetworkItem: function(network) { _createNetworkItem: function(network) {
@ -992,10 +958,9 @@ const NMDeviceWireless = new Lang.Class({
this._toggleItem.connect('activate', Lang.bind(this, this._toggleWifi)); this._toggleItem.connect('activate', Lang.bind(this, this._toggleWifi));
this.item.menu.addMenuItem(this._toggleItem); this.item.menu.addMenuItem(this._toggleItem);
this.item.menu.addMenuItem(createSettingsAction(_("Wi-Fi Settings"), device)); this.item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
this._wirelessEnabledChangedId = this._client.connect('notify::wireless-enabled', Lang.bind(this, this._sync)); this._wirelessEnabledChangedId = this._device.connect('notify::wireless-enabled', Lang.bind(this, this._sync));
this._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._sync));
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged)); this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged)); this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
@ -1015,14 +980,6 @@ const NMDeviceWireless = new Lang.Class({
this._activeAccessPoint.disconnect(this._strengthChangedId); this._activeAccessPoint.disconnect(this._strengthChangedId);
this._strengthChangedId = 0; this._strengthChangedId = 0;
} }
if (this._wirelessEnabledChangedId) {
this._client.disconnect(this._wirelessEnabledChangedId);
this._wirelessEnabledChangedId = 0;
}
if (this._wirelessHwEnabledChangedId) {
this._client.disconnect(this._wirelessHwEnabledChangedId);
this._wirelessHwEnabledChangedId = 0;
}
this.item.destroy(); this.item.destroy();
}, },
@ -1081,7 +1038,6 @@ const NMDeviceWireless = new Lang.Class({
_sync: function() { _sync: function() {
this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On"); this._toggleItem.label.text = this._client.wireless_enabled ? _("Turn Off") : _("Turn On");
this._toggleItem.actor.visible = this._client.wireless_hardware_enabled;
this.item.status.text = this._getStatus(); this.item.status.text = this._getStatus();
this.item.icon.icon_name = this._getMenuIcon(); this.item.icon.icon_name = this._getMenuIcon();
@ -1095,17 +1051,10 @@ const NMDeviceWireless = new Lang.Class({
_getStatus: function() { _getStatus: function() {
let ap = this._device.active_access_point; let ap = this._device.active_access_point;
if (!ap)
return _("Off"); // XXX -- interpret actual status
if (ap) return ssidToLabel(ap.get_ssid());
return ssidToLabel(ap.get_ssid());
else if (!this._client.wireless_hardware_enabled)
return _("Hardware Disabled");
else if (!this._client.wireless_enabled)
return _("Off");
else if (this._device.state == NetworkManager.DeviceState.DISCONNECTED)
return _("Not Connected");
else
return '';
}, },
_getMenuIcon: function() { _getMenuIcon: function() {
@ -1116,8 +1065,7 @@ const NMDeviceWireless = new Lang.Class({
}, },
getIndicatorIcon: function() { getIndicatorIcon: function() {
if (this._device.state >= NetworkManager.DeviceState.PREPARE && if (this._device.active_connection.state == NetworkManager.ActiveConnectionState.ACTIVATING)
this._device.state < NetworkManager.DeviceState.ACTIVATED)
return 'network-wireless-acquiring-symbolic'; return 'network-wireless-acquiring-symbolic';
let ap = this._device.active_access_point; let ap = this._device.active_access_point;
@ -1365,7 +1313,7 @@ const NMApplet = new Lang.Class({
if (!this._source) { if (!this._source) {
this._source = new MessageTray.Source(_("Network Manager"), this._source = new MessageTray.Source(_("Network Manager"),
'network-transmit-receive'); 'network-transmit-receive');
this._source.policy = new MessageTray.NotificationApplicationPolicy('gnome-network-panel'); this._source.policy = new NotificationDaemon.NotificationApplicationPolicy('gnome-network-panel');
this._source.connect('destroy', Lang.bind(this, function() { this._source.connect('destroy', Lang.bind(this, function() {
this._source = null; this._source = null;
@ -1477,18 +1425,28 @@ const NMApplet = new Lang.Class({
devices.splice(pos, 1); devices.splice(pos, 1);
}, },
_ensureActiveConnectionProps: function(a) {
if (!a._connection) {
a._connection = this._settings.get_connection_by_path(a.connection);
// This list is guaranteed to have only one device in it.
let device = a.get_devices()[0]._delegate;
a._primaryDevice = device;
}
},
_getMainConnection: function() { _getMainConnection: function() {
let connection; let connection;
connection = this._client.get_primary_connection(); connection = this._client.get_primary_connection();
if (connection) { if (connection) {
ensureActiveConnectionProps(connection, this._settings); this._ensureActiveConnectionProps(connection);
return connection; return connection;
} }
connection = this._client.get_activating_connection(); connection = this._client.get_activating_connection();
if (connection) { if (connection) {
ensureActiveConnectionProps(connection, this._settings); this._ensureActiveConnectionProps(connection);
return connection; return connection;
} }
@ -1524,7 +1482,7 @@ const NMApplet = new Lang.Class({
return (a instanceof NMClient.VPNConnection); return (a instanceof NMClient.VPNConnection);
}); });
vpnConnections.forEach(Lang.bind(this, function(a) { vpnConnections.forEach(Lang.bind(this, function(a) {
ensureActiveConnectionProps(a, this._settings); this._ensureActiveConnectionProps(a);
})); }));
this._vpnSection.setActiveConnections(vpnConnections); this._vpnSection.setActiveConnections(vpnConnections);
@ -1627,7 +1585,6 @@ const NMApplet = new Lang.Class({
_updateIcon: function() { _updateIcon: function() {
if (!this._client.networking_enabled || !this._mainConnection) { if (!this._client.networking_enabled || !this._mainConnection) {
this._primaryIndicator.icon_name = 'network-offline-symbolic'; this._primaryIndicator.icon_name = 'network-offline-symbolic';
this._primaryIndicator.visible = true;
} else { } else {
let dev = this._mainConnection._primaryDevice; let dev = this._mainConnection._primaryDevice;
this._primaryIndicator.visible = (dev != null); this._primaryIndicator.visible = (dev != null);

View File

@ -8,22 +8,20 @@ const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const BUS_NAME = 'org.freedesktop.UPower'; const BUS_NAME = 'org.gnome.SettingsDaemon.Power';
const OBJECT_PATH = '/org/freedesktop/UPower/devices/DisplayDevice'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Power';
const DisplayDeviceInterface = '<node> \ const PowerManagerInterface = <interface name="org.gnome.SettingsDaemon.Power">
<interface name="org.freedesktop.UPower.Device"> \ <method name="GetDevices">
<property name="Type" type="u" access="read"/> \ <arg type="a(susdut)" direction="out" />
<property name="State" type="u" access="read"/> \ </method>
<property name="Percentage" type="d" access="read"/> \ <method name="GetPrimaryDevice">
<property name="TimeToEmpty" type="x" access="read"/> \ <arg type="(susdut)" direction="out" />
<property name="TimeToFull" type="x" access="read"/> \ </method>
<property name="IsPresent" type="b" access="read"/> \ <property name="Icon" type="s" access="read" />
<property name="IconName" type="s" access="read"/> \ </interface>;
</interface> \
</node>';
const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(DisplayDeviceInterface); const PowerManagerProxy = Gio.DBusProxy.makeProxyWrapper(PowerManagerInterface);
const Indicator = new Lang.Class({ const Indicator = new Lang.Class({
Name: 'PowerIndicator', Name: 'PowerIndicator',
@ -34,7 +32,7 @@ const Indicator = new Lang.Class({
this._indicator = this._addIndicator(); this._indicator = this._addIndicator();
this._proxy = new PowerManagerProxy(Gio.DBus.system, BUS_NAME, OBJECT_PATH, this._proxy = new PowerManagerProxy(Gio.DBus.session, BUS_NAME, OBJECT_PATH,
Lang.bind(this, function(proxy, error) { Lang.bind(this, function(proxy, error) {
if (error) { if (error) {
log(error.message); log(error.message);
@ -45,7 +43,7 @@ const Indicator = new Lang.Class({
this._sync(); this._sync();
})); }));
this._item = new PopupMenu.PopupSubMenuMenuItem("", true); this._item = new PopupMenu.PopupSubMenuMenuItem(_("Battery"), true);
this._item.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop'); this._item.menu.addSettingsAction(_("Power Settings"), 'gnome-power-panel.desktop');
this.menu.addMenuItem(this._item); this.menu.addMenuItem(this._item);
@ -58,18 +56,11 @@ const Indicator = new Lang.Class({
this.menu.setSensitive(sensitive); this.menu.setSensitive(sensitive);
}, },
_getStatus: function() { _statusForDevice: function(device) {
let seconds = 0; let [device_id, device_type, icon, percentage, state, seconds] = device;
if (this._proxy.State == UPower.DeviceState.FULLY_CHARGED) if (state == UPower.DeviceState.FULLY_CHARGED)
return _("Fully Charged"); return _("Fully Charged");
else if (this._proxy.State == UPower.DeviceState.CHARGING)
seconds = this._proxy.TimeToFull;
else if (this._proxy.State == UPower.DeviceState.DISCHARGING)
seconds = this._proxy.TimeToEmpty;
// state is one of PENDING_CHARGING, PENDING_DISCHARGING
else
return _("Estimating…");
let time = Math.round(seconds / 60); let time = Math.round(seconds / 60);
if (time == 0) { if (time == 0) {
@ -81,43 +72,52 @@ const Indicator = new Lang.Class({
let minutes = time % 60; let minutes = time % 60;
let hours = Math.floor(time / 60); let hours = Math.floor(time / 60);
if (this._proxy.State == UPower.DeviceState.DISCHARGING) { if (state == UPower.DeviceState.DISCHARGING) {
// Translators: this is <hours>:<minutes> Remaining (<percentage>) // Translators: this is <hours>:<minutes> Remaining (<percentage>)
return _("%d\u2236%02d Remaining (%d%%)").format(hours, minutes, this._proxy.Percentage); return _("%d\u2236%02d Remaining (%d%%)").format(hours, minutes, percentage);
} }
if (this._proxy.State == UPower.DeviceState.CHARGING) { if (state == UPower.DeviceState.CHARGING) {
// Translators: this is <hours>:<minutes> Until Full (<percentage>) // Translators: this is <hours>:<minutes> Until Full (<percentage>)
return _("%d\u2236%02d Until Full (%d%%)").format(hours, minutes, this._proxy.Percentage); return _("%d\u2236%02d Until Full (%d%%)").format(hours, minutes, percentage);
} }
return null; // state is one of PENDING_CHARGING, PENDING_DISCHARGING
return _("Estimating…");
},
_syncStatusLabel: function() {
this._proxy.GetPrimaryDeviceRemote(Lang.bind(this, function(result, error) {
if (error) {
this._item.actor.hide();
return;
}
let [device] = result;
let [device_id, device_type] = device;
if (device_type == UPower.DeviceKind.BATTERY) {
this._item.status.text = this._statusForDevice(device);
this._item.actor.show();
} else {
this._item.actor.hide();
}
}));
},
_syncIcon: function() {
let icon = this._proxy.Icon;
if (icon) {
let gicon = Gio.icon_new_for_string(icon);
this._indicator.gicon = gicon;
this._item.icon.gicon = gicon;
} else {
// If there's no battery, then we use the power icon.
this._indicator.icon_name = 'system-shutdown-symbolic';
}
}, },
_sync: function() { _sync: function() {
// Do we have batteries or a UPS? this._syncIcon();
let visible = this._proxy.IsPresent; this._syncStatusLabel();
if (visible) { }
this._item.actor.show();
} else {
// If there's no battery, then we use the power icon.
this._item.actor.hide();
this._indicator.icon_name = 'system-shutdown-symbolic';
return;
}
// The icons
let icon = this._proxy.IconName;
this._indicator.icon_name = icon;
this._item.icon.icon_name = icon;
// The status label
this._item.status.text = this._getStatus();
// The sub-menu heading
if (this._proxy.Type == UPower.DeviceKind.UPS)
this._item.label.text = _("UPS");
else
this._item.label.text = _("Battery");
},
}); });

View File

@ -9,11 +9,9 @@ const PopupMenu = imports.ui.popupMenu;
const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill'; const BUS_NAME = 'org.gnome.SettingsDaemon.Rfkill';
const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill'; const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
const RfkillManagerInterface = '<node> \ const RfkillManagerInterface = <interface name="org.gnome.SettingsDaemon.Rfkill">
<interface name="org.gnome.SettingsDaemon.Rfkill"> \ <property name="AirplaneMode" type="b" access="readwrite" />
<property name="AirplaneMode" type="b" access="readwrite" /> \ </interface>;
</interface> \
</node>';
const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface); const RfkillManagerProxy = Gio.DBusProxy.makeProxyWrapper(RfkillManagerInterface);

View File

@ -18,12 +18,10 @@ const PopupMenu = imports.ui.popupMenu;
const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown'; const LOCKDOWN_SCHEMA = 'org.gnome.desktop.lockdown';
const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver';
const LOGIN_SCREEN_SCHEMA = 'org.gnome.login-screen';
const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy' const PRIVACY_SCHEMA = 'org.gnome.desktop.privacy'
const DISABLE_USER_SWITCH_KEY = 'disable-user-switching'; const DISABLE_USER_SWITCH_KEY = 'disable-user-switching';
const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen'; const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
const DISABLE_LOG_OUT_KEY = 'disable-log-out'; const DISABLE_LOG_OUT_KEY = 'disable-log-out';
const DISABLE_RESTART_KEY = 'disable-restart-buttons';
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out'; const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
const AltSwitcher = new Lang.Class({ const AltSwitcher = new Lang.Class({
@ -93,7 +91,6 @@ const Indicator = new Lang.Class({
this.parent(); this.parent();
this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA }); this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._loginScreenSettings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA }); this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
this._orientationSettings = new Gio.Settings({ schema: 'org.gnome.settings-daemon.peripherals.touchscreen' }); this._orientationSettings = new Gio.Settings({ schema: 'org.gnome.settings-daemon.peripherals.touchscreen' });
@ -264,10 +261,7 @@ const Indicator = new Lang.Class({
}, },
_updatePowerOff: function() { _updatePowerOff: function() {
let disabled = Main.sessionMode.isLocked || this._powerOffAction.visible = this._haveShutdown && !Main.sessionMode.isLocked;
(Main.sessionMode.isGreeter &&
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
this._powerOffAction.visible = this._haveShutdown && !disabled;
this._updateActionsVisibility(); this._updateActionsVisibility();
}, },
@ -279,10 +273,7 @@ const Indicator = new Lang.Class({
}, },
_updateSuspend: function() { _updateSuspend: function() {
let disabled = Main.sessionMode.isLocked || this._suspendAction.visible = this._haveSuspend && !Main.sessionMode.isLocked;
(Main.sessionMode.isGreeter &&
this._loginScreenSettings.get_boolean(DISABLE_RESTART_KEY));
this._suspendAction.visible = this._haveShutdown && !disabled;
this._updateActionsVisibility(); this._updateActionsVisibility();
}, },

View File

@ -11,8 +11,29 @@ const Signals = imports.signals;
const Tweener = imports.tweener.tweener; const Tweener = imports.tweener.tweener;
// This is a wrapper around imports.tweener.tweener that adds a bit of // This is a wrapper around imports.tweener.tweener that adds a bit of
// Clutter integration. If the tweening target is a Clutter.Actor, then // Clutter integration and some additional callbacks:
// the tweenings will automatically be removed if the actor is destroyed. //
// 1. If the tweening target is a Clutter.Actor, then the tweenings
// will automatically be removed if the actor is destroyed
//
// 2. If target._delegate.onAnimationStart() exists, it will be
// called when the target starts being animated.
//
// 3. If target._delegate.onAnimationComplete() exists, it will be
// called once the target is no longer being animated.
//
// The onAnimationStart() and onAnimationComplete() callbacks differ
// from the tweener onStart and onComplete parameters, in that (1)
// they track whether or not the target has *any* tweens attached to
// it, as opposed to be called for *each* tween, and (2)
// onAnimationComplete() is always called when the object stops being
// animated, regardless of whether it stopped normally or abnormally.
//
// onAnimationComplete() is called at idle time, which means that if a
// tween completes and then another is added before returning to the
// main loop, the complete callback will not be called (until the new
// tween finishes).
// ActionScript Tweener methods that imports.tweener.tweener doesn't // ActionScript Tweener methods that imports.tweener.tweener doesn't
// currently implement: getTweens, getVersion, registerTransition, // currently implement: getTweens, getVersion, registerTransition,
@ -56,6 +77,7 @@ function _wrapTweening(target, tweeningParameters) {
if (!Gtk.Settings.get_default().gtk_enable_animations) if (!Gtk.Settings.get_default().gtk_enable_animations)
tweeningParameters['time'] = 0.000001; tweeningParameters['time'] = 0.000001;
_addHandler(target, tweeningParameters, 'onStart', _tweenStarted);
_addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted); _addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted);
} }
@ -63,7 +85,7 @@ function _getTweenState(target) {
// If we were paranoid, we could keep a plist mapping targets to // If we were paranoid, we could keep a plist mapping targets to
// states... but we're not that paranoid. // states... but we're not that paranoid.
if (!target.__ShellTweenerState) if (!target.__ShellTweenerState)
target.__ShellTweenerState = {}; _resetTweenState(target);
return target.__ShellTweenerState; return target.__ShellTweenerState;
} }
@ -73,6 +95,8 @@ function _resetTweenState(target) {
if (state) { if (state) {
if (state.destroyedId) if (state.destroyedId)
state.actor.disconnect(state.destroyedId); state.actor.disconnect(state.destroyedId);
if (state.idleCompletedId)
Mainloop.source_remove(state.idleCompletedId);
} }
target.__ShellTweenerState = {}; target.__ShellTweenerState = {};
@ -98,9 +122,32 @@ function _actorDestroyed(target) {
Tweener.removeTweens(target); Tweener.removeTweens(target);
} }
function _tweenStarted(target) {
let state = _getTweenState(target);
let delegate = target._delegate;
if (!state.running && delegate && delegate.onAnimationStart)
delegate.onAnimationStart();
state.running = true;
}
function _tweenCompleted(target) { function _tweenCompleted(target) {
if (!isTweening(target)) let state = _getTweenState(target);
if (!state.idleCompletedId)
state.idleCompletedId = Mainloop.idle_add(Lang.bind(null, _idleCompleted, target));
}
function _idleCompleted(target) {
let state = _getTweenState(target);
let delegate = target._delegate;
if (!isTweening(target)) {
_resetTweenState(target); _resetTweenState(target);
if (delegate && delegate.onAnimationComplete)
delegate.onAnimationComplete();
}
return false;
} }
function getTweenCount(scope) { function getTweenCount(scope) {

View File

@ -1,8 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
// //
// A widget showing the user avatar and name // A widget showing the user avatar and name
const Clutter = imports.gi.Clutter;
const AccountsService = imports.gi.AccountsService; const AccountsService = imports.gi.AccountsService;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
@ -57,83 +56,6 @@ const Avatar = new Lang.Class({
} }
}); });
const UserWidgetLabel = new Lang.Class({
Name: 'UserWidgetLabel',
Extends: St.Widget,
_init: function(user) {
this.parent({ layout_manager: new Clutter.BinLayout() });
this._user = user;
this._realNameLabel = new St.Label({ style_class: 'user-widget-label',
y_align: Clutter.ActorAlign.CENTER });
this.add_child(this._realNameLabel);
this._userNameLabel = new St.Label({ style_class: 'user-widget-label',
y_align: Clutter.ActorAlign.CENTER });
this.add_child(this._userNameLabel);
this._currentLabel = null;
this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser));
this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser));
this._updateUser();
},
vfunc_destroy: function() {
if (this._userLoadedId != 0) {
this._user.disconnect(this._userLoadedId);
this._userLoadedId = 0;
}
if (this._userChangedId != 0) {
this._user.disconnect(this._userChangedId);
this._userChangedId = 0;
}
},
vfunc_allocate: function(box, flags) {
this.set_allocation(box, flags);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;
let [minRealNameWidth, minRealNameHeight,
natRealNameWidth, natRealNameHeight] = this._realNameLabel.get_preferred_size();
let [minUserNameWidth, minUserNameHeight,
natUserNameWidth, natUserNameHeight] = this._userNameLabel.get_preferred_size();
if (natRealNameWidth <= availWidth)
this._currentLabel = this._realNameLabel;
else
this._currentLabel = this._userNameLabel;
let childBox = new Clutter.ActorBox();
childBox.x1 = 0;
childBox.y1 = 0;
childBox.x2 = availWidth;
childBox.y2 = availHeight;
this._currentLabel.allocate(childBox, flags);
},
vfunc_paint: function() {
this._currentLabel.paint();
},
_updateUser: function() {
if (this._user.is_loaded) {
this._realNameLabel.text = this._user.get_real_name();
this._userNameLabel.text = this._user.get_user_name();
} else {
this._realNameLabel.text = '';
this._userNameLabel.text = '';
}
},
});
const UserWidget = new Lang.Class({ const UserWidget = new Lang.Class({
Name: 'UserWidget', Name: 'UserWidget',
@ -145,14 +67,22 @@ const UserWidget = new Lang.Class({
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._avatar = new Avatar(user); this._avatar = new Avatar(user);
this.actor.add_child(this._avatar.actor); this.actor.add(this._avatar.actor,
{ x_fill: true, y_fill: true });
this._label = new UserWidgetLabel(user); this._label = new St.Label({ style_class: 'user-widget-label' });
this.actor.add_child(this._label); this.actor.add(this._label,
{ expand: true,
x_fill: true,
y_fill: false,
y_align: St.Align.MIDDLE });
this._userLoadedId = this._user.connect('notify::is-loaded', Lang.bind(this, this._updateUser)); this._userLoadedId = this._user.connect('notify::is-loaded',
this._userChangedId = this._user.connect('changed', Lang.bind(this, this._updateUser)); Lang.bind(this, this._updateUser));
this._updateUser(); this._userChangedId = this._user.connect('changed',
Lang.bind(this, this._updateUser));
if (this._user.is_loaded)
this._updateUser();
}, },
_onDestroy: function() { _onDestroy: function() {
@ -168,6 +98,11 @@ const UserWidget = new Lang.Class({
}, },
_updateUser: function() { _updateUser: function() {
if (this._user.is_loaded)
this._label.text = this._user.get_real_name();
else
this._label.text = '';
this._avatar.update(); this._avatar.update();
} }
}); });

View File

@ -14,9 +14,12 @@ const AppDisplay = imports.ui.appDisplay;
const Main = imports.ui.main; const Main = imports.ui.main;
const OverviewControls = imports.ui.overviewControls; const OverviewControls = imports.ui.overviewControls;
const Params = imports.misc.params; const Params = imports.misc.params;
const RemoteSearch = imports.ui.remoteSearch;
const Search = imports.ui.search; const Search = imports.ui.search;
const SearchDisplay = imports.ui.searchDisplay;
const ShellEntry = imports.ui.shellEntry; const ShellEntry = imports.ui.shellEntry;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Wanda = imports.ui.wanda;
const WorkspacesView = imports.ui.workspacesView; const WorkspacesView = imports.ui.workspacesView;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
@ -63,6 +66,8 @@ const ViewSelector = new Lang.Class({
this._searchActive = false; this._searchActive = false;
this._searchTimeoutId = 0; this._searchTimeoutId = 0;
this._searchSystem = new Search.SearchSystem();
this._entry = searchEntry; this._entry = searchEntry;
ShellEntry.addContextMenu(this._entry); ShellEntry.addContextMenu(this._entry);
@ -98,11 +103,24 @@ const ViewSelector = new Lang.Class({
this._appsPage = this._addPage(this.appDisplay.actor, this._appsPage = this._addPage(this.appDisplay.actor,
_("Applications"), 'view-grid-symbolic'); _("Applications"), 'view-grid-symbolic');
this._searchResults = new Search.SearchResults(); this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
this._searchPage = this._addPage(this._searchResults.actor, this._searchPage = this._addPage(this._searchResults.actor,
_("Search"), 'edit-find-symbolic', _("Search"), 'edit-find-symbolic',
{ a11yFocus: this._entry }); { a11yFocus: this._entry });
this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
// Default search providers
// Wanda comes obviously first
this.addSearchProvider(new Wanda.WandaSearchProvider());
this.addSearchProvider(new AppDisplay.AppSearchProvider());
// Load remote search providers provided by applications
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
// Since the entry isn't inside the results container we install this // Since the entry isn't inside the results container we install this
// dummy widget as the last results container child so that we can // dummy widget as the last results container child so that we can
// include the entry in the keynav tab path // include the entry in the keynav tab path
@ -468,10 +486,45 @@ const ViewSelector = new Lang.Class({
let terms = getTermsForSearchString(this._entry.get_text()); let terms = getTermsForSearchString(this._entry.get_text());
this._searchResults.setTerms(terms); this._searchSystem.updateSearchResults(terms);
this._showPage(this._searchPage); this._showPage(this._searchPage);
}, },
_shouldUseSearchProvider: function(provider) {
// the disable-external GSetting only affects remote providers
if (!provider.isRemoteProvider)
return true;
if (this._searchSettings.get_boolean('disable-external'))
return false;
let appId = provider.appInfo.get_id();
let disable = this._searchSettings.get_strv('disabled');
return disable.indexOf(appId) == -1;
},
_reloadRemoteProviders: function() {
// removeSearchProvider() modifies the provider list we iterate on,
// so make a copy first
let remoteProviders = this._searchSystem.getRemoteProviders().slice(0);
remoteProviders.forEach(Lang.bind(this, this.removeSearchProvider));
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
},
addSearchProvider: function(provider) {
if (!this._shouldUseSearchProvider(provider))
return;
this._searchSystem.registerProvider(provider);
this._searchResults.createProviderDisplay(provider);
},
removeSearchProvider: function(provider) {
this._searchSystem.unregisterProvider(provider);
this._searchResults.destroyProviderDisplay(provider);
},
getActivePage: function() { getActivePage: function() {
if (this._activePage == this._workspacesPage) if (this._activePage == this._workspacesPage)
return ViewPage.WINDOWS; return ViewPage.WINDOWS;

156
js/ui/wanda.js Normal file
View File

@ -0,0 +1,156 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GdkPixbuf = imports.gi.GdkPixbuf;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const St = imports.gi.St;
const IconGrid = imports.ui.iconGrid;
const Layout = imports.ui.layout;
const Main = imports.ui.main;
const Panel = imports.ui.panel;
const FISH_NAME = 'wanda';
const FISH_FILENAME = 'wanda.png';
const FISH_SPEED = 300;
const FISH_COMMAND = 'fortune';
// The size of an individual frame in the animation
const FISH_HEIGHT = 22;
const FISH_WIDTH = 36;
const FISH_GROUP = 'Fish Animation';
const MAGIC_FISH_KEY = 'free the fish';
const WandaIcon = new Lang.Class({
Name: 'WandaIcon',
Extends: IconGrid.BaseIcon,
_init : function(fish, label, params) {
this.parent(label, params);
this._fish = fish;
this._imageFile = GLib.build_filenamev([global.datadir, fish + '.png']);
this._imgHeight = FISH_HEIGHT;
this._imgWidth = FISH_WIDTH;
},
createIcon: function(iconSize) {
this._animations = new Panel.Animation(this._imageFile, this._imgWidth, this._imgHeight, FISH_SPEED);
this._animations.play();
return this._animations.actor;
},
_createIconTexture: function(size) {
if (size == this.iconSize)
return;
this.parent(size);
}
});
const WandaIconBin = new Lang.Class({
Name: 'WandaIconBin',
_init: function(fish, label, params) {
this.actor = new St.Bin({ reactive: true,
track_hover: true });
this.icon = new WandaIcon(fish, label, params);
this.actor.child = this.icon.actor;
this.actor.label_actor = this.icon.label;
},
});
const FortuneDialog = new Lang.Class({
Name: 'FortuneDialog',
_init: function(name, command) {
let text;
try {
let [res, stdout, stderr, status] = GLib.spawn_command_line_sync(command);
text = String.fromCharCode.apply(null, stdout);
} catch(e) {
text = _("Sorry, no wisdom for you today:\n%s").format(e.message);
}
this._title = new St.Label({ style_class: 'prompt-dialog-headline',
text: _("%s the Oracle says").format(name) });
this._label = new St.Label({ style_class: 'prompt-dialog-description',
text: text });
this._label.clutter_text.line_wrap = true;
this._box = new St.BoxLayout({ vertical: true,
style_class: 'prompt-dialog' // this is just to force a reasonable width
});
this._box.add(this._title, { align: St.Align.MIDDLE });
this._box.add(this._label, { expand: true });
this._button = new St.Button({ button_mask: St.ButtonMask.ONE,
style_class: 'modal-dialog',
reactive: true });
this._button.connect('clicked', Lang.bind(this, this.destroy));
this._button.child = this._box;
this._bin = new St.Bin({ x_align: St.Align.MIDDLE,
y_align: St.Align.MIDDLE });
this._bin.add_constraint(new Layout.MonitorConstraint({ primary: true }));
this._bin.add_actor(this._button);
Main.layoutManager.addChrome(this._bin);
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 10, Lang.bind(this, this.destroy));
},
destroy: function() {
this._bin.destroy();
}
});
function capitalize(str) {
return str[0].toUpperCase() + str.substring(1, str.length);
}
const WandaSearchProvider = new Lang.Class({
Name: 'WandaSearchProvider',
_init: function() {
this.id = 'wanda';
},
getResultMetas: function(fish, callback) {
callback([{ 'id': fish[0], // there may be many fish in the sea, but
// only one which speaks the truth!
'name': capitalize(fish[0]),
'createIcon': function(iconSize) {
return new St.Icon({ gicon: Gio.icon_new_for_string('face-smile'),
icon_size: iconSize });
}
}]);
},
getInitialResultSet: function(terms) {
if (terms.join(' ') == MAGIC_FISH_KEY) {
this.searchSystem.setResults(this, [ FISH_NAME ]);
} else {
this.searchSystem.setResults(this, []);
}
},
getSubsearchResultSet: function(previousResults, terms) {
this.getInitialResultSet(terms);
},
activateResult: function(fish) {
if (this._dialog)
this._dialog.destroy();
this._dialog = new FortuneDialog(capitalize(fish), FISH_COMMAND);
},
createResultObject: function (resultMeta, terms) {
return new WandaIconBin(resultMeta.id, resultMeta.name);
}
});

View File

@ -39,9 +39,6 @@ const WindowAttentionHandler = new Lang.Class({
let [title, banner] = this._getTitleAndBanner(app, window); let [title, banner] = this._getTitleAndBanner(app, window);
let notification = new MessageTray.Notification(source, title, banner); let notification = new MessageTray.Notification(source, title, banner);
notification.connect('clicked', function() {
source.open();
});
notification.setForFeedback(true); notification.setForFeedback(true);
source.notify(notification); source.notify(notification);
@ -82,7 +79,7 @@ const Source = new Lang.Class({
return this._app.create_icon_texture(size); return this._app.create_icon_texture(size);
}, },
open: function() { open : function(notification) {
Main.activateWindow(this._window); Main.activateWindow(this._window);
this.destroy(); this.destroy();
} }

View File

@ -10,14 +10,19 @@ const St = imports.gi.St;
const Signals = imports.signals; const Signals = imports.signals;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const Panel = imports.ui.panel;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const FOCUS_ANIMATION_TIME = 0.15;
const WINDOW_DND_SIZE = 256; const WINDOW_DND_SIZE = 256;
const WINDOW_CLONE_MAXIMUM_SCALE = 0.7; const WINDOW_CLONE_MAXIMUM_SCALE = 0.7;
const LIGHTBOX_FADE_TIME = 0.1;
const CLOSE_BUTTON_FADE_TIME = 0.1; const CLOSE_BUTTON_FADE_TIME = 0.1;
const DRAGGING_WINDOW_OPACITY = 100; const DRAGGING_WINDOW_OPACITY = 100;
@ -338,6 +343,19 @@ const WindowOverlay = new Lang.Class({
this._animateVisible(); this._animateVisible();
}, },
fadeIn: function() {
if (!this._hidden)
return;
this.show();
this.title.opacity = 0;
this._parentActor.raise_top();
Tweener.addTween(this.title,
{ opacity: 255,
time: CLOSE_BUTTON_FADE_TIME,
transition: 'easeOutQuad' });
},
chromeHeights: function () { chromeHeights: function () {
return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap), return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap),
this.title.height + this.title._spacing]; this.title.height + this.title._spacing];
@ -354,6 +372,7 @@ const WindowOverlay = new Lang.Class({
let border = this.border; let border = this.border;
Tweener.removeTweens(button); Tweener.removeTweens(button);
Tweener.removeTweens(title);
Tweener.removeTweens(border); Tweener.removeTweens(border);
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot; let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
@ -887,19 +906,6 @@ function padArea(area, padding) {
}; };
} }
function rectEqual(one, two) {
if (one == two)
return true;
if (!one || !two)
return false;
return (one.x == two.x &&
one.y == two.y &&
one.width == two.width &&
one.height == two.height);
}
/** /**
* @metaWorkspace: a #Meta.Workspace, or null * @metaWorkspace: a #Meta.Workspace, or null
*/ */
@ -975,17 +981,11 @@ const Workspace = new Lang.Class({
}, },
setFullGeometry: function(geom) { setFullGeometry: function(geom) {
if (rectEqual(this._fullGeometry, geom))
return;
this._fullGeometry = geom; this._fullGeometry = geom;
this._recalculateWindowPositions(WindowPositionFlags.NONE); this._recalculateWindowPositions(WindowPositionFlags.NONE);
}, },
setActualGeometry: function(geom) { setActualGeometry: function(geom) {
if (rectEqual(this._actualGeometry, geom))
return;
this._actualGeometry = geom; this._actualGeometry = geom;
if (this._actualGeometryLater) if (this._actualGeometryLater)
@ -1142,7 +1142,7 @@ const Workspace = new Lang.Class({
clone.actor.set_scale(scale, scale); clone.actor.set_scale(scale, scale);
clone.actor.set_opacity(255); clone.actor.set_opacity(255);
clone.overlay.relayout(false); clone.overlay.relayout(false);
this._showWindowOverlay(clone, overlay); this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace);
} }
} }
}, },
@ -1172,19 +1172,23 @@ const Workspace = new Lang.Class({
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
this._showWindowOverlay(clone, overlay); this._showWindowOverlay(clone, overlay, true);
}) })
}); });
clone.overlay.relayout(true); clone.overlay.relayout(true);
}, },
_showWindowOverlay: function(clone, overlay) { _showWindowOverlay: function(clone, overlay, fade) {
if (clone.inDrag) if (clone.inDrag)
return; return;
if (overlay && overlay._hidden) if (overlay) {
if (fade)
overlay.fadeIn();
else
overlay.show(); overlay.show();
}
}, },
_delayedWindowRepositioning: function() { _delayedWindowRepositioning: function() {
@ -1208,7 +1212,6 @@ const Workspace = new Lang.Class({
} }
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE); this._recalculateWindowPositions(WindowPositionFlags.ANIMATE);
this._repositionWindowsId = 0;
return false; return false;
}, },
@ -1464,17 +1467,17 @@ const Workspace = new Lang.Class({
clone.connect('selected', clone.connect('selected',
Lang.bind(this, this._onCloneSelected)); Lang.bind(this, this._onCloneSelected));
clone.connect('drag-begin', clone.connect('drag-begin',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.beginWindowDrag(clone); Main.overview.beginWindowDrag();
overlay.hide(); overlay.hide();
})); }));
clone.connect('drag-cancelled', clone.connect('drag-cancelled',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.cancelledWindowDrag(clone); Main.overview.cancelledWindowDrag();
})); }));
clone.connect('drag-end', clone.connect('drag-end',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.endWindowDrag(clone); Main.overview.endWindowDrag();
overlay.show(); overlay.show();
})); }));
clone.connect('size-changed', clone.connect('size-changed',
@ -1636,7 +1639,9 @@ const Workspace = new Lang.Class({
metaWindow.move_to_monitor(this.monitorIndex); metaWindow.move_to_monitor(this.monitorIndex);
let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index(); let index = this.metaWorkspace ? this.metaWorkspace.index() : global.screen.get_active_workspace_index();
metaWindow.change_workspace_by_index(index, false); metaWindow.change_workspace_by_index(index,
false, // don't create workspace
time);
return true; return true;
} else if (source.shellWorkspaceLaunch) { } else if (source.shellWorkspaceLaunch) {
source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1, source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1,

View File

@ -438,16 +438,16 @@ const WorkspaceThumbnail = new Lang.Class({
this.activate(time); this.activate(time);
})); }));
clone.connect('drag-begin', clone.connect('drag-begin',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.beginWindowDrag(clone); Main.overview.beginWindowDrag();
})); }));
clone.connect('drag-cancelled', clone.connect('drag-cancelled',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.cancelledWindowDrag(clone); Main.overview.cancelledWindowDrag();
})); }));
clone.connect('drag-end', clone.connect('drag-end',
Lang.bind(this, function() { Lang.bind(this, function(clone) {
Main.overview.endWindowDrag(clone); Main.overview.endWindowDrag();
})); }));
this._contents.add_actor(clone.actor); this._contents.add_actor(clone.actor);
@ -507,7 +507,9 @@ const WorkspaceThumbnail = new Lang.Class({
if (metaWindow.get_monitor() != this.monitorIndex) if (metaWindow.get_monitor() != this.monitorIndex)
metaWindow.move_to_monitor(this.monitorIndex); metaWindow.move_to_monitor(this.monitorIndex);
metaWindow.change_workspace_by_index(this.metaWorkspace.index(), false); metaWindow.change_workspace_by_index(this.metaWorkspace.index(),
false, // don't create workspace
time);
return true; return true;
} else if (source.shellWorkspaceLaunch) { } else if (source.shellWorkspaceLaunch) {
source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1, source.shellWorkspaceLaunch({ workspace: this.metaWorkspace ? this.metaWorkspace.index() : -1,
@ -534,6 +536,20 @@ const ThumbnailsBox = new Lang.Class({
this.actor.connect('allocate', Lang.bind(this, this._allocate)); this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor._delegate = this; this.actor._delegate = this;
// When we animate the scale, we don't animate the requested size of the thumbnails, rather
// we ask for our final size and then animate within that size. This slightly simplifies the
// interaction with the main workspace windows (instead of constantly reallocating them
// to a new size, they get a new size once, then use the standard window animation code
// allocate the windows to their new positions), however it causes problems for drawing
// the background and border wrapped around the thumbnail as we animate - we can't just pack
// the container into a box and set style properties on the box since that box would wrap
// around the final size not the animating size. So instead we fake the background with
// an actor underneath the content and adjust the allocation of our children to leave space
// for the border and padding of the background actor.
this._background = new St.Bin({ style_class: 'workspace-thumbnails-background' });
this.actor.add_actor(this._background);
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });
// We don't want the indicator to affect drag-and-drop // We don't want the indicator to affect drag-and-drop
@ -737,12 +753,14 @@ const ThumbnailsBox = new Lang.Class({
// ... move them down one. // ... move them down one.
windows.forEach(function(win) { windows.forEach(function(win) {
win.meta_window.change_workspace_by_index(win.get_workspace() + 1, true); win.meta_window.change_workspace_by_index(win.get_workspace() + 1,
true, time);
}); });
if (isWindow) if (isWindow)
// ... and bam, a workspace, good as new. // ... and bam, a workspace, good as new.
source.metaWindow.change_workspace_by_index(newWorkspaceIndex, true); source.metaWindow.change_workspace_by_index(newWorkspaceIndex,
true, time);
else if (source.shellWorkspaceLaunch) { else if (source.shellWorkspaceLaunch) {
source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex, source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex,
timestamp: time }); timestamp: time });
@ -1024,6 +1042,9 @@ const ThumbnailsBox = new Lang.Class({
}, },
_getPreferredHeight: function(actor, forWidth, alloc) { _getPreferredHeight: function(actor, forWidth, alloc) {
// See comment about this._background in _init()
let themeNode = this._background.get_theme_node();
// Note that for getPreferredWidth/Height we cheat a bit and skip propagating // Note that for getPreferredWidth/Height we cheat a bit and skip propagating
// the size request to our children because we know how big they are and know // the size request to our children because we know how big they are and know
// that the actors aren't depending on the virtual functions being called. // that the actors aren't depending on the virtual functions being called.
@ -1031,21 +1052,24 @@ const ThumbnailsBox = new Lang.Class({
if (this._thumbnails.length == 0) if (this._thumbnails.length == 0)
return; return;
let themeNode = this.actor.get_theme_node(); let spacing = this.actor.get_theme_node().get_length('spacing');
let spacing = themeNode.get_length('spacing');
let nWorkspaces = global.screen.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
alloc.min_size = totalSpacing; [alloc.min_size, alloc.natural_size] =
alloc.natural_size = totalSpacing + nWorkspaces * this._porthole.height * MAX_THUMBNAIL_SCALE; themeNode.adjust_preferred_height(totalSpacing,
totalSpacing + nWorkspaces * this._porthole.height * MAX_THUMBNAIL_SCALE);
}, },
_getPreferredWidth: function(actor, forHeight, alloc) { _getPreferredWidth: function(actor, forHeight, alloc) {
// See comment about this._background in _init()
let themeNode = this._background.get_theme_node();
if (this._thumbnails.length == 0) if (this._thumbnails.length == 0)
return; return;
let themeNode = this.actor.get_theme_node(); // We don't animate our preferred width, which is always reported according
// to the actual number of current workspaces, we just animate within that
let spacing = this.actor.get_theme_node().get_length('spacing'); let spacing = this.actor.get_theme_node().get_length('spacing');
let nWorkspaces = global.screen.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
@ -1057,26 +1081,28 @@ const ThumbnailsBox = new Lang.Class({
scale = Math.min(scale, MAX_THUMBNAIL_SCALE); scale = Math.min(scale, MAX_THUMBNAIL_SCALE);
let width = Math.round(this._porthole.width * scale); let width = Math.round(this._porthole.width * scale);
alloc.min_size = width; [alloc.min_size, alloc.natural_size] =
alloc.natural_size = width; themeNode.adjust_preferred_width(width, width);
}, },
_allocate: function(actor, box, flags) { _allocate: function(actor, box, flags) {
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL); let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);
// See comment about this._background in _init()
let themeNode = this._background.get_theme_node();
let contentBox = themeNode.get_content_box(box);
if (this._thumbnails.length == 0) // not visible if (this._thumbnails.length == 0) // not visible
return; return;
let themeNode = this.actor.get_theme_node();
let portholeWidth = this._porthole.width; let portholeWidth = this._porthole.width;
let portholeHeight = this._porthole.height; let portholeHeight = this._porthole.height;
let spacing = themeNode.get_length('spacing'); let spacing = this.actor.get_theme_node().get_length('spacing');
// Compute the scale we'll need once everything is updated // Compute the scale we'll need once everything is updated
let nWorkspaces = global.screen.n_workspaces; let nWorkspaces = global.screen.n_workspaces;
let totalSpacing = (nWorkspaces - 1) * spacing; let totalSpacing = (nWorkspaces - 1) * spacing;
let avail = (box.y2 - box.y1) - totalSpacing; let avail = (contentBox.y2 - contentBox.y1) - totalSpacing;
let newScale = (avail / nWorkspaces) / portholeHeight; let newScale = (avail / nWorkspaces) / portholeHeight;
newScale = Math.min(newScale, MAX_THUMBNAIL_SCALE); newScale = Math.min(newScale, MAX_THUMBNAIL_SCALE);
@ -1105,6 +1131,21 @@ const ThumbnailsBox = new Lang.Class({
else else
slideOffset = thumbnailWidth + themeNode.get_padding(St.Side.RIGHT); slideOffset = thumbnailWidth + themeNode.get_padding(St.Side.RIGHT);
let childBox = new Clutter.ActorBox();
// The background is horizontally restricted to correspond to the current thumbnail size
// but otherwise covers the entire allocation
if (rtl) {
childBox.x1 = box.x1;
childBox.x2 = box.x2 - ((contentBox.x2 - contentBox.x1) - thumbnailWidth);
} else {
childBox.x1 = box.x1 + ((contentBox.x2 - contentBox.x1) - thumbnailWidth);
childBox.x2 = box.x2;
}
childBox.y1 = box.y1;
childBox.y2 = box.y2;
this._background.allocate(childBox, flags);
let indicatorY1 = this._indicatorY; let indicatorY1 = this._indicatorY;
let indicatorY2; let indicatorY2;
// when not animating, the workspace position overrides this._indicatorY // when not animating, the workspace position overrides this._indicatorY
@ -1116,7 +1157,7 @@ const ThumbnailsBox = new Lang.Class({
let indicatorLeftFullBorder = indicatorThemeNode.get_padding(St.Side.LEFT) + indicatorThemeNode.get_border_width(St.Side.LEFT); let indicatorLeftFullBorder = indicatorThemeNode.get_padding(St.Side.LEFT) + indicatorThemeNode.get_border_width(St.Side.LEFT);
let indicatorRightFullBorder = indicatorThemeNode.get_padding(St.Side.RIGHT) + indicatorThemeNode.get_border_width(St.Side.RIGHT); let indicatorRightFullBorder = indicatorThemeNode.get_padding(St.Side.RIGHT) + indicatorThemeNode.get_border_width(St.Side.RIGHT);
let y = box.y1; let y = contentBox.y1;
if (this._dropPlaceholderPos == -1) { if (this._dropPlaceholderPos == -1) {
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
@ -1124,8 +1165,6 @@ const ThumbnailsBox = new Lang.Class({
})); }));
} }
let childBox = new Clutter.ActorBox();
for (let i = 0; i < this._thumbnails.length; i++) { for (let i = 0; i < this._thumbnails.length; i++) {
let thumbnail = this._thumbnails[i]; let thumbnail = this._thumbnails[i];
@ -1134,10 +1173,10 @@ const ThumbnailsBox = new Lang.Class({
let x1, x2; let x1, x2;
if (rtl) { if (rtl) {
x1 = box.x1 + slideOffset * thumbnail.slidePosition; x1 = contentBox.x1 + slideOffset * thumbnail.slidePosition;
x2 = x1 + thumbnailWidth; x2 = x1 + thumbnailWidth;
} else { } else {
x1 = box.x2 - thumbnailWidth + slideOffset * thumbnail.slidePosition; x1 = contentBox.x2 - thumbnailWidth + slideOffset * thumbnail.slidePosition;
x2 = x1 + thumbnailWidth; x2 = x1 + thumbnailWidth;
} }
@ -1184,11 +1223,11 @@ const ThumbnailsBox = new Lang.Class({
} }
if (rtl) { if (rtl) {
childBox.x1 = box.x1; childBox.x1 = contentBox.x1;
childBox.x2 = box.x1 + thumbnailWidth; childBox.x2 = contentBox.x1 + thumbnailWidth;
} else { } else {
childBox.x1 = box.x2 - thumbnailWidth; childBox.x1 = contentBox.x2 - thumbnailWidth;
childBox.x2 = box.x2; childBox.x2 = contentBox.x2;
} }
childBox.x1 -= indicatorLeftFullBorder; childBox.x1 -= indicatorLeftFullBorder;
childBox.x2 += indicatorRightFullBorder; childBox.x2 += indicatorRightFullBorder;

View File

@ -23,92 +23,75 @@ const MAX_WORKSPACES = 16;
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides'; const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
const WorkspacesViewBase = new Lang.Class({ function rectEqual(one, two) {
Name: 'WorkspacesViewBase', if (one == two)
return true;
_init: function(monitorIndex) { if (!one || !two)
return false;
return (one.x == two.x &&
one.y == two.y &&
one.width == two.width &&
one.height == two.height);
}
const WorkspacesView = new Lang.Class({
Name: 'WorkspacesView',
_init: function(workspaces) {
this.actor = new St.Widget({ style_class: 'workspaces-view', this.actor = new St.Widget({ style_class: 'workspaces-view',
reactive: true }); reactive: true });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
// The actor itself isn't a drop target, so we don't want to pick on its area // The actor itself isn't a drop target, so we don't want to pick on its area
this.actor.set_size(0, 0); this.actor.set_size(0, 0);
this._monitorIndex = monitorIndex; this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('style-changed', Lang.bind(this,
function() {
let node = this.actor.get_theme_node();
this._spacing = node.get_length('spacing');
this._updateWorkspaceActors(false);
}));
this._fullGeometry = null; this._fullGeometry = null;
this._actualGeometry = null; this._actualGeometry = null;
this._inDrag = false; this._spacing = 0;
this._windowDragBeginId = Main.overview.connect('window-drag-begin', Lang.bind(this, this._dragBegin));
this._windowDragEndId = Main.overview.connect('window-drag-end', Lang.bind(this, this._dragEnd));
},
_onDestroy: function() {
this._dragEnd();
if (this._windowDragBeginId > 0) {
Main.overview.disconnect(this._windowDragBeginId);
this._windowDragBeginId = 0;
}
if (this._windowDragEndId > 0) {
Main.overview.disconnect(this._windowDragEndId);
this._windowDragEndId = 0;
}
},
_dragBegin: function(overview, clone) {
this._inDrag = true;
this._setReservedSlot(clone);
},
_dragEnd: function() {
this._inDrag = false;
this._setReservedSlot(null);
},
destroy: function() {
this.actor.destroy();
},
setFullGeometry: function(geom) {
this._fullGeometry = geom;
this._syncGeometry();
},
setActualGeometry: function(geom) {
this._actualGeometry = geom;
this._syncGeometry();
},
});
const WorkspacesView = new Lang.Class({
Name: 'WorkspacesView',
Extends: WorkspacesViewBase,
_init: function(monitorIndex) {
this.parent(monitorIndex);
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
this._animatingScroll = false; // programatically updating the adjustment this._animatingScroll = false; // programatically updating the adjustment
this._inDrag = false; // dragging a window
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
this._updateExtraWorkspacesId =
this._settings.connect('changed::workspaces-only-on-primary',
Lang.bind(this, this._updateExtraWorkspaces));
let activeWorkspaceIndex = global.screen.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this._workspaces = workspaces;
lower: 0,
page_increment: 1,
page_size: 1,
step_increment: 0,
upper: 0 });
this.scrollAdjustment.connect('notify::value',
Lang.bind(this, this._onScroll));
this._workspaces = []; // Add workspace actors
this._updateWorkspaces(); for (let w = 0; w < global.screen.n_workspaces; w++)
this._updateWorkspacesId = global.screen.connect('notify::n-workspaces', Lang.bind(this, this._updateWorkspaces)); this.actor.add_actor(this._workspaces[w].actor);
this._workspaces[activeWorkspaceIndex].actor.raise_top();
this._extraWorkspaces = [];
this._updateExtraWorkspaces();
// Position/scale the desktop windows and their children after the
// workspaces have been created. This cannot be done first because
// window movement depends on the Workspaces object being accessible
// as an Overview member.
this._overviewShowingId =
Main.overview.connect('showing',
Lang.bind(this, function() {
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomToOverview();
for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomToOverview();
}));
this._overviewShownId = this._overviewShownId =
Main.overview.connect('shown', Main.overview.connect('shown',
Lang.bind(this, function() { Lang.bind(this, function() {
@ -116,21 +99,72 @@ const WorkspacesView = new Lang.Class({
this._fullGeometry.width, this._fullGeometry.height); this._fullGeometry.width, this._fullGeometry.height);
})); }));
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
lower: 0,
page_increment: 1,
page_size: 1,
step_increment: 0,
upper: this._workspaces.length });
this.scrollAdjustment.connect('notify::value',
Lang.bind(this, this._onScroll));
this._switchWorkspaceNotifyId = this._switchWorkspaceNotifyId =
global.window_manager.connect('switch-workspace', global.window_manager.connect('switch-workspace',
Lang.bind(this, this._activeWorkspaceChanged)); Lang.bind(this, this._activeWorkspaceChanged));
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
Lang.bind(this, this._dragBegin));
this._itemDragEndId = Main.overview.connect('item-drag-end',
Lang.bind(this, this._dragEnd));
this._windowDragBeginId = Main.overview.connect('window-drag-begin',
Lang.bind(this, this._dragBegin));
this._windowDragEndId = Main.overview.connect('window-drag-end',
Lang.bind(this, this._dragEnd));
}, },
_setReservedSlot: function(clone) { _updateExtraWorkspaces: function() {
for (let i = 0; i < this._workspaces.length; i++) this._destroyExtraWorkspaces();
this._workspaces[i].setReservedSlot(clone);
if (!this._settings.get_boolean('workspaces-only-on-primary'))
return;
let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) {
if (i == Main.layoutManager.primaryIndex)
continue;
let ws = new Workspace.Workspace(null, i);
ws.setFullGeometry(monitors[i]);
ws.setActualGeometry(monitors[i]);
Main.layoutManager.overviewGroup.add_actor(ws.actor);
this._extraWorkspaces.push(ws);
}
}, },
_syncGeometry: function() { _destroyExtraWorkspaces: function() {
for (let m = 0; m < this._extraWorkspaces.length; m++)
this._extraWorkspaces[m].destroy();
this._extraWorkspaces = [];
},
setFullGeometry: function(geom) {
if (rectEqual(this._fullGeometry, geom))
return;
this._fullGeometry = geom;
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setFullGeometry(this._fullGeometry); this._workspaces[i].setFullGeometry(geom);
},
setActualGeometry: function(geom) {
if (rectEqual(this._actualGeometry, geom))
return;
this._actualGeometry = geom;
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setActualGeometry(this._actualGeometry); this._workspaces[i].setActualGeometry(geom);
}, },
getActiveWorkspace: function() { getActiveWorkspace: function() {
@ -138,22 +172,29 @@ const WorkspacesView = new Lang.Class({
return this._workspaces[active]; return this._workspaces[active];
}, },
zoomToOverview: function() { hide: function() {
for (let w = 0; w < this._workspaces.length; w++) let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this._workspaces[w].zoomToOverview(); let activeWorkspace = this._workspaces[activeWorkspaceIndex];
this._updateWorkspaceActors(false);
}, activeWorkspace.actor.raise_top();
zoomFromOverview: function() {
this.actor.remove_clip(); this.actor.remove_clip();
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomFromOverview(); this._workspaces[w].zoomFromOverview();
for (let w = 0; w < this._extraWorkspaces.length; w++)
this._extraWorkspaces[w].zoomFromOverview();
},
destroy: function() {
this.actor.destroy();
}, },
syncStacking: function(stackIndices) { syncStacking: function(stackIndices) {
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].syncStacking(stackIndices); this._workspaces[i].syncStacking(stackIndices);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].syncStacking(stackIndices);
}, },
_scrollToActive: function() { _scrollToActive: function() {
@ -175,7 +216,7 @@ const WorkspacesView = new Lang.Class({
Tweener.removeTweens(workspace.actor); Tweener.removeTweens(workspace.actor);
let y = (w - active) * this._fullGeometry.height; let y = (w - active) * (this._fullGeometry.height + this._spacing);
if (showAnimation) { if (showAnimation) {
let params = { y: y, let params = { y: y,
@ -235,31 +276,25 @@ const WorkspacesView = new Lang.Class({
}); });
}, },
_updateWorkspaces: function() { updateWorkspaces: function(oldNumWorkspaces, newNumWorkspaces) {
let oldNumWorkspaces = this._workspaces.length; let active = global.screen.get_active_workspace_index();
let newNumWorkspaces = global.screen.n_workspaces;
this.scrollAdjustment.upper = newNumWorkspaces; Tweener.addTween(this.scrollAdjustment,
{ upper: newNumWorkspaces,
time: WORKSPACE_SWITCH_TIME,
transition: 'easeOutQuad'
});
if (newNumWorkspaces > oldNumWorkspaces) { if (newNumWorkspaces > oldNumWorkspaces) {
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) { for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w); this._workspaces[w].setFullGeometry(this._fullGeometry);
let workspace = new Workspace.Workspace(metaWorkspace, this._monitorIndex); if (this._actualGeometry)
this._workspaces.push(workspace); this._workspaces[w].setActualGeometry(this._actualGeometry);
this.actor.add_actor(workspace.actor); this.actor.add_actor(this._workspaces[w].actor);
} }
if (this._fullGeometry) this._updateWorkspaceActors(false);
this._updateWorkspaceActors(false);
} else if (newNumWorkspaces < oldNumWorkspaces) {
let nRemoved = (newNumWorkspaces - oldNumWorkspaces);
let removed = this._workspaces.splice(oldNumWorkspaces, nRemoved);
removed.forEach(function(workspace) {
workspace.destroy();
});
} }
this._syncGeometry();
}, },
_activeWorkspaceChanged: function(wm, from, to, direction) { _activeWorkspaceChanged: function(wm, from, to, direction) {
@ -270,12 +305,70 @@ const WorkspacesView = new Lang.Class({
}, },
_onDestroy: function() { _onDestroy: function() {
this.parent(); this._destroyExtraWorkspaces();
this.scrollAdjustment.run_dispose(); this.scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewShownId); Main.overview.disconnect(this._overviewShownId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);
global.screen.disconnect(this._updateWorkspacesId); this._settings.disconnect(this._updateExtraWorkspacesId);
if (this._inDrag)
this._dragEnd();
if (this._itemDragBeginId > 0) {
Main.overview.disconnect(this._itemDragBeginId);
this._itemDragBeginId = 0;
}
if (this._itemDragEndId > 0) {
Main.overview.disconnect(this._itemDragEndId);
this._itemDragEndId = 0;
}
if (this._windowDragBeginId > 0) {
Main.overview.disconnect(this._windowDragBeginId);
this._windowDragBeginId = 0;
}
if (this._windowDragEndId > 0) {
Main.overview.disconnect(this._windowDragEndId);
this._windowDragEndId = 0;
}
},
_dragBegin: function() {
if (this._scrolling)
return;
this._inDrag = true;
this._firstDragMotion = true;
this._dragMonitor = {
dragMotion: Lang.bind(this, this._onDragMotion)
};
DND.addDragMonitor(this._dragMonitor);
},
_onDragMotion: function(dragEvent) {
if (Main.overview.animationInProgress)
return DND.DragMotionResult.CONTINUE;
if (this._firstDragMotion) {
this._firstDragMotion = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(dragEvent.dragActor._delegate);
}
return DND.DragMotionResult.CONTINUE;
},
_dragEnd: function() {
DND.removeDragMonitor(this._dragMonitor);
this._inDrag = false;
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setReservedSlot(null);
for (let i = 0; i < this._extraWorkspaces.length; i++)
this._extraWorkspaces[i].setReservedSlot(null);
}, },
startSwipeScroll: function() { startSwipeScroll: function() {
@ -334,42 +427,6 @@ const WorkspacesView = new Lang.Class({
}); });
Signals.addSignalMethods(WorkspacesView.prototype); Signals.addSignalMethods(WorkspacesView.prototype);
const ExtraWorkspaceView = new Lang.Class({
Name: 'ExtraWorkspaceView',
Extends: WorkspacesViewBase,
_init: function(monitorIndex) {
this.parent(monitorIndex);
this._workspace = new Workspace.Workspace(null, monitorIndex);
this.actor.add_actor(this._workspace.actor);
},
_setReservedSlot: function(clone) {
this._workspace.setReservedSlot(clone);
},
_syncGeometry: function() {
this._workspace.setFullGeometry(this._fullGeometry);
this._workspace.setActualGeometry(this._actualGeometry);
},
zoomToOverview: function() {
this._workspace.zoomToOverview();
},
zoomFromOverview: function() {
this._workspace.zoomFromOverview();
},
syncStacking: function(stackIndices) {
this._workspace.syncStacking(stackIndices);
},
startSwipeScroll: function() {
},
endSwipeScroll: function() {
},
});
const WorkspacesDisplay = new Lang.Class({ const WorkspacesDisplay = new Lang.Class({
Name: 'WorkspacesDisplay', Name: 'WorkspacesDisplay',
@ -414,6 +471,7 @@ const WorkspacesDisplay = new Lang.Class({
this._primaryIndex = Main.layoutManager.primaryIndex; this._primaryIndex = Main.layoutManager.primaryIndex;
this._workspacesViews = []; this._workspacesViews = [];
this._workspaces = [];
this._primaryScrollAdjustment = null; this._primaryScrollAdjustment = null;
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
@ -422,6 +480,9 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesOnlyOnPrimaryChanged)); this._workspacesOnlyOnPrimaryChanged));
this._workspacesOnlyOnPrimaryChanged(); this._workspacesOnlyOnPrimaryChanged();
global.screen.connect('notify::n-workspaces',
Lang.bind(this, this._workspacesChanged));
this._switchWorkspaceNotifyId = 0; this._switchWorkspaceNotifyId = 0;
this._notifyOpacityId = 0; this._notifyOpacityId = 0;
@ -439,8 +500,6 @@ const WorkspacesDisplay = new Lang.Class({
show: function() { show: function() {
this._updateWorkspacesViews(); this._updateWorkspacesViews();
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].zoomToOverview();
this._restackedNotifyId = this._restackedNotifyId =
Main.overview.connect('windows-restacked', Main.overview.connect('windows-restacked',
@ -450,8 +509,9 @@ const WorkspacesDisplay = new Lang.Class({
}, },
zoomFromOverview: function() { zoomFromOverview: function() {
for (let i = 0; i < this._workspacesViews.length; i++) for (let i = 0; i < this._workspacesViews.length; i++) {
this._workspacesViews[i].zoomFromOverview(); this._workspacesViews[i].hide();
}
}, },
hide: function() { hide: function() {
@ -483,38 +543,46 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews[i].destroy(); this._workspacesViews[i].destroy();
this._workspacesViews = []; this._workspacesViews = [];
this._workspaces = [];
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
let view;
if (this._workspacesOnlyOnPrimary && i != this._primaryIndex) if (this._workspacesOnlyOnPrimary && i != this._primaryIndex)
view = new ExtraWorkspaceView(i); continue; // we are only interested in the primary monitor
else
view = new WorkspacesView(i);
let monitorWorkspaces = [];
for (let w = 0; w < global.screen.n_workspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w);
monitorWorkspaces.push(new Workspace.Workspace(metaWorkspace, i));
}
this._workspaces.push(monitorWorkspaces);
let view = new WorkspacesView(monitorWorkspaces);
view.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent)); view.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
if (i == this._primaryIndex) { if (this._workspacesOnlyOnPrimary || i == this._primaryIndex) {
this._scrollAdjustment = view.scrollAdjustment; this._scrollAdjustment = view.scrollAdjustment;
this._scrollAdjustment.connect('notify::value', this._scrollAdjustment.connect('notify::value',
Lang.bind(this, this._scrollValueChanged)); Lang.bind(this, this._scrollValueChanged));
} }
this._workspacesViews.push(view); this._workspacesViews.push(view);
Main.layoutManager.overviewGroup.add_actor(view.actor);
} }
this._updateWorkspacesFullGeometry(); this._updateWorkspacesFullGeometry();
this._updateWorkspacesActualGeometry(); this._updateWorkspacesActualGeometry();
for (let i = 0; i < this._workspacesViews.length; i++)
Main.layoutManager.overviewGroup.add_actor(this._workspacesViews[i].actor);
}, },
_scrollValueChanged: function() { _scrollValueChanged: function() {
if (this._workspacesOnlyOnPrimary)
return;
for (let i = 0; i < this._workspacesViews.length; i++) { for (let i = 0; i < this._workspacesViews.length; i++) {
if (i == this._primaryIndex) if (i == this._primaryIndex)
continue; continue;
let adjustment = this._workspacesViews[i].scrollAdjustment; let adjustment = this._workspacesViews[i].scrollAdjustment;
if (!adjustment)
continue;
// the adjustments work in terms of workspaces, so the // the adjustments work in terms of workspaces, so the
// values map directly // values map directly
adjustment.value = this._scrollAdjustment.value; adjustment.value = this._scrollAdjustment.value;
@ -524,7 +592,10 @@ const WorkspacesDisplay = new Lang.Class({
_getPrimaryView: function() { _getPrimaryView: function() {
if (!this._workspacesViews.length) if (!this._workspacesViews.length)
return null; return null;
return this._workspacesViews[this._primaryIndex]; if (this._workspacesOnlyOnPrimary)
return this._workspacesViews[0];
else
return this._workspacesViews[this._primaryIndex];
}, },
activeWorkspaceHasMaximizedWindows: function() { activeWorkspaceHasMaximizedWindows: function() {
@ -570,9 +641,15 @@ const WorkspacesDisplay = new Lang.Class({
return; return;
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
let m = 0;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
let geometry = (i == this._primaryIndex) ? this._fullGeometry : monitors[i]; if (i == this._primaryIndex) {
this._workspacesViews[i].setFullGeometry(geometry); this._workspacesViews[m].setFullGeometry(this._fullGeometry);
m++;
} else if (!this._workspacesOnlyOnPrimary) {
this._workspacesViews[m].setFullGeometry(monitors[i]);
m++;
}
} }
}, },
@ -583,12 +660,18 @@ const WorkspacesDisplay = new Lang.Class({
let [x, y] = this.actor.get_transformed_position(); let [x, y] = this.actor.get_transformed_position();
let width = this.actor.allocation.x2 - this.actor.allocation.x1; let width = this.actor.allocation.x2 - this.actor.allocation.x1;
let height = this.actor.allocation.y2 - this.actor.allocation.y1; let height = this.actor.allocation.y2 - this.actor.allocation.y1;
let primaryGeometry = { x: x, y: y, width: width, height: height }; let geometry = { x: x, y: y, width: width, height: height };
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;
let m = 0;
for (let i = 0; i < monitors.length; i++) { for (let i = 0; i < monitors.length; i++) {
let geometry = (i == this._primaryIndex) ? primaryGeometry : monitors[i]; if (i == this._primaryIndex) {
this._workspacesViews[i].setActualGeometry(geometry); this._workspacesViews[m].setActualGeometry(geometry);
m++;
} else if (!this._workspacesOnlyOnPrimary) {
this._workspacesViews[m].setActualGeometry(monitors[i]);
m++;
}
} }
}, },
@ -597,6 +680,60 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews[i].syncStacking(stackIndices); this._workspacesViews[i].syncStacking(stackIndices);
}, },
_workspacesChanged: function() {
if (!this._workspacesViews.length)
return;
let oldNumWorkspaces = this._workspaces[0].length;
let newNumWorkspaces = global.screen.n_workspaces;
let active = global.screen.get_active_workspace_index();
let lostWorkspaces = [];
if (newNumWorkspaces > oldNumWorkspaces) {
let monitors = Main.layoutManager.monitors;
let m = 0;
for (let i = 0; i < monitors.length; i++) {
if (this._workspacesOnlyOnPrimary &&
i != this._primaryIndex)
continue;
// Assume workspaces are only added at the end
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w);
this._workspaces[m][w] =
new Workspace.Workspace(metaWorkspace, i);
}
m++;
}
} else {
// Assume workspaces are only removed sequentially
// (e.g. 2,3,4 - not 2,4,7)
let removedIndex;
let removedNum = oldNumWorkspaces - newNumWorkspaces;
for (let w = 0; w < oldNumWorkspaces; w++) {
let metaWorkspace = global.screen.get_workspace_by_index(w);
if (this._workspaces[0][w].metaWorkspace != metaWorkspace) {
removedIndex = w;
break;
}
}
for (let i = 0; i < this._workspaces.length; i++) {
lostWorkspaces = this._workspaces[i].splice(removedIndex,
removedNum);
for (let l = 0; l < lostWorkspaces.length; l++) {
lostWorkspaces[l].disconnectAll();
lostWorkspaces[l].destroy();
}
}
}
for (let i = 0; i < this._workspacesViews.length; i++)
this._workspacesViews[i].updateWorkspaces(oldNumWorkspaces,
newNumWorkspaces);
},
_onScrollEvent: function(actor, event) { _onScrollEvent: function(actor, event) {
if (!this.actor.mapped) if (!this.actor.mapped)
return false; return false;

View File

@ -38,7 +38,7 @@ js/ui/panel.js
js/ui/popupMenu.js js/ui/popupMenu.js
js/ui/runDialog.js js/ui/runDialog.js
js/ui/screenShield.js js/ui/screenShield.js
js/ui/search.js js/ui/searchDisplay.js
js/ui/shellEntry.js js/ui/shellEntry.js
js/ui/shellMountOperation.js js/ui/shellMountOperation.js
js/ui/status/accessibility.js js/ui/status/accessibility.js
@ -52,6 +52,7 @@ js/ui/status/system.js
js/ui/status/volume.js js/ui/status/volume.js
js/ui/unlockDialog.js js/ui/unlockDialog.js
js/ui/viewSelector.js js/ui/viewSelector.js
js/ui/wanda.js
js/ui/windowAttentionHandler.js js/ui/windowAttentionHandler.js
js/ui/windowManager.js js/ui/windowManager.js
src/calendar-server/evolution-calendar.desktop.in.in src/calendar-server/evolution-calendar.desktop.in.in

309
po/be.po
View File

@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-02 17:58+0000\n" "POT-Creation-Date: 2013-09-23 13:35+0000\n"
"PO-Revision-Date: 2012-10-16 12:05+0300\n" "PO-Revision-Date: 2012-10-16 12:05+0300\n"
"Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n" "Last-Translator: Kasia Bondarava <kasia.bondarava@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n" "Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
@ -52,6 +52,7 @@ msgid "Window management and application launching"
msgstr "Кіраванне вокнамі і пуск праграм" msgstr "Кіраванне вокнамі і пуск праграм"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "Настройкі пашырэння абалонкі GNOME" msgstr "Настройкі пашырэння абалонкі GNOME"
@ -264,8 +265,16 @@ msgstr "Прасторы працы толькі для асноўнага ма
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Delay focus changes in mouse mode until the pointer stops moving" msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr "Затрымліваць змяненне фокусу ў рэжыме мышы да спынення руху яе паказальніка"
"Затрымліваць змяненне фокусу ў рэжыме мышы да спынення руху яе паказальніка"
#: ../js/extensionPrefs/main.js:125
#, c-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Падчас загрузкі дыялогу настроек для %s узнікла памылка:"
#: ../js/extensionPrefs/main.js:165
msgid "Extension"
msgstr "Пашырэнне"
#: ../js/extensionPrefs/main.js:189 #: ../js/extensionPrefs/main.js:189
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
@ -276,7 +285,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:686
msgid "Cancel" msgid "Cancel"
msgstr "Скасаваць" msgstr "Скасаваць"
@ -298,15 +307,23 @@ msgstr "Увайсці"
msgid "Choose Session" msgid "Choose Session"
msgstr "Выбар сеанса" msgstr "Выбар сеанса"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:454 #: ../js/gdm/loginDialog.js:454
msgid "Not listed?" msgid "Not listed?"
msgstr "Няма ў спісе?" msgstr "Няма ў спісе?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:622 #: ../js/gdm/loginDialog.js:622
#, javascript-format #, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(напр., карыстальнік ці %s)" msgstr "(напр., карыстальнік ці %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:259 #: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:259
#: ../js/ui/components/networkAgent.js:277 #: ../js/ui/components/networkAgent.js:277
msgid "Username: " msgid "Username: "
@ -320,6 +337,11 @@ msgstr "Акно ўваходу"
msgid "Authentication error" msgid "Authentication error"
msgstr "Памылка ідэнтыфікацыі" msgstr "Памылка ідэнтыфікацыі"
#. We don't show fingerprint messages directly since it's
#. not the main auth service. Instead we use the messages
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:436 #: ../js/gdm/util.js:436
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(або правядзіце пальцам)" msgstr "(або правядзіце пальцам)"
@ -328,12 +350,14 @@ msgstr "(або правядзіце пальцам)"
msgid "Command not found" msgid "Command not found"
msgstr "Загад не знойдзены" msgstr "Загад не знойдзены"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:131 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Не ўдалося разабраць загад:" msgstr "Не ўдалося разабраць загад:"
#: ../js/misc/util.js:139 #: ../js/misc/util.js:139
#, javascript-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Не ўдалося выканаць \"%s\":" msgstr "Не ўдалося выканаць \"%s\":"
@ -362,16 +386,16 @@ msgid "Add to Favorites"
msgstr "Дадаць у спіс упадабанага" msgstr "Дадаць у спіс упадабанага"
#: ../js/ui/appFavorites.js:87 #: ../js/ui/appFavorites.js:87
#, javascript-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s дададзены ў ваш спіс упадабанага." msgstr "%s дададзены ў ваш спіс упадабанага."
#: ../js/ui/appFavorites.js:121 #: ../js/ui/appFavorites.js:121
#, javascript-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s выдалены з вашага спіса ўпадабанага." msgstr "%s выдалены з вашага спіса ўпадабанага."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:808 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:807
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Настройкі" msgstr "Настройкі"
@ -382,68 +406,68 @@ msgstr "Змяніць фон..."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. */ #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:62
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Увесь дзень" msgstr "Увесь дзень"
#. Translators: Shown in calendar event list, if 24h format, #. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */ #. \u2236 is a ratio character, similar to :
#: ../js/ui/calendar.js:68 #: ../js/ui/calendar.js:68
msgctxt "event list time" msgctxt "event list time"
msgid "%H%M" msgid "%H\\u2236%M"
msgstr "%H%M" msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format, #. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is #. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space */ #. a thin space
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:77
msgctxt "event list time" msgctxt "event list time"
msgid "%l%M%p" msgid "%l\\u2236%M\\u2009%p"
msgstr "%l%M%p" msgstr "%l\\u2236%M\\u2009%p"
#. Translators: Calendar grid abbreviation for Sunday. #. Translators: Calendar grid abbreviation for Sunday.
#. * #. *
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. */ #.
#: ../js/ui/calendar.js:108 #: ../js/ui/calendar.js:108
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "Н" msgstr "Н"
#. Translators: Calendar grid abbreviation for Monday */ #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:110 #: ../js/ui/calendar.js:110
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "П" msgstr "П"
#. Translators: Calendar grid abbreviation for Tuesday */ #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:112 #: ../js/ui/calendar.js:112
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "А" msgstr "А"
#. Translators: Calendar grid abbreviation for Wednesday */ #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:114
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "С" msgstr "С"
#. Translators: Calendar grid abbreviation for Thursday */ #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:116
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "Ч" msgstr "Ч"
#. Translators: Calendar grid abbreviation for Friday */ #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:118
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "П" msgstr "П"
#. Translators: Calendar grid abbreviation for Saturday */ #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:120
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
@ -454,52 +478,48 @@ msgstr "С"
#. * NOTE: These list abbreviations are normally not shown together #. * NOTE: These list abbreviations are normally not shown together
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. */ #.
#: ../js/ui/calendar.js:133 #: ../js/ui/calendar.js:133
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Н" msgstr "Н"
#. Translators: Event list abbreviation for Monday */ #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:135 #: ../js/ui/calendar.js:135
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "Пн" msgstr "Пн"
#. Translators: Event list abbreviation for Tuesday */ #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:137 #: ../js/ui/calendar.js:137
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "А" msgstr "А"
#. Translators: Event list abbreviation for Wednesday */ #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:139
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "Ср" msgstr "Ср"
#. Translators: Event list abbreviation for Thursday */ #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:141
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "Ч" msgstr "Ч"
#. Translators: Event list abbreviation for Friday */ #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:143
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "Пт" msgstr "Пт"
#. Translators: Event list abbreviation for Saturday */ #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:145
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "Сб" msgstr "Сб"
#: ../js/ui/calendar.js:389
msgid "calendar:MY"
msgstr "calendar:MY"
#: ../js/ui/calendar.js:447 #: ../js/ui/calendar.js:447
msgid "Previous month" msgid "Previous month"
msgstr "Папярэдні месяц" msgstr "Папярэдні месяц"
@ -508,18 +528,18 @@ msgstr "Папярэдні месяц"
msgid "Next month" msgid "Next month"
msgstr "Наступны месяц" msgstr "Наступны месяц"
#. Translators: Text to show if there are no events */ #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:753
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Нічога не прымеркавана" msgstr "Нічога не прымеркавана"
#. Translators: Shown on calendar heading when selected day occurs on current year */ #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:771 #: ../js/ui/calendar.js:771
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year */ #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:774 #: ../js/ui/calendar.js:774
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
@ -554,7 +574,7 @@ msgid "Removable Devices"
msgstr "Зменныя прыстасаванні" msgstr "Зменныя прыстасаванні"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:594
#, javascript-format #, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Адкрыць у %s" msgstr "Адкрыць у %s"
@ -571,10 +591,11 @@ msgid "Type again:"
msgstr "Паўтарыце пароль:" msgstr "Паўтарыце пароль:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:689
msgid "Connect" msgid "Connect"
msgstr "Злучыць" msgstr "Злучыць"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:222 #: ../js/ui/components/networkAgent.js:222
#: ../js/ui/components/networkAgent.js:234 #: ../js/ui/components/networkAgent.js:234
#: ../js/ui/components/networkAgent.js:261 #: ../js/ui/components/networkAgent.js:261
@ -583,6 +604,7 @@ msgstr "Злучыць"
msgid "Password: " msgid "Password: "
msgstr "Пароль: " msgstr "Пароль: "
#. static WEP
#: ../js/ui/components/networkAgent.js:227 #: ../js/ui/components/networkAgent.js:227
msgid "Key: " msgid "Key: "
msgstr "Ключ: " msgstr "Ключ: "
@ -604,7 +626,7 @@ msgid "Authentication required by wireless network"
msgstr "Для бесправадной сеткі патрэбная ідэнтыфікацыя" msgstr "Для бесправадной сеткі патрэбная ідэнтыфікацыя"
#: ../js/ui/components/networkAgent.js:309 #: ../js/ui/components/networkAgent.js:309
#, javascript-format #, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"'%s'." "'%s'."
@ -643,7 +665,7 @@ msgid "Mobile broadband network password"
msgstr "Пароль да шырокапалоснай мабільнай сеткі" msgstr "Пароль да шырокапалоснай мабільнай сеткі"
#: ../js/ui/components/networkAgent.js:336 #: ../js/ui/components/networkAgent.js:336
#, javascript-format #, c-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Каб злучыцца з \"%s\", патрэбны пароль." msgstr "Каб злучыцца з \"%s\", патрэбны пароль."
@ -662,19 +684,23 @@ msgstr "Ідэнтыфікаваць"
#. Translators: "that didn't work" refers to the fact that the #. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. */ #. * for instance.
#: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "На жаль, ідэнтыфікацыя не адбылася. Паўтарыце спробу." msgstr "На жаль, ідэнтыфікацыя не адбылася. Паўтарыце спробу."
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/components/telepathyClient.js:238 #: ../js/ui/components/telepathyClient.js:238
msgid "Invitation" msgid "Invitation"
msgstr "Запрашэнне" msgstr "Запрашэнне"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:298 #: ../js/ui/components/telepathyClient.js:298
msgid "Call" msgid "Call"
msgstr "Званок" msgstr "Званок"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:314 #: ../js/ui/components/telepathyClient.js:314
msgid "File Transfer" msgid "File Transfer"
msgstr "Перадача файла" msgstr "Перадача файла"
@ -691,45 +717,49 @@ msgstr "Вярнуць гук"
msgid "Mute" msgid "Mute"
msgstr "Абязгучыць" msgstr "Абязгучыць"
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"*/ #. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
#: ../js/ui/components/telepathyClient.js:942 #: ../js/ui/components/telepathyClient.js:942
#, no-c-format
msgid "<b>Yesterday</b>, <b>%H:%M</b>" msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgstr "<b>Учора</b>, <b>%H:%M</b>" msgstr "<b>Учора</b>, <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30*/ #. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:948
#, no-c-format
msgid "<b>%A</b>, <b>%H:%M</b>" msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "<b>%A</b>, <b>%H:%M</b>" msgstr "<b>%A</b>, <b>%H:%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"*/ #. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:953 #: ../js/ui/components/telepathyClient.js:953
#, no-c-format
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>" msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>"
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"*/ #. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
#: ../js/ui/components/telepathyClient.js:957 #: ../js/ui/components/telepathyClient.js:957
#, no-c-format
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> " msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> " msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. */ #. IM name.
#: ../js/ui/components/telepathyClient.js:986 #: ../js/ui/components/telepathyClient.js:986
#, javascript-format #, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s змяніў імя на %s" msgstr "%s змяніў імя на %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. */ #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1089 #: ../js/ui/components/telepathyClient.js:1089
#, javascript-format #, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Запрашэнне ў %s" msgstr "Запрашэнне ў %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */ #. * for example.
#: ../js/ui/components/telepathyClient.js:1097 #: ../js/ui/components/telepathyClient.js:1097
#, javascript-format #, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "Удзельнік %s запрашае вас далучыцца да %s" msgstr "Удзельнік %s запрашае вас далучыцца да %s"
@ -746,19 +776,19 @@ msgstr "Адмовіцца"
msgid "Accept" msgid "Accept"
msgstr "Прыняць" msgstr "Прыняць"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1130 #: ../js/ui/components/telepathyClient.js:1130
#, javascript-format #, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Відэазванок ад %s" msgstr "Відэазванок ад %s"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1133 #: ../js/ui/components/telepathyClient.js:1133
#, javascript-format #, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Званок ад %s" msgstr "Званок ад %s"
#. translators: this is a button label (verb), not a noun */ #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1142 #: ../js/ui/components/telepathyClient.js:1142
msgid "Answer" msgid "Answer"
msgstr "Адказаць" msgstr "Адказаць"
@ -767,15 +797,15 @@ msgstr "Адказаць"
#. * the contact's alias and the second one is the #. * the contact's alias and the second one is the
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. */ #.
#: ../js/ui/components/telepathyClient.js:1174 #: ../js/ui/components/telepathyClient.js:1174
#, javascript-format #, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s пасылае вам %s" msgstr "%s пасылае вам %s"
#. To translators: The parameter is the contact's alias */ #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1209 #: ../js/ui/components/telepathyClient.js:1209
#, javascript-format #, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s просіць дазволу на прагляд вашага сеткавага стану" msgstr "%s просіць дазволу на прагляд вашага сеткавага стану"
@ -882,9 +912,9 @@ msgid "Internal error"
msgstr "Унутраная памылка" msgstr "Унутраная памылка"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. */ #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1357 #: ../js/ui/components/telepathyClient.js:1357
#, javascript-format #, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Не ўдалося злучыцца з %s" msgstr "Не ўдалося злучыцца з %s"
@ -904,6 +934,8 @@ msgstr "Вокны"
msgid "Show Applications" msgid "Show Applications"
msgstr "Паказаць праграмы" msgstr "Паказаць праграмы"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:442 #: ../js/ui/dash.js:442
msgid "Dash" msgid "Dash"
msgstr "Прыборная дошка" msgstr "Прыборная дошка"
@ -922,13 +954,13 @@ msgstr "Настройкі даты і часу"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */ #.
#: ../js/ui/dateMenu.js:202 #: ../js/ui/dateMenu.js:202
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B, %Y" msgstr "%A, %e %B, %Y"
#: ../js/ui/endSessionDialog.js:62 #: ../js/ui/endSessionDialog.js:62
#, javascript-format #, c-format
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Заканчэнне сеанса (%s)" msgstr "Заканчэнне сеанса (%s)"
@ -939,7 +971,7 @@ msgid "Log Out"
msgstr "Заканчэнне сеанса" msgstr "Заканчэнне сеанса"
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
#, javascript-format #, c-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунду." msgstr[0] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунду."
@ -947,7 +979,7 @@ msgstr[1] "%s аўтаматычна скончыць сеанс працы з
msgstr[2] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунд." msgstr[2] "%s аўтаматычна скончыць сеанс працы з сістэмай праз %d секунд."
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, javascript-format #, c-format
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Вы аўтаматычна скончыце сеанс працы з сістэмай праз %d секунду." msgstr[0] "Вы аўтаматычна скончыце сеанс працы з сістэмай праз %d секунду."
@ -965,7 +997,7 @@ msgid "Power Off"
msgstr "Выключэнне камп'ютара" msgstr "Выключэнне камп'ютара"
#: ../js/ui/endSessionDialog.js:83 #: ../js/ui/endSessionDialog.js:83
#, javascript-format #, c-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Сістэма аўтаматычна выключыцца праз %d секунду." msgstr[0] "Сістэма аўтаматычна выключыцца праз %d секунду."
@ -988,7 +1020,7 @@ msgid "Restart"
msgstr "Перазапуск сістэмы" msgstr "Перазапуск сістэмы"
#: ../js/ui/endSessionDialog.js:99 #: ../js/ui/endSessionDialog.js:99
#, javascript-format #, c-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Сістэма аўтаматычна перазапусціцца праз %d секунду." msgstr[0] "Сістэма аўтаматычна перазапусціцца праз %d секунду."
@ -1001,7 +1033,7 @@ msgid "Restart & Install Updates"
msgstr "Перазапуск і ўсталяванне абнаўленняў" msgstr "Перазапуск і ўсталяванне абнаўленняў"
#: ../js/ui/endSessionDialog.js:114 #: ../js/ui/endSessionDialog.js:114
#, javascript-format #, c-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
@ -1025,15 +1057,15 @@ msgstr "Некаторыя праграмы занятыя або маюць н
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Іншыя карыстальнікі ў сістэме." msgstr "Іншыя карыстальнікі ў сістэме."
#. Translators: Remote here refers to a remote session, like a ssh login */ #. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:479 #: ../js/ui/endSessionDialog.js:479
#, javascript-format #, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (аддалены сеанс)" msgstr "%s (аддалены сеанс)"
#. Translators: Console here refers to a tty like a VT console */ #. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:482 #: ../js/ui/endSessionDialog.js:482
#, javascript-format #, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (кансоль)" msgstr "%s (кансоль)"
@ -1042,11 +1074,11 @@ msgid "Install"
msgstr "Усталяваць" msgstr "Усталяваць"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, javascript-format #, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?" msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?"
#: ../js/ui/keyboard.js:619 #: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавіятура" msgstr "Клавіятура"
@ -1054,9 +1086,9 @@ msgstr "Клавіятура"
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Няма ўсталяваных пашырэнняў" msgstr "Няма ўсталяваных пашырэнняў"
#. Translators: argument is an extension UUID. */ #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:743 #: ../js/ui/lookingGlass.js:743
#, javascript-format #, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s не зрабіў ніякіх памылак." msgstr "%s не зрабіў ніякіх памылак."
@ -1136,7 +1168,7 @@ msgid "Unknown"
msgstr "Невядомая" msgstr "Невядомая"
#: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152 #: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152
#, javascript-format #, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d новае паведамленне" msgstr[0] "%d новае паведамленне"
@ -1154,7 +1186,7 @@ msgstr "Агляд"
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. */ #. characters.
#: ../js/ui/overview.js:258 #: ../js/ui/overview.js:258
msgid "Type to search…" msgid "Type to search…"
msgstr "Увядзіце тэкст для пошуку..." msgstr "Увядзіце тэкст для пошуку..."
@ -1164,15 +1196,20 @@ msgid "Quit"
msgstr "Выйсці" msgstr "Выйсці"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */ #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:570 #: ../js/ui/panel.js:570
msgid "Activities" msgid "Activities"
msgstr "Заняткі" msgstr "Заняткі"
#: ../js/ui/panel.js:904 #: ../js/ui/panel.js:903
msgid "Top Bar" msgid "Top Bar"
msgstr "Верхняя панэль" msgstr "Верхняя панэль"
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:233 #: ../js/ui/popupMenu.js:233
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1186,13 +1223,13 @@ msgid "Close"
msgstr "Закрыць" msgstr "Закрыць"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format */ #. long format
#: ../js/ui/screenShield.js:88 #: ../js/ui/screenShield.js:88
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:154 #: ../js/ui/screenShield.js:154
#, javascript-format #, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d новае апавяшчэнне" msgstr[0] "%d новае апавяшчэнне"
@ -1207,6 +1244,13 @@ msgstr "Заблакіраваць"
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME патрабуе блакіравання экрана" msgstr "GNOME патрабуе блакіравання экрана"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:831 ../js/ui/screenShield.js:1297 #: ../js/ui/screenShield.js:831 ../js/ui/screenShield.js:1297
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Не ўдалося заблакіраваць" msgstr "Не ўдалося заблакіраваць"
@ -1215,11 +1259,11 @@ msgstr "Не ўдалося заблакіраваць"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Блакіраванне стрымана праграмай" msgstr "Блакіраванне стрымана праграмай"
#: ../js/ui/searchDisplay.js:448 #: ../js/ui/searchDisplay.js:447
msgid "Searching…" msgid "Searching…"
msgstr "Пошук..." msgstr "Пошук..."
#: ../js/ui/searchDisplay.js:492 #: ../js/ui/searchDisplay.js:491
msgid "No results." msgid "No results."
msgstr "Нічога не знойдзена." msgstr "Нічога не знойдзена."
@ -1291,6 +1335,8 @@ msgstr "Высокая кантраснасць"
msgid "Large Text" msgid "Large Text"
msgstr "Буйны тэкст" msgstr "Буйны тэкст"
#. The Bluetooth menu only appears when Bluetooth is in use,
#. so just statically build it with a "Turn Off" menu item.
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63 #: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63
#: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128 #: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128
#: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195 #: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195
@ -1298,7 +1344,7 @@ msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1034 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Выключыць" msgstr "Выключыць"
@ -1307,7 +1353,7 @@ msgid "Bluetooth Settings"
msgstr "Настройкі Bluetooth" msgstr "Настройкі Bluetooth"
#: ../js/ui/status/bluetooth.js:58 #: ../js/ui/status/bluetooth.js:58
#, javascript-format #, c-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "%d злучанае прыстасаванне" msgstr[0] "%d злучанае прыстасаванне"
@ -1315,13 +1361,13 @@ msgstr[1] "%d злучаныя прыстасаванні"
msgstr[2] "%d злучаных прыстасаванняў" msgstr[2] "%d злучаных прыстасаванняў"
#: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129 #: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129
#, javascript-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Запыт на ўпаўнаважанне ад %s" msgstr "Запыт на ўпаўнаважанне ад %s"
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172
#: ../js/ui/status/bluetooth.js:203 #: ../js/ui/status/bluetooth.js:203
#, javascript-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Прыстасаванне %s хоча спарыцца з гэтым камп'ютарам" msgstr "Прыстасаванне %s хоча спарыцца з гэтым камп'ютарам"
@ -1334,7 +1380,7 @@ msgid "Deny"
msgstr "Адмовіць" msgstr "Адмовіць"
#: ../js/ui/status/bluetooth.js:135 #: ../js/ui/status/bluetooth.js:135
#, javascript-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "Прыстасаванне %s хоча даступіцца да паслугі \"%s\"" msgstr "Прыстасаванне %s хоча даступіцца да паслугі \"%s\""
@ -1350,19 +1396,19 @@ msgstr "Даць дазвол аднойчы"
msgid "Reject" msgid "Reject"
msgstr "Адмовіць" msgstr "Адмовіць"
#. Translators: argument is the device short name */ #. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:166 #: ../js/ui/status/bluetooth.js:166
#, javascript-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Пацвярджэнне спарвання з %s" msgstr "Пацвярджэнне спарвання з %s"
#: ../js/ui/status/bluetooth.js:173 #: ../js/ui/status/bluetooth.js:173
#, javascript-format #, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "Праверце, ці супадае пароль \"%06d\" з нумарам на прыстасаванні." msgstr "Праверце, ці супадае пароль \"%06d\" з нумарам на прыстасаванні."
#. Translators: this is the verb, not the noun */ #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:176 #: ../js/ui/status/bluetooth.js:176
msgid "Matches" msgid "Matches"
msgstr "Супадае" msgstr "Супадае"
@ -1372,7 +1418,7 @@ msgid "Does not match"
msgstr "Не супадае" msgstr "Не супадае"
#: ../js/ui/status/bluetooth.js:196 #: ../js/ui/status/bluetooth.js:196
#, javascript-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Запыт на спарванне з %s" msgstr "Запыт на спарванне з %s"
@ -1388,21 +1434,25 @@ msgstr "Добра"
msgid "Brightness" msgid "Brightness"
msgstr "Яркасць" msgstr "Яркасць"
#: ../js/ui/status/keyboard.js:403
msgid "Show Keyboard Layout"
msgstr "Паказаць раскладку"
#: ../js/ui/status/network.js:72 #: ../js/ui/status/network.js:72
msgid "<unknown>" msgid "<unknown>"
msgstr "<невядома>" msgstr "<невядома>"
#: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1049
msgid "Off" msgid "Off"
msgstr "Выключана" msgstr "Выключана"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961 #: ../js/ui/status/network.js:276 ../js/ui/status/network.js:955
#: ../js/ui/status/rfkill.js:49 #: ../js/ui/status/rfkill.js:49
msgid "Network Settings" msgid "Network Settings"
msgstr "Сеткавыя настройкі" msgstr "Сеткавыя настройкі"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:364 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "непадкантрольна" msgstr "непадкантрольна"
@ -1411,64 +1461,64 @@ msgstr "непадкантрольна"
msgid "disconnecting..." msgid "disconnecting..."
msgstr "адлучэнне..." msgstr "адлучэнне..."
#: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1100
msgid "connecting..." msgid "connecting..."
msgstr "усталяванне злучэння..." msgstr "усталяванне злучэння..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1103
msgid "authentication required" msgid "authentication required"
msgstr "патрэбная ідэнтыфікацыя" msgstr "патрэбная ідэнтыфікацыя"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing
#: ../js/ui/status/network.js:383 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "няма апаратнага апраграмавання" msgstr "няма апаратнага апраграмавання"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:387 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "недаступна" msgstr "недаступна"
#: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1105
msgid "connection failed" msgid "connection failed"
msgstr "не ўдалося злучыцца" msgstr "не ўдалося злучыцца"
#: ../js/ui/status/network.js:660 #: ../js/ui/status/network.js:654
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Сеткі Wi-Fi" msgstr "Сеткі Wi-Fi"
#: ../js/ui/status/network.js:662 #: ../js/ui/status/network.js:656
msgid "Select a network" msgid "Select a network"
msgstr "Выберыце сетку" msgstr "Выберыце сетку"
#: ../js/ui/status/network.js:686 #: ../js/ui/status/network.js:680
msgid "No Networks" msgid "No Networks"
msgstr "Няма сетак" msgstr "Няма сетак"
#: ../js/ui/status/network.js:955 #: ../js/ui/status/network.js:949
msgid "Select Network" msgid "Select Network"
msgstr "Выбраць сетку" msgstr "Выбраць сетку"
#: ../js/ui/status/network.js:1040 #: ../js/ui/status/network.js:1034
msgid "Turn On" msgid "Turn On"
msgstr "Уключыць" msgstr "Уключыць"
#: ../js/ui/status/network.js:1174 #: ../js/ui/status/network.js:1167
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1314 #: ../js/ui/status/network.js:1307
msgid "Network Manager" msgid "Network Manager"
msgstr "Сеткавы кіраўнік" msgstr "Сеткавы кіраўнік"
#: ../js/ui/status/network.js:1353 #: ../js/ui/status/network.js:1346
msgid "Connection failed" msgid "Connection failed"
msgstr "Не ўдалося злучыцца" msgstr "Не ўдалося злучыцца"
#: ../js/ui/status/network.js:1354 #: ../js/ui/status/network.js:1347
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Не ўдалося ўключыць сеткавае злучэнне" msgstr "Не ўдалося ўключыць сеткавае злучэнне"
@ -1484,20 +1534,28 @@ msgstr "Настройкі сілкавання"
msgid "Fully Charged" msgid "Fully Charged"
msgstr "Поўны зарад" msgstr "Поўны зарад"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#. state is one of PENDING_CHARGING, PENDING_DISCHARGING
#: ../js/ui/status/power.js:69 ../js/ui/status/power.js:86 #: ../js/ui/status/power.js:69 ../js/ui/status/power.js:86
msgid "Estimating…" msgid "Estimating…"
msgstr "Прыблізная ацэнка..." msgstr "Прыблізная ацэнка..."
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
#, javascript-format #, c-format
msgid "%d%02d Remaining (%d%%)" msgid "%d\\u2236%02d Remaining (%d%%)"
msgstr "Засталося: %d%02d (%d%%)" msgstr "Засталося: %d\\u2236%02d (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#, javascript-format #, c-format
msgid "%d%02d Until Full (%d%%)" msgid "%d\\u2236%02d Until Full (%d%%)"
msgstr "Да поўнага зараду: %d%02d (%d%%)" msgstr "Да поўнага зараду: %d\\u2236%02d (%d%%)"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
#: ../js/ui/status/rfkill.js:43 #: ../js/ui/status/rfkill.js:43
msgid "Airplane Mode" msgid "Airplane Mode"
msgstr "Рэжым самалёта" msgstr "Рэжым самалёта"
@ -1555,7 +1613,7 @@ msgid "Search"
msgstr "Пошук" msgstr "Пошук"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:77
#, javascript-format #, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
"%s" "%s"
@ -1564,12 +1622,12 @@ msgstr ""
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:81
#, javascript-format #, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "Так сказаў Вяшчун %s" msgstr "Так сказаў Вяшчун %s"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, javascript-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "\"%s\" гатова" msgstr "\"%s\" гатова"
@ -1579,7 +1637,7 @@ msgstr "Захаваць гэтыя настройкі дысплея?"
#. Translators: this and the following message should be limited in lenght, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. */ #.
#: ../js/ui/windowManager.js:75 #: ../js/ui/windowManager.js:75
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Вярнуць былыя настройкі" msgstr "Вярнуць былыя настройкі"
@ -1589,7 +1647,7 @@ msgid "Keep Changes"
msgstr "Захаваць змены" msgstr "Захаваць змены"
#: ../js/ui/windowManager.js:97 #: ../js/ui/windowManager.js:97
#, javascript-format #, c-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "Змены настроек будуць скасаваныя праз %d секунду" msgstr[0] "Змены настроек будуць скасаваныя праз %d секунду"
@ -1656,4 +1714,3 @@ msgstr "Пароль не можа быць пустым"
#: ../src/shell-polkit-authentication-agent.c:343 #: ../src/shell-polkit-authentication-agent.c:343
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Карыстальнік праігнараваў дыялогавае акенца ідэнтыфікацыі" msgstr "Карыстальнік праігнараваў дыялогавае акенца ідэнтыфікацыі"

1920
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

166
po/cs.po
View File

@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-10 21:27+0000\n" "POT-Creation-Date: 2013-10-01 14:26+0000\n"
"PO-Revision-Date: 2013-10-11 16:28+0200\n" "PO-Revision-Date: 2013-10-02 09:51+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n" "Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n" "Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n" "Language: cs\n"
@ -276,7 +276,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Zrušit" msgstr "Zrušit"
@ -303,7 +303,6 @@ msgid "Not listed?"
msgstr "Nejste na seznamu?" msgstr "Nejste na seznamu?"
#: ../js/gdm/loginDialog.js:622 #: ../js/gdm/loginDialog.js:622
#, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(např. uživatel nebo %s)" msgstr "(např. uživatel nebo %s)"
@ -324,16 +323,15 @@ msgstr "Chyba ověření"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(nebo otiskněte prst)" msgstr "(nebo otiskněte prst)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Příkaz nenalezen" msgstr "Příkaz nenalezen"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Nelze analyzovat příkaz:" msgstr "Nelze analyzovat příkaz:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, javascript-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Vykonání „%s“ selhalo:" msgstr "Vykonání „%s“ selhalo:"
@ -362,12 +360,10 @@ msgid "Add to Favorites"
msgstr "Přidat mezi oblíbené" msgstr "Přidat mezi oblíbené"
#: ../js/ui/appFavorites.js:87 #: ../js/ui/appFavorites.js:87
#, javascript-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s byl přidán mezi oblíbené." msgstr "%s byl přidán mezi oblíbené."
#: ../js/ui/appFavorites.js:121 #: ../js/ui/appFavorites.js:121
#, javascript-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s byl odstraněn z oblíbených." msgstr "%s byl odstraněn z oblíbených."
@ -554,7 +550,6 @@ msgid "Removable Devices"
msgstr "Výměnná zařízení" msgstr "Výměnná zařízení"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:594
#, javascript-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Otevřít s %s" msgstr "Otevřít s %s"
@ -562,16 +557,16 @@ msgstr "Otevřít s %s"
msgid "Eject" msgid "Eject"
msgstr "Vysunout" msgstr "Vysunout"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Heslo:" msgstr "Heslo:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Napište znovu:" msgstr "Napište znovu:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Připojit" msgstr "Připojit"
@ -604,7 +599,6 @@ msgid "Authentication required by wireless network"
msgstr "K bezdrátové síti je vyžadováno ověření" msgstr "K bezdrátové síti je vyžadováno ověření"
#: ../js/ui/components/networkAgent.js:309 #: ../js/ui/components/networkAgent.js:309
#, javascript-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"'%s'." "'%s'."
@ -641,7 +635,6 @@ msgid "Mobile broadband network password"
msgstr "Heslo k mobilní širokopásmové síti" msgstr "Heslo k mobilní širokopásmové síti"
#: ../js/ui/components/networkAgent.js:336 #: ../js/ui/components/networkAgent.js:336
#, javascript-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Pro připojení k „%s“ je vyžadováno heslo." msgstr "Pro připojení k „%s“ je vyžadováno heslo."
@ -712,14 +705,12 @@ msgstr "<b>%d.</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. */ #. IM name. */
#: ../js/ui/components/telepathyClient.js:986 #: ../js/ui/components/telepathyClient.js:986
#, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s je teď znám jako %s" msgstr "%s je teď znám jako %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. */ #. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1089 #: ../js/ui/components/telepathyClient.js:1089
#, javascript-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Pozvánka na připojení k %s" msgstr "Pozvánka na připojení k %s"
@ -727,7 +718,6 @@ msgstr "Pozvánka na připojení k %s"
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */ #. * for example. */
#: ../js/ui/components/telepathyClient.js:1097 #: ../js/ui/components/telepathyClient.js:1097
#, javascript-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s vás zve do %s" msgstr "%s vás zve do %s"
@ -746,13 +736,11 @@ msgstr "Přijmout"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1130 #: ../js/ui/components/telepathyClient.js:1130
#, javascript-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Videohovor od %s" msgstr "Videohovor od %s"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1133 #: ../js/ui/components/telepathyClient.js:1133
#, javascript-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Hovor od %s" msgstr "Hovor od %s"
@ -767,13 +755,11 @@ msgstr "Zvednout"
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. */ #. */
#: ../js/ui/components/telepathyClient.js:1174 #: ../js/ui/components/telepathyClient.js:1174
#, javascript-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s vám posílá %s" msgstr "%s vám posílá %s"
#. To translators: The parameter is the contact's alias */ #. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1209 #: ../js/ui/components/telepathyClient.js:1209
#, javascript-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s vás žádá o oprávnění vidět, že jste dostupní" msgstr "%s vás žádá o oprávnění vidět, že jste dostupní"
@ -884,7 +870,6 @@ msgstr "Vnitřní chyba"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. */ #. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1357 #: ../js/ui/components/telepathyClient.js:1357
#, javascript-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Nelze se připojit k „%s“" msgstr "Nelze se připojit k „%s“"
@ -929,7 +914,6 @@ msgid "%A %B %e, %Y"
msgstr "%A, %e. %B, %Y" msgstr "%A, %e. %B, %Y"
#: ../js/ui/endSessionDialog.js:62 #: ../js/ui/endSessionDialog.js:62
#, javascript-format
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Odhlásit uživatele %s" msgstr "Odhlásit uživatele %s"
@ -940,7 +924,6 @@ msgid "Log Out"
msgstr "Odhlášení" msgstr "Odhlášení"
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
#, javascript-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "Uživatel %s bude automaticky odhlášen za %d sekundu." msgstr[0] "Uživatel %s bude automaticky odhlášen za %d sekundu."
@ -948,7 +931,6 @@ msgstr[1] "Uživatel %s bude automaticky odhlášen za %d sekundy."
msgstr[2] "Uživatel %s bude automaticky odhlášen za %d sekund." msgstr[2] "Uživatel %s bude automaticky odhlášen za %d sekund."
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, javascript-format
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Budete automaticky odhlášeni za %d sekundu." msgstr[0] "Budete automaticky odhlášeni za %d sekundu."
@ -966,7 +948,6 @@ msgid "Power Off"
msgstr "Vypnutí" msgstr "Vypnutí"
#: ../js/ui/endSessionDialog.js:83 #: ../js/ui/endSessionDialog.js:83
#, javascript-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Systém bude automaticky vypnut za %d sekundu." msgstr[0] "Systém bude automaticky vypnut za %d sekundu."
@ -989,7 +970,6 @@ msgid "Restart"
msgstr "Restart" msgstr "Restart"
#: ../js/ui/endSessionDialog.js:99 #: ../js/ui/endSessionDialog.js:99
#, javascript-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Systém bude automaticky restartován za %d sekundu." msgstr[0] "Systém bude automaticky restartován za %d sekundu."
@ -1002,7 +982,6 @@ msgid "Restart & Install Updates"
msgstr "Restartovat a nainstalovat aktualizace" msgstr "Restartovat a nainstalovat aktualizace"
#: ../js/ui/endSessionDialog.js:114 #: ../js/ui/endSessionDialog.js:114
#, javascript-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
@ -1031,13 +1010,11 @@ msgstr "Jsou přihlášeni jiní uživatelé."
#. Translators: Remote here refers to a remote session, like a ssh login */ #. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:479 #: ../js/ui/endSessionDialog.js:479
#, javascript-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (vzdálený)" msgstr "%s (vzdálený)"
#. Translators: Console here refers to a tty like a VT console */ #. Translators: Console here refers to a tty like a VT console */
#: ../js/ui/endSessionDialog.js:482 #: ../js/ui/endSessionDialog.js:482
#, javascript-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konzola)" msgstr "%s (konzola)"
@ -1046,7 +1023,6 @@ msgid "Install"
msgstr "Instalovat" msgstr "Instalovat"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, javascript-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?" msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?"
@ -1060,7 +1036,6 @@ msgstr "Nejsou nainstalována žádná rozšíření"
#. Translators: argument is an extension UUID. */ #. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:743 #: ../js/ui/lookingGlass.js:743
#, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Rozšíření %s nevyvolalo žádné chyby." msgstr "Rozšíření %s nevyvolalo žádné chyby."
@ -1076,12 +1051,9 @@ msgstr "Zobrazovat chyby"
msgid "Enabled" msgid "Enabled"
msgstr "Povoleno" msgstr "Povoleno"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Zakázáno" msgstr "Zakázáno"
@ -1113,31 +1085,27 @@ msgstr "Otevřít"
msgid "Remove" msgid "Remove"
msgstr "Odstranit" msgstr "Odstranit"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Upozornění"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Vymazat zprávy" msgstr "Vymazat zprávy"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Nastavení upozornění" msgstr "Nastavení upozornění"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Nabídka lišty zpráv" msgstr "Nabídka lišty zpráv"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Žádné zprávy" msgstr "Žádné zprávy"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Lišta zpráv" msgstr "Lišta zpráv"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Informace o systému" msgstr "Informace o systému"
@ -1147,7 +1115,6 @@ msgid "Unknown"
msgstr "Neznámé" msgstr "Neznámé"
#: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152 #: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152
#, javascript-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d nová zpráva" msgstr[0] "%d nová zpráva"
@ -1203,7 +1170,6 @@ msgid "%A, %B %d"
msgstr "%A, %e. %B" msgstr "%A, %e. %B"
#: ../js/ui/screenShield.js:154 #: ../js/ui/screenShield.js:154
#, javascript-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d nové upozornění" msgstr[0] "%d nové upozornění"
@ -1308,8 +1274,8 @@ msgstr "Styl velkého textu"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Vypnout" msgstr "Vypnout"
@ -1318,7 +1284,6 @@ msgid "Bluetooth Settings"
msgstr "Nastavení Bluetooth" msgstr "Nastavení Bluetooth"
#: ../js/ui/status/bluetooth.js:58 #: ../js/ui/status/bluetooth.js:58
#, javascript-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "%d připojené zařízení" msgstr[0] "%d připojené zařízení"
@ -1326,13 +1291,11 @@ msgstr[1] "%d připojená zařízení"
msgstr[2] "%d připojených zařízení" msgstr[2] "%d připojených zařízení"
#: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129 #: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129
#, javascript-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Požadavek na autorizaci od %s" msgstr "Požadavek na autorizaci od %s"
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172
#: ../js/ui/status/bluetooth.js:203 #: ../js/ui/status/bluetooth.js:203
#, javascript-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Zařízení %s se chce spárovat s tímto počítačem" msgstr "Zařízení %s se chce spárovat s tímto počítačem"
@ -1345,7 +1308,6 @@ msgid "Deny"
msgstr "Zamítnout" msgstr "Zamítnout"
#: ../js/ui/status/bluetooth.js:135 #: ../js/ui/status/bluetooth.js:135
#, javascript-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "Zařízení %s požaduje přístup ke službě „%s“" msgstr "Zařízení %s požaduje přístup ke službě „%s“"
@ -1363,12 +1325,10 @@ msgstr "Odmítnout"
#. Translators: argument is the device short name */ #. Translators: argument is the device short name */
#: ../js/ui/status/bluetooth.js:166 #: ../js/ui/status/bluetooth.js:166
#, javascript-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Potvrzení spárování pro %s" msgstr "Potvrzení spárování pro %s"
#: ../js/ui/status/bluetooth.js:173 #: ../js/ui/status/bluetooth.js:173
#, javascript-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "Ověřte prosím, zda klíč „%06d“ odpovídá tomu na zařízení." msgstr "Ověřte prosím, zda klíč „%06d“ odpovídá tomu na zařízení."
@ -1383,7 +1343,6 @@ msgid "Does not match"
msgstr "Nesouhlasí" msgstr "Nesouhlasí"
#: ../js/ui/status/bluetooth.js:196 #: ../js/ui/status/bluetooth.js:196
#, javascript-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Požadavek na spárování pro %s" msgstr "Požadavek na spárování pro %s"
@ -1403,95 +1362,83 @@ msgstr "Jas"
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznámé>" msgstr "<neznámé>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Vypnuto" msgstr "Vypnuto"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Nastavení sítě"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "nespravováno" msgstr "nespravováno"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "odpojování…" msgstr "odpojování…"
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "připojování…" msgstr "připojování…"
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "je vyžadováno ověření" msgstr "je vyžadováno ověření"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "nedostupný firmware" msgstr "nedostupný firmware"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "nedostupné" msgstr "nedostupné"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "připojení selhalo" msgstr "připojení selhalo"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
msgid "Mobile Broadband Settings"
msgstr "Nastavení mobilní širokopásmové sítě"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Hardware zakázán"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Sítě WiFi" msgstr "Sítě WiFi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Vyberte síť" msgstr "Vyberte síť"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Žádné sítě" msgstr "Žádné sítě"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Vybrat síť" msgstr "Vybrat síť"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
msgid "Wi-Fi Settings"
msgstr "Nastavení WiFi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Zapnout" msgstr "Zapnout"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1174
msgid "Not Connected"
msgstr "Nepřipojeno"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1314
msgid "Network Manager" msgid "Network Manager"
msgstr "Network Manager" msgstr "Network Manager"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1353
msgid "Connection failed" msgid "Connection failed"
msgstr "Připojení selhalo" msgstr "Připojení selhalo"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1354
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivace síťového připojení selhala" msgstr "Aktivace síťového připojení selhala"
@ -1512,12 +1459,12 @@ msgid "Estimating…"
msgstr "Odhaduje se…" msgstr "Odhaduje se…"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
#, javascript-format #| msgid "%d\\u2236%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "Zbývá %d%02d (%d%%)" msgstr "Zbývá %d%02d (%d%%)"
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#, javascript-format #| msgid "%d\\u2236%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "%d%02d do nabití (%d%%)" msgstr "%d%02d do nabití (%d%%)"
@ -1529,10 +1476,6 @@ msgstr "Režim „letadlo“"
msgid "On" msgid "On"
msgstr "Zapnuto" msgstr "Zapnuto"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Nastavení sítě"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Přepnout uživatele" msgstr "Přepnout uživatele"
@ -1582,7 +1525,6 @@ msgid "Search"
msgstr "Hledat" msgstr "Hledat"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:77
#, javascript-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
"%s" "%s"
@ -1591,12 +1533,10 @@ msgstr ""
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:81
#, javascript-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s říká Prorok" msgstr "%s říká Prorok"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "Připraveno „%s“" msgstr "Připraveno „%s“"
@ -1616,7 +1556,6 @@ msgid "Keep Changes"
msgstr "Zachovat" msgstr "Zachovat"
#: ../js/ui/windowManager.js:97 #: ../js/ui/windowManager.js:97
#, javascript-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "Nastavení se obnoví na původní za %d sekundu" msgstr[0] "Nastavení se obnoví na původní za %d sekundu"
@ -1683,3 +1622,22 @@ msgstr "Heslo nemůže být prázdné."
#: ../src/shell-polkit-authentication-agent.c:343 #: ../src/shell-polkit-authentication-agent.c:343
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Dialogové okno ověření bylo uživatelem zrušeno" msgstr "Dialogové okno ověření bylo uživatelem zrušeno"
#~ msgid "There was an error loading the preferences dialog for %s:"
#~ msgstr ""
#~ "Při načítání dialogového okna s vlastnostmi rozšíření %s se vyskytla "
#~ "chyba:"
#~ msgid "Extension"
#~ msgstr "Rozšíření"
#~ msgctxt "event list time"
#~ msgid "%H\\u2236%M"
#~ msgstr "%H:%M"
#~ msgctxt "event list time"
#~ msgid "%l\\u2236%M\\u2009%p"
#~ msgstr "%l:%M\\u2009%p"
#~ msgid "Show Keyboard Layout"
#~ msgstr "Zobrazit rozložení klávesnice"

856
po/de.po

File diff suppressed because it is too large Load Diff

801
po/el.po

File diff suppressed because it is too large Load Diff

101
po/es.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n" "Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-09 16:40+0000\n" "POT-Creation-Date: 2013-09-28 19:49+0000\n"
"PO-Revision-Date: 2013-10-10 10:33+0200\n" "PO-Revision-Date: 2013-09-30 11:42+0200\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\n"
"Language: es\n" "Language: es\n"
@ -283,7 +283,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
@ -330,15 +330,15 @@ msgstr "Error de autenticación"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o pase el dedo)" msgstr "(o pase el dedo)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Comando no encontrado" msgstr "Comando no encontrado"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "No se pudo analizar el comando:" msgstr "No se pudo analizar el comando:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:" msgstr "Falló la ejecución de «%s»:"
@ -564,16 +564,16 @@ msgstr "Abrir con %s"
msgid "Eject" msgid "Eject"
msgstr "Expulsar" msgstr "Expulsar"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Contraseña:" msgstr "Contraseña:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de nuevo:" msgstr "Escriba de nuevo:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
@ -1053,12 +1053,9 @@ msgstr "Mostrar errores"
msgid "Enabled" msgid "Enabled"
msgstr "Activado" msgstr "Activado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Desactivado" msgstr "Desactivado"
@ -1277,8 +1274,8 @@ msgstr "Texto grande"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Apagar" msgstr "Apagar"
@ -1365,99 +1362,83 @@ msgstr "Brillo"
msgid "<unknown>" msgid "<unknown>"
msgstr "<desconocido>" msgstr "<desconocido>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Desconectado" msgstr "Desconectado"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Configuración de la red"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "no gestionada" msgstr "no gestionada"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "deconectando…" msgstr "deconectando…"
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "se necesita autenticación" msgstr "se necesita autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "falta el «firmware»" msgstr "falta el «firmware»"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "no disponible" msgstr "no disponible"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "falló la conexión" msgstr "falló la conexión"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
#| msgid "Mobile broadband"
msgid "Mobile Broadband Settings"
msgstr "Configuración de banda ancha móvil"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
#| msgid "hardware disabled"
msgid "Hardware Disabled"
msgstr "Hardware desactivado"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi" msgstr "Redes Wi-Fi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Seleccionar una red" msgstr "Seleccionar una red"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "No hay redes" msgstr "No hay redes"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Seleccionar red" msgstr "Seleccionar red"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
#| msgid "Settings"
msgid "Wi-Fi Settings"
msgstr "Configuración de Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Enceder" msgstr "Enceder"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1173
#| msgid "Connect"
msgid "Not Connected"
msgstr "No conectado"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1313
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestor de la red" msgstr "Gestor de la red"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1352
msgid "Connection failed" msgid "Connection failed"
msgstr "Falló la conexión" msgstr "Falló la conexión"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1353
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falló la activación de la conexión de red" msgstr "Falló la activación de la conexión de red"
@ -1478,10 +1459,12 @@ msgid "Estimating…"
msgstr "Estimando…" msgstr "Estimando…"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
#| msgid "%d\\u2236%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "Quedan %d%02d (%d%%)" msgstr "Quedan %d%02d (%d%%)"
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#| msgid "%d\\u2236%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "%d%02d para la carga completa (%d%%)" msgstr "%d%02d para la carga completa (%d%%)"
@ -1493,10 +1476,6 @@ msgstr "Modo avión"
msgid "On" msgid "On"
msgstr "Encender" msgstr "Encender"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Configuración de la red"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
@ -1774,6 +1753,9 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "Set Up a New Device…" #~ msgid "Set Up a New Device…"
#~ msgstr "Configurar un dispositivo nuevo…" #~ msgstr "Configurar un dispositivo nuevo…"
#~ msgid "hardware disabled"
#~ msgstr "hardware desactivado"
#~ msgid "Connection" #~ msgid "Connection"
#~ msgstr "Conexión" #~ msgstr "Conexión"
@ -1792,6 +1774,9 @@ msgstr "El usuario rechazó el diálogo de autenticación"
#~ msgid "Wired" #~ msgid "Wired"
#~ msgstr "Cableada" #~ msgstr "Cableada"
#~ msgid "Mobile broadband"
#~ msgstr "Banda ancha móvil"
#~ msgid "Networking is disabled" #~ msgid "Networking is disabled"
#~ msgstr "La red está desactivada" #~ msgstr "La red está desactivada"

1852
po/fa.po

File diff suppressed because it is too large Load Diff

431
po/fi.po

File diff suppressed because it is too large Load Diff

View File

@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-09 21:04+0000\n" "POT-Creation-Date: 2013-09-27 19:38+0000\n"
"PO-Revision-Date: 2013-10-09 23:09+0200\n" "PO-Revision-Date: 2013-09-28 16:24+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n" "Last-Translator: Fran Dieguez <frandieguez@gnome.org>\n"
"Language-Team: gnome-l10n-gl@gnome.org\n" "Language-Team: gnome-l10n-gl@gnome.org\n"
"Language: gl\n" "Language: gl\n"
@ -282,7 +282,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
@ -330,15 +330,15 @@ msgstr "Erro de autenticación"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ou pase o dedo)" msgstr "(ou pase o dedo)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Orde non atopada" msgstr "Orde non atopada"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Non foi posíbel analizar a orde:" msgstr "Non foi posíbel analizar a orde:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, javascript-format #, javascript-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Produciuse un fallo na execución de «%s»:" msgstr "Produciuse un fallo na execución de «%s»:"
@ -568,16 +568,16 @@ msgstr "Abrir con %s"
msgid "Eject" msgid "Eject"
msgstr "Expulsar" msgstr "Expulsar"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Contrasinal:" msgstr "Contrasinal:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Escriba de novo:" msgstr "Escriba de novo:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
@ -1077,12 +1077,9 @@ msgstr "Mostrar erros"
msgid "Enabled" msgid "Enabled"
msgstr "Activado" msgstr "Activado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Desactivado" msgstr "Desactivado"
@ -1303,8 +1300,8 @@ msgstr "Texto grande"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Apagar" msgstr "Apagar"
@ -1398,95 +1395,83 @@ msgstr "Brillo"
msgid "<unknown>" msgid "<unknown>"
msgstr "<descoñecido>" msgstr "<descoñecido>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Desactivar" msgstr "Desactivar"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Preferencias da rede"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "non xestionada" msgstr "non xestionada"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "desconectando…" msgstr "desconectando…"
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "conectando…" msgstr "conectando…"
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "requírese autenticación" msgstr "requírese autenticación"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "falta o «firmware»" msgstr "falta o «firmware»"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "non dispoñíbel" msgstr "non dispoñíbel"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "conexión fallada" msgstr "conexión fallada"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
msgid "Mobile Broadband Settings"
msgstr "Preferencias da banda larga móbil"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Hardware desactivado"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Redes WiFi" msgstr "Redes WiFi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Seleccione unha rede" msgstr "Seleccione unha rede"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Sen redes" msgstr "Sen redes"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Seleccione unha rede" msgstr "Seleccione unha rede"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
msgid "Wi-Fi Settings"
msgstr "Preferencias da WiFi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Activar" msgstr "Activar"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1173
msgid "Not Connected"
msgstr "Non conectado"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1313
msgid "Network Manager" msgid "Network Manager"
msgstr "Xestor da rede" msgstr "Xestor da rede"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1352
msgid "Connection failed" msgid "Connection failed"
msgstr "Produciuse un fallo na conexión" msgstr "Produciuse un fallo na conexión"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1353
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Produciuse un fallo na activación da conexión de rede" msgstr "Produciuse un fallo na activación da conexión de rede"
@ -1510,13 +1495,13 @@ msgstr "Estimando…"
#, javascript-format #, javascript-format
#| msgid "%d\\u2236%02d Remaining (%d%%)" #| msgid "%d\\u2236%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "Faltan %d\\u2236%02d (%d%%)" msgstr "Faltan %d%02d (%d%%)"
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#, javascript-format #, javascript-format
#| msgid "%d\\u2236%02d Until Full (%d%%)" #| msgid "%d\\u2236%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "%d\\u2236%02d ate completo (%d%%)" msgstr "%d%02d ate completo (%d%%)"
#: ../js/ui/status/rfkill.js:43 #: ../js/ui/status/rfkill.js:43
msgid "Airplane Mode" msgid "Airplane Mode"
@ -1526,10 +1511,6 @@ msgstr "Modo avión"
msgid "On" msgid "On"
msgstr "Activado" msgstr "Activado"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Preferencias da rede"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Cambiar de usuario" msgstr "Cambiar de usuario"
@ -1831,6 +1812,9 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
#~ msgid "Set Up a New Device…" #~ msgid "Set Up a New Device…"
#~ msgstr "Configurar un dispositivo novo…" #~ msgstr "Configurar un dispositivo novo…"
#~ msgid "hardware disabled"
#~ msgstr "hardware desactivado"
#~ msgid "Connection" #~ msgid "Connection"
#~ msgstr "Conexión" #~ msgstr "Conexión"
@ -1861,6 +1845,9 @@ msgstr "O usuario rexeitou o diálogo de autenticación"
#~ msgid "Wired" #~ msgid "Wired"
#~ msgstr "Con fíos" #~ msgstr "Con fíos"
#~ msgid "Mobile broadband"
#~ msgstr "Banda larga móbil"
#~ msgid "Networking is disabled" #~ msgid "Networking is disabled"
#~ msgstr "A rede está desactivada" #~ msgstr "A rede está desactivada"

710
po/he.po

File diff suppressed because it is too large Load Diff

497
po/hu.po

File diff suppressed because it is too large Load Diff

334
po/id.po
View File

@ -10,8 +10,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-10 21:27+0000\n" "POT-Creation-Date: 2013-09-23 13:35+0000\n"
"PO-Revision-Date: 2013-10-11 10:13+0700\n" "PO-Revision-Date: 2013-09-23 21:24+0700\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n" "Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian <gnome@i15n.org>\n" "Language-Team: Indonesian <gnome@i15n.org>\n"
"Language: id\n" "Language: id\n"
@ -56,6 +56,7 @@ msgid "Window management and application launching"
msgstr "Manajemen jendela dan peluncuran aplikasi" msgstr "Manajemen jendela dan peluncuran aplikasi"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:1
#: ../js/extensionPrefs/main.js:153
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "Preferensi Ekstensi GNOME Shell" msgstr "Preferensi Ekstensi GNOME Shell"
@ -274,6 +275,15 @@ msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "" msgstr ""
"Tunda perubahan fokus dalam mode tetikus sampai penunjuk berhenti bergerak" "Tunda perubahan fokus dalam mode tetikus sampai penunjuk berhenti bergerak"
#: ../js/extensionPrefs/main.js:125
#, c-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr "Terjadi galat sewaktu memuat dialog preferensi untuk %s:"
#: ../js/extensionPrefs/main.js:165
msgid "Extension"
msgstr "Ekstensi"
#: ../js/extensionPrefs/main.js:189 #: ../js/extensionPrefs/main.js:189
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Pilih ekstensi yang ingin dikonfigurasi pada kotak di atas." msgstr "Pilih ekstensi yang ingin dikonfigurasi pada kotak di atas."
@ -281,7 +291,7 @@ msgstr "Pilih ekstensi yang ingin dikonfigurasi pada kotak di atas."
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:686
msgid "Cancel" msgid "Cancel"
msgstr "Batal" msgstr "Batal"
@ -303,14 +313,23 @@ msgstr "Masuk"
msgid "Choose Session" msgid "Choose Session"
msgstr "Pilih Sesi" msgstr "Pilih Sesi"
#. translators: this message is shown below the user list on the
#. login screen. It can be activated to reveal an entry for
#. manually entering the username.
#: ../js/gdm/loginDialog.js:454 #: ../js/gdm/loginDialog.js:454
msgid "Not listed?" msgid "Not listed?"
msgstr "Tak masuk daftar?" msgstr "Tak masuk daftar?"
#. Translators: this message is shown below the username entry field
#. to clue the user in on how to login to the local network realm
#: ../js/gdm/loginDialog.js:622 #: ../js/gdm/loginDialog.js:622
#, c-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(cth., pengguna dari %s)" msgstr "(cth., pengguna dari %s)"
#. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:259 #: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:259
#: ../js/ui/components/networkAgent.js:277 #: ../js/ui/components/networkAgent.js:277
msgid "Username: " msgid "Username: "
@ -324,19 +343,27 @@ msgstr "Jendela Log Masuk"
msgid "Authentication error" msgid "Authentication error"
msgstr "Galat otentikasi" msgstr "Galat otentikasi"
#. We don't show fingerprint messages directly since it's
#. not the main auth service. Instead we use the messages
#. as a cue to display our own message.
#. Translators: this message is shown below the password entry field
#. to indicate the user can swipe their finger instead
#: ../js/gdm/util.js:436 #: ../js/gdm/util.js:436
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(atau gesekkan jari)" msgstr "(atau gesekkan jari)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Perintah tidak ditemukan" msgstr "Perintah tidak ditemukan"
#: ../js/misc/util.js:148 #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Tidak dapat mengurai perintah:" msgstr "Tidak dapat mengurai perintah:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Eksekusi '%s' gagal:" msgstr "Eksekusi '%s' gagal:"
@ -365,14 +392,16 @@ msgid "Add to Favorites"
msgstr "Tambah ke Favorit" msgstr "Tambah ke Favorit"
#: ../js/ui/appFavorites.js:87 #: ../js/ui/appFavorites.js:87
#, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "%s telah ditambahkan ke favorit Anda." msgstr "%s telah ditambahkan ke favorit Anda."
#: ../js/ui/appFavorites.js:121 #: ../js/ui/appFavorites.js:121
#, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s telah dihapus dari favorit Anda." msgstr "%s telah dihapus dari favorit Anda."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:808 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:807
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Pengaturan" msgstr "Pengaturan"
@ -383,68 +412,68 @@ msgstr "Ubah Latar…"
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. */ #.
#: ../js/ui/calendar.js:62 #: ../js/ui/calendar.js:62
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "Sepanjang Hari" msgstr "Sepanjang Hari"
#. Translators: Shown in calendar event list, if 24h format, #. Translators: Shown in calendar event list, if 24h format,
#. \u2236 is a ratio character, similar to : */ #. \u2236 is a ratio character, similar to :
#: ../js/ui/calendar.js:68 #: ../js/ui/calendar.js:68
msgctxt "event list time" msgctxt "event list time"
msgid "%H%M" msgid "%H\\u2236%M"
msgstr "%H%M" msgstr "%H\\u2236%M"
#. Translators: Shown in calendar event list, if 12h format, #. Translators: Shown in calendar event list, if 12h format,
#. \u2236 is a ratio character, similar to : and \u2009 is #. \u2236 is a ratio character, similar to : and \u2009 is
#. a thin space */ #. a thin space
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:77
msgctxt "event list time" msgctxt "event list time"
msgid "%l%M%p" msgid "%l\\u2236%M\\u2009%p"
msgstr "%l%M%p" msgstr "%l\\u2236%M\\u2009%p"
#. Translators: Calendar grid abbreviation for Sunday. #. Translators: Calendar grid abbreviation for Sunday.
#. * #. *
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. */ #.
#: ../js/ui/calendar.js:108 #: ../js/ui/calendar.js:108
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "M" msgstr "M"
#. Translators: Calendar grid abbreviation for Monday */ #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:110 #: ../js/ui/calendar.js:110
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "S" msgstr "S"
#. Translators: Calendar grid abbreviation for Tuesday */ #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:112 #: ../js/ui/calendar.js:112
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "S" msgstr "S"
#. Translators: Calendar grid abbreviation for Wednesday */ #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:114 #: ../js/ui/calendar.js:114
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "R" msgstr "R"
#. Translators: Calendar grid abbreviation for Thursday */ #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:116 #: ../js/ui/calendar.js:116
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "K" msgstr "K"
#. Translators: Calendar grid abbreviation for Friday */ #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:118 #: ../js/ui/calendar.js:118
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "J" msgstr "J"
#. Translators: Calendar grid abbreviation for Saturday */ #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:120 #: ../js/ui/calendar.js:120
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
@ -455,52 +484,48 @@ msgstr "S"
#. * NOTE: These list abbreviations are normally not shown together #. * NOTE: These list abbreviations are normally not shown together
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. */ #.
#: ../js/ui/calendar.js:133 #: ../js/ui/calendar.js:133
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "Min" msgstr "Min"
#. Translators: Event list abbreviation for Monday */ #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:135 #: ../js/ui/calendar.js:135
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "Sen" msgstr "Sen"
#. Translators: Event list abbreviation for Tuesday */ #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:137 #: ../js/ui/calendar.js:137
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "Sel" msgstr "Sel"
#. Translators: Event list abbreviation for Wednesday */ #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:139 #: ../js/ui/calendar.js:139
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "Rab" msgstr "Rab"
#. Translators: Event list abbreviation for Thursday */ #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:141 #: ../js/ui/calendar.js:141
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "Kam" msgstr "Kam"
#. Translators: Event list abbreviation for Friday */ #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:143 #: ../js/ui/calendar.js:143
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "Jum" msgstr "Jum"
#. Translators: Event list abbreviation for Saturday */ #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:145 #: ../js/ui/calendar.js:145
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "Sab" msgstr "Sab"
#: ../js/ui/calendar.js:389
msgid "calendar:MY"
msgstr "calendar:MY"
#: ../js/ui/calendar.js:447 #: ../js/ui/calendar.js:447
msgid "Previous month" msgid "Previous month"
msgstr "Bulan sebelumnya" msgstr "Bulan sebelumnya"
@ -509,18 +534,18 @@ msgstr "Bulan sebelumnya"
msgid "Next month" msgid "Next month"
msgstr "Bulan selanjutnya" msgstr "Bulan selanjutnya"
#. Translators: Text to show if there are no events */ #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:753 #: ../js/ui/calendar.js:753
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Tidak Ada Jadwal" msgstr "Tidak Ada Jadwal"
#. Translators: Shown on calendar heading when selected day occurs on current year */ #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:771 #: ../js/ui/calendar.js:771
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year */ #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:774 #: ../js/ui/calendar.js:774
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
@ -555,6 +580,7 @@ msgid "Removable Devices"
msgstr "Perangkat Yang Dapat Dicabut" msgstr "Perangkat Yang Dapat Dicabut"
#: ../js/ui/components/autorunManager.js:594 #: ../js/ui/components/autorunManager.js:594
#, c-format
msgid "Open with %s" msgid "Open with %s"
msgstr "Buka dengan %s" msgstr "Buka dengan %s"
@ -562,19 +588,20 @@ msgstr "Buka dengan %s"
msgid "Eject" msgid "Eject"
msgstr "Keluarkan" msgstr "Keluarkan"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Sandi:" msgstr "Sandi:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Ketik lagi:" msgstr "Ketik lagi:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:689
msgid "Connect" msgid "Connect"
msgstr "Sambung" msgstr "Sambung"
#. Cisco LEAP
#: ../js/ui/components/networkAgent.js:222 #: ../js/ui/components/networkAgent.js:222
#: ../js/ui/components/networkAgent.js:234 #: ../js/ui/components/networkAgent.js:234
#: ../js/ui/components/networkAgent.js:261 #: ../js/ui/components/networkAgent.js:261
@ -583,6 +610,7 @@ msgstr "Sambung"
msgid "Password: " msgid "Password: "
msgstr "Sandi: " msgstr "Sandi: "
#. static WEP
#: ../js/ui/components/networkAgent.js:227 #: ../js/ui/components/networkAgent.js:227
msgid "Key: " msgid "Key: "
msgstr "Tombol: " msgstr "Tombol: "
@ -604,6 +632,7 @@ msgid "Authentication required by wireless network"
msgstr "Otentikasi dibutuhkan oleh jaringan nirkabel" msgstr "Otentikasi dibutuhkan oleh jaringan nirkabel"
#: ../js/ui/components/networkAgent.js:309 #: ../js/ui/components/networkAgent.js:309
#, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
"'%s'." "'%s'."
@ -640,6 +669,7 @@ msgid "Mobile broadband network password"
msgstr "Sandi jaringan data seluler" msgstr "Sandi jaringan data seluler"
#: ../js/ui/components/networkAgent.js:336 #: ../js/ui/components/networkAgent.js:336
#, c-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Sebuah kata sandi dibutuhkan untuk menyambung ke '%s'." msgstr "Sebuah kata sandi dibutuhkan untuk menyambung ke '%s'."
@ -658,19 +688,23 @@ msgstr "Otentikasi"
#. Translators: "that didn't work" refers to the fact that the #. Translators: "that didn't work" refers to the fact that the
#. * requested authentication was not gained; this can happen #. * requested authentication was not gained; this can happen
#. * because of an authentication error (like invalid password), #. * because of an authentication error (like invalid password),
#. * for instance. */ #. * for instance.
#: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383 #: ../js/ui/components/polkitAgent.js:266 ../js/ui/shellMountOperation.js:383
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Maaf, tidak berhasil. Silakan coba lagi." msgstr "Maaf, tidak berhasil. Silakan coba lagi."
#. FIXME: We don't have a 'chat room' icon (bgo #653737) use
#. system-users for now as Empathy does.
#: ../js/ui/components/telepathyClient.js:238 #: ../js/ui/components/telepathyClient.js:238
msgid "Invitation" msgid "Invitation"
msgstr "Undangan" msgstr "Undangan"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:298 #: ../js/ui/components/telepathyClient.js:298
msgid "Call" msgid "Call"
msgstr "Panggil" msgstr "Panggil"
#. We got the TpContact
#: ../js/ui/components/telepathyClient.js:314 #: ../js/ui/components/telepathyClient.js:314
msgid "File Transfer" msgid "File Transfer"
msgstr "Transfer Berkas" msgstr "Transfer Berkas"
@ -687,42 +721,49 @@ msgstr "Bersuara"
msgid "Mute" msgid "Mute"
msgstr "Bisu" msgstr "Bisu"
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"*/ #. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"
#: ../js/ui/components/telepathyClient.js:942 #: ../js/ui/components/telepathyClient.js:942
#, no-c-format
msgid "<b>Yesterday</b>, <b>%H:%M</b>" msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgstr "<b>Kemarin</b>, <b>%H:%M</b>" msgstr "<b>Kemarin</b>, <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30*/ #. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30
#: ../js/ui/components/telepathyClient.js:948 #: ../js/ui/components/telepathyClient.js:948
#, no-c-format
msgid "<b>%A</b>, <b>%H:%M</b>" msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "<b>%A</b>, <b>%H:%M</b>" msgstr "<b>%A</b>, <b>%H:%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"*/ #. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"
#: ../js/ui/components/telepathyClient.js:953 #: ../js/ui/components/telepathyClient.js:953
#, no-c-format
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>" msgstr "<b>%d</b> <b>%B</b>, <b>%H:%M</b>"
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"*/ #. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"
#: ../js/ui/components/telepathyClient.js:957 #: ../js/ui/components/telepathyClient.js:957
#, no-c-format
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> " msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> " msgstr "<b>%d</b> <b>%B</b> <b>%Y</b>, <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. */ #. IM name.
#: ../js/ui/components/telepathyClient.js:986 #: ../js/ui/components/telepathyClient.js:986
#, c-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s sekarang dikenal sebagai %s" msgstr "%s sekarang dikenal sebagai %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. */ #. * room@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1089 #: ../js/ui/components/telepathyClient.js:1089
#, c-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Undangan ke %s" msgstr "Undangan ke %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */ #. * for example.
#: ../js/ui/components/telepathyClient.js:1097 #: ../js/ui/components/telepathyClient.js:1097
#, c-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s mengundang Anda untuk bergabung dengan %s" msgstr "%s mengundang Anda untuk bergabung dengan %s"
@ -739,17 +780,19 @@ msgstr "Tolak"
msgid "Accept" msgid "Accept"
msgstr "Terima" msgstr "Terima"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1130 #: ../js/ui/components/telepathyClient.js:1130
#, c-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Panggilan video dari %s" msgstr "Panggilan video dari %s"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example.
#: ../js/ui/components/telepathyClient.js:1133 #: ../js/ui/components/telepathyClient.js:1133
#, c-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Panggilan dari %s" msgstr "Panggilan dari %s"
#. translators: this is a button label (verb), not a noun */ #. translators: this is a button label (verb), not a noun
#: ../js/ui/components/telepathyClient.js:1142 #: ../js/ui/components/telepathyClient.js:1142
msgid "Answer" msgid "Answer"
msgstr "Jawab" msgstr "Jawab"
@ -758,13 +801,15 @@ msgstr "Jawab"
#. * the contact's alias and the second one is the #. * the contact's alias and the second one is the
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. */ #.
#: ../js/ui/components/telepathyClient.js:1174 #: ../js/ui/components/telepathyClient.js:1174
#, c-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s sedang mengirimi Anda %s" msgstr "%s sedang mengirimi Anda %s"
#. To translators: The parameter is the contact's alias */ #. To translators: The parameter is the contact's alias
#: ../js/ui/components/telepathyClient.js:1209 #: ../js/ui/components/telepathyClient.js:1209
#, c-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s ingin minta ijin melihat Anda ketika Anda daring" msgstr "%s ingin minta ijin melihat Anda ketika Anda daring"
@ -874,8 +919,9 @@ msgid "Internal error"
msgstr "Galat internal" msgstr "Galat internal"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. */ #. * name@jabber.org for example.
#: ../js/ui/components/telepathyClient.js:1357 #: ../js/ui/components/telepathyClient.js:1357
#, c-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Tak bisa menyambung ke %s" msgstr "Tak bisa menyambung ke %s"
@ -895,6 +941,8 @@ msgstr "Jendela"
msgid "Show Applications" msgid "Show Applications"
msgstr "Tampilkan Aplikasi" msgstr "Tampilkan Aplikasi"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/dash.js:442 #: ../js/ui/dash.js:442
msgid "Dash" msgid "Dash"
msgstr "Dash" msgstr "Dash"
@ -913,12 +961,13 @@ msgstr "Pengaturan Waktu & Tanggal"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */ #.
#: ../js/ui/dateMenu.js:202 #: ../js/ui/dateMenu.js:202
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y" msgstr "%A, %e %B %Y"
#: ../js/ui/endSessionDialog.js:62 #: ../js/ui/endSessionDialog.js:62
#, c-format
msgctxt "title" msgctxt "title"
msgid "Log Out %s" msgid "Log Out %s"
msgstr "Keluar %s" msgstr "Keluar %s"
@ -929,11 +978,13 @@ msgid "Log Out"
msgstr "Keluar" msgstr "Keluar"
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
#, c-format
msgid "%s will be logged out automatically in %d second." msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds." msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "%s akan log keluar otomatis dalam %d detik.\t\t" msgstr[0] "%s akan log keluar otomatis dalam %d detik.\t\t"
#: ../js/ui/endSessionDialog.js:70 #: ../js/ui/endSessionDialog.js:70
#, c-format
msgid "You will be logged out automatically in %d second." msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds." msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "Anda akan log keluar otomatis dalam %d detik." msgstr[0] "Anda akan log keluar otomatis dalam %d detik."
@ -949,6 +1000,7 @@ msgid "Power Off"
msgstr "Matikan" msgstr "Matikan"
#: ../js/ui/endSessionDialog.js:83 #: ../js/ui/endSessionDialog.js:83
#, c-format
msgid "The system will power off automatically in %d second." msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds." msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Sistem ini akan otomatis dimatikan dalam %d detik." msgstr[0] "Sistem ini akan otomatis dimatikan dalam %d detik."
@ -969,6 +1021,7 @@ msgid "Restart"
msgstr "Nyalakan Ulang" msgstr "Nyalakan Ulang"
#: ../js/ui/endSessionDialog.js:99 #: ../js/ui/endSessionDialog.js:99
#, c-format
msgid "The system will restart automatically in %d second." msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds." msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "Sistem ini akan otomatis dimulai ulang dalam %d detik." msgstr[0] "Sistem ini akan otomatis dimulai ulang dalam %d detik."
@ -979,6 +1032,7 @@ msgid "Restart & Install Updates"
msgstr "Start Ulang & Pasang Pemutakhiran" msgstr "Start Ulang & Pasang Pemutakhiran"
#: ../js/ui/endSessionDialog.js:114 #: ../js/ui/endSessionDialog.js:114
#, c-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
@ -999,13 +1053,15 @@ msgstr "Beberapa aplikasi sedang sibuk atau belum disimpan perubahannya."
msgid "Other users are logged in." msgid "Other users are logged in."
msgstr "Pengguna lain sedang log masuk." msgstr "Pengguna lain sedang log masuk."
#. Translators: Remote here refers to a remote session, like a ssh login */ #. Translators: Remote here refers to a remote session, like a ssh login
#: ../js/ui/endSessionDialog.js:479 #: ../js/ui/endSessionDialog.js:479
#, c-format
msgid "%s (remote)" msgid "%s (remote)"
msgstr "%s (jarak jauh)" msgstr "%s (jarak jauh)"
#. Translators: Console here refers to a tty like a VT console */ #. Translators: Console here refers to a tty like a VT console
#: ../js/ui/endSessionDialog.js:482 #: ../js/ui/endSessionDialog.js:482
#, c-format
msgid "%s (console)" msgid "%s (console)"
msgstr "%s (konsol)" msgstr "%s (konsol)"
@ -1014,10 +1070,11 @@ msgid "Install"
msgstr "Pasang" msgstr "Pasang"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, c-format
msgid "Download and install '%s' from extensions.gnome.org?" msgid "Download and install '%s' from extensions.gnome.org?"
msgstr "Unduh dan pasang '%s' dari extensions.gnome.org?" msgstr "Unduh dan pasang '%s' dari extensions.gnome.org?"
#: ../js/ui/keyboard.js:619 #: ../js/ui/keyboard.js:619 ../js/ui/status/keyboard.js:333
msgid "Keyboard" msgid "Keyboard"
msgstr "Papan Ketik" msgstr "Papan Ketik"
@ -1025,8 +1082,9 @@ msgstr "Papan Ketik"
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Tak ada ekstensi terpasang" msgstr "Tak ada ekstensi terpasang"
#. Translators: argument is an extension UUID. */ #. Translators: argument is an extension UUID.
#: ../js/ui/lookingGlass.js:743 #: ../js/ui/lookingGlass.js:743
#, c-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s tidak menampilkan galat apa pun." msgstr "%s tidak menampilkan galat apa pun."
@ -1042,12 +1100,9 @@ msgstr "Tampilkan Galat"
msgid "Enabled" msgid "Enabled"
msgstr "Diaktifkan" msgstr "Diaktifkan"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Dinonaktifkan" msgstr "Dinonaktifkan"
@ -1079,31 +1134,27 @@ msgstr "Buka"
msgid "Remove" msgid "Remove"
msgstr "Hapus" msgstr "Hapus"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Pemberitahuan"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Bersihkan Pesan" msgstr "Bersihkan Pesan"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Pengaturan Pemberitahuan" msgstr "Pengaturan Pemberitahuan"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Menu Baki" msgstr "Menu Baki"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Tiada Pesan" msgstr "Tiada Pesan"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Baki Pesan" msgstr "Baki Pesan"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Informasi Sistem" msgstr "Informasi Sistem"
@ -1113,6 +1164,7 @@ msgid "Unknown"
msgstr "Tak dikenal" msgstr "Tak dikenal"
#: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152 #: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152
#, c-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d pesan baru" msgstr[0] "%d pesan baru"
@ -1128,7 +1180,7 @@ msgstr "Gambaran"
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. */ #. characters.
#: ../js/ui/overview.js:258 #: ../js/ui/overview.js:258
msgid "Type to search…" msgid "Type to search…"
msgstr "Ketik untuk mencari…" msgstr "Ketik untuk mencari…"
@ -1138,16 +1190,21 @@ msgid "Quit"
msgstr "Keluar" msgstr "Keluar"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */ #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:570 #: ../js/ui/panel.js:570
msgid "Activities" msgid "Activities"
msgstr "Aktivitas" msgstr "Aktivitas"
#: ../js/ui/panel.js:904 #: ../js/ui/panel.js:903
msgid "Top Bar" msgid "Top Bar"
msgstr "Bar Atas" msgstr "Bar Atas"
# Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^ # Dirgita: Hayo, enaknya pake I/O atau ON/OFF?^^
#. Translators: this MUST be either "toggle-switch-us"
#. (for toggle switches containing the English words
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:233 #: ../js/ui/popupMenu.js:233
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1161,12 +1218,13 @@ msgid "Close"
msgstr "Tutup" msgstr "Tutup"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format */ #. long format
#: ../js/ui/screenShield.js:88 #: ../js/ui/screenShield.js:88
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#: ../js/ui/screenShield.js:154 #: ../js/ui/screenShield.js:154
#, c-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d pemberitahuan baru" msgstr[0] "%d pemberitahuan baru"
@ -1179,6 +1237,13 @@ msgstr "Kunci"
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME perlu mengunci layar" msgstr "GNOME perlu mengunci layar"
#. We could not become modal, so we can't activate the
#. screenshield. The user is probably very upset at this
#. point, but any application using global grabs is broken
#. Just tell him to stop using this app
#.
#. XXX: another option is to kick the user into the gdm login
#. screen, where we're not affected by grabs
#: ../js/ui/screenShield.js:831 ../js/ui/screenShield.js:1297 #: ../js/ui/screenShield.js:831 ../js/ui/screenShield.js:1297
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Tak bisa mengunci" msgstr "Tak bisa mengunci"
@ -1187,11 +1252,11 @@ msgstr "Tak bisa mengunci"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Kunci diblokir oleh suatu aplikasi" msgstr "Kunci diblokir oleh suatu aplikasi"
#: ../js/ui/searchDisplay.js:448 #: ../js/ui/searchDisplay.js:447
msgid "Searching…" msgid "Searching…"
msgstr "Mencari…" msgstr "Mencari…"
#: ../js/ui/searchDisplay.js:492 #: ../js/ui/searchDisplay.js:491
msgid "No results." msgid "No results."
msgstr "Tidak ada yang cocok." msgstr "Tidak ada yang cocok."
@ -1263,14 +1328,16 @@ msgstr "Kontras Tinggi"
msgid "Large Text" msgid "Large Text"
msgstr "Teks Besar" msgstr "Teks Besar"
#. The Bluetooth menu only appears when Bluetooth is in use,
#. so just statically build it with a "Turn Off" menu item.
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63 #: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63
#: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128 #: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128
#: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195 #: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1034 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Matikan" msgstr "Matikan"
@ -1279,16 +1346,19 @@ msgid "Bluetooth Settings"
msgstr "Pengaturan Bluetooth" msgstr "Pengaturan Bluetooth"
#: ../js/ui/status/bluetooth.js:58 #: ../js/ui/status/bluetooth.js:58
#, c-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "%d Perangkat Tersambung" msgstr[0] "%d Perangkat Tersambung"
#: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129 #: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129
#, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Permintaan otorisasi dari %s" msgstr "Permintaan otorisasi dari %s"
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172
#: ../js/ui/status/bluetooth.js:203 #: ../js/ui/status/bluetooth.js:203
#, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Perangkat %s ingin berpasangan dengan komputer ini" msgstr "Perangkat %s ingin berpasangan dengan komputer ini"
@ -1301,6 +1371,7 @@ msgid "Deny"
msgstr "Tolak" msgstr "Tolak"
#: ../js/ui/status/bluetooth.js:135 #: ../js/ui/status/bluetooth.js:135
#, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "Perangkat %s ingin mengakses layanan '%s'" msgstr "Perangkat %s ingin mengakses layanan '%s'"
@ -1316,18 +1387,20 @@ msgstr "Hanya untuk saat ini"
msgid "Reject" msgid "Reject"
msgstr "Tolak" msgstr "Tolak"
#. Translators: argument is the device short name */ #. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:166 #: ../js/ui/status/bluetooth.js:166
#, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Konfirmasi berpasangan untuk %s" msgstr "Konfirmasi berpasangan untuk %s"
#: ../js/ui/status/bluetooth.js:173 #: ../js/ui/status/bluetooth.js:173
#, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "" msgstr ""
"Harap konfirmasi apakah Passkey '%06d' sesuai dengan salah satu perangkat." "Harap konfirmasi apakah Passkey '%06d' sesuai dengan salah satu perangkat."
#. Translators: this is the verb, not the noun */ #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:176 #: ../js/ui/status/bluetooth.js:176
msgid "Matches" msgid "Matches"
msgstr "Cocok" msgstr "Cocok"
@ -1337,6 +1410,7 @@ msgid "Does not match"
msgstr "Tidak cocok" msgstr "Tidak cocok"
#: ../js/ui/status/bluetooth.js:196 #: ../js/ui/status/bluetooth.js:196
#, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Permintaan berpasangan untuk %s" msgstr "Permintaan berpasangan untuk %s"
@ -1352,99 +1426,91 @@ msgstr "Oke"
msgid "Brightness" msgid "Brightness"
msgstr "Kecerahan" msgstr "Kecerahan"
#: ../js/ui/status/keyboard.js:403
msgid "Show Keyboard Layout"
msgstr "Tampilkan Tata Letak Papan Tik"
#: ../js/ui/status/network.js:72 #: ../js/ui/status/network.js:72
msgid "<unknown>" msgid "<unknown>"
msgstr "<tak dikenal>" msgstr "<tak dikenal>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1049
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Mati" msgstr "Mati"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:955
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Pengaturan Jaringan"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "tak dikelola" msgstr "tak dikelola"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "memutus..." msgstr "memutus..."
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1100
msgid "connecting..." msgid "connecting..."
msgstr "menghubungi..." msgstr "menghubungi..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1103
msgid "authentication required" msgid "authentication required"
msgstr "diperlukan otentikasi" msgstr "diperlukan otentikasi"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "firmware hilang" msgstr "firmware hilang"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "tidak tersedia" msgstr "tidak tersedia"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1105
msgid "connection failed" msgid "connection failed"
msgstr "koneksi gagal" msgstr "koneksi gagal"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:654
msgid "Mobile Broadband Settings"
msgstr "Pengaturan Data Seluler"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Perangkat Keras Dinonaktifkan"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Jaringan Wi-Fi" msgstr "Jaringan Wi-Fi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:656
msgid "Select a network" msgid "Select a network"
msgstr "Pilih jaringan" msgstr "Pilih jaringan"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:680
msgid "No Networks" msgid "No Networks"
msgstr "Tiada Jaringan" msgstr "Tiada Jaringan"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:949
msgid "Select Network" msgid "Select Network"
msgstr "Pilih Jaringan" msgstr "Pilih Jaringan"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1034
msgid "Wi-Fi Settings"
msgstr "Pengaturan Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Nyalakan" msgstr "Nyalakan"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1167
msgid "Not Connected"
msgstr "Tak Tersambung"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1307
msgid "Network Manager" msgid "Network Manager"
msgstr "Manajer Jaringan" msgstr "Manajer Jaringan"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1346
msgid "Connection failed" msgid "Connection failed"
msgstr "Koneksi gagal" msgstr "Koneksi gagal"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1347
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktivasi koneksi jaringan gagal" msgstr "Aktivasi koneksi jaringan gagal"
@ -1460,18 +1526,28 @@ msgstr "Pengaturan Daya"
msgid "Fully Charged" msgid "Fully Charged"
msgstr "Terisi Penuh" msgstr "Terisi Penuh"
#. 0 is reported when UPower does not have enough data
#. to estimate battery life
#. state is one of PENDING_CHARGING, PENDING_DISCHARGING
#: ../js/ui/status/power.js:69 ../js/ui/status/power.js:86 #: ../js/ui/status/power.js:69 ../js/ui/status/power.js:86
msgid "Estimating…" msgid "Estimating…"
msgstr "Memperkirakan…" msgstr "Memperkirakan…"
#. Translators: this is <hours>:<minutes> Remaining (<percentage>)
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
msgid "%d%02d Remaining (%d%%)" #, c-format
msgstr "%d:%02d Tersisa (%d%%)" msgid "%d\\u2236%02d Remaining (%d%%)"
msgstr "%d\\u2236%02d Tersisa (%d%%)"
#. Translators: this is <hours>:<minutes> Until Full (<percentage>)
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
msgid "%d%02d Until Full (%d%%)" #, c-format
msgstr "%d:%02d Sampai Penuh (%d%%)" msgid "%d\\u2236%02d Until Full (%d%%)"
msgstr "%d\\u2236%02d Sampai Penuh (%d%%)"
#. The menu only appears when airplane mode is on, so just
#. statically build it as if it was on, rather than dynamically
#. changing the menu contents.
#: ../js/ui/status/rfkill.js:43 #: ../js/ui/status/rfkill.js:43
msgid "Airplane Mode" msgid "Airplane Mode"
msgstr "Mode Pesawat Terbang" msgstr "Mode Pesawat Terbang"
@ -1480,10 +1556,6 @@ msgstr "Mode Pesawat Terbang"
msgid "On" msgid "On"
msgstr "Nyala" msgstr "Nyala"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Pengaturan Jaringan"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Ganti Pengguna" msgstr "Ganti Pengguna"
@ -1533,6 +1605,7 @@ msgid "Search"
msgstr "Cari" msgstr "Cari"
#: ../js/ui/wanda.js:77 #: ../js/ui/wanda.js:77
#, c-format
msgid "" msgid ""
"Sorry, no wisdom for you today:\n" "Sorry, no wisdom for you today:\n"
"%s" "%s"
@ -1541,10 +1614,12 @@ msgstr ""
"%s" "%s"
#: ../js/ui/wanda.js:81 #: ../js/ui/wanda.js:81
#, c-format
msgid "%s the Oracle says" msgid "%s the Oracle says"
msgstr "%s sang Peramal berkata" msgstr "%s sang Peramal berkata"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "'%s' telah siap" msgstr "'%s' telah siap"
@ -1554,7 +1629,7 @@ msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?"
#. Translators: this and the following message should be limited in lenght, #. Translators: this and the following message should be limited in lenght,
#. to avoid ellipsizing the labels. #. to avoid ellipsizing the labels.
#. */ #.
#: ../js/ui/windowManager.js:75 #: ../js/ui/windowManager.js:75
msgid "Revert Settings" msgid "Revert Settings"
msgstr "Balikkan Tatanan" msgstr "Balikkan Tatanan"
@ -1564,6 +1639,7 @@ msgid "Keep Changes"
msgstr "Simpan Perubahan" msgstr "Simpan Perubahan"
#: ../js/ui/windowManager.js:97 #: ../js/ui/windowManager.js:97
#, c-format
msgid "Settings changes will revert in %d second" msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds" msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "Perubahan tatanan akan dikembalikan dalam %d detik" msgstr[0] "Perubahan tatanan akan dikembalikan dalam %d detik"

109
po/it.po
View File

@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-10 21:27+0000\n" "POT-Creation-Date: 2013-10-01 14:26+0000\n"
"PO-Revision-Date: 2013-10-11 09:41+0200\n" "PO-Revision-Date: 2013-10-01 19:20+0200\n"
"Last-Translator: Milo Casagrande <milo@ubuntu.com>\n" "Last-Translator: Milo Casagrande <milo@ubuntu.com>\n"
"Language-Team: Italian <tp@lists.linux.it>\n" "Language-Team: Italian <tp@lists.linux.it>\n"
"Language: it\n" "Language: it\n"
@ -290,7 +290,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Annulla" msgstr "Annulla"
@ -337,15 +337,15 @@ msgstr "Errore di autenticazione"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(o passare il dito)" msgstr "(o passare il dito)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Comando non trovato" msgstr "Comando non trovato"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Impossibile analizzare il comando:" msgstr "Impossibile analizzare il comando:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Esecuzione di «%s» non riuscita:" msgstr "Esecuzione di «%s» non riuscita:"
@ -573,16 +573,16 @@ msgstr "Apri con %s"
msgid "Eject" msgid "Eject"
msgstr "Espelli" msgstr "Espelli"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Password:" msgstr "Password:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Inserire di nuovo:" msgstr "Inserire di nuovo:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Connetti" msgstr "Connetti"
@ -1069,12 +1069,9 @@ msgid "Enabled"
msgstr "Abilitato" msgstr "Abilitato"
# (ndt) o disabilitata? # (ndt) o disabilitata?
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Disabilitato" msgstr "Disabilitato"
@ -1106,32 +1103,27 @@ msgstr "Apri"
msgid "Remove" msgid "Remove"
msgstr "Rimuovi" msgstr "Rimuovi"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
#| msgid "Notification Settings"
msgid "Notifications"
msgstr "Notifiche"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Pulisci messaggi" msgstr "Pulisci messaggi"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Impostazioni notifiche" msgstr "Impostazioni notifiche"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Menu tray" msgstr "Menu tray"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Nessun messaggio" msgstr "Nessun messaggio"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Cassetto messaggi" msgstr "Cassetto messaggi"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Informazione di sistema" msgstr "Informazione di sistema"
@ -1299,8 +1291,8 @@ msgstr "Caratteri grandi"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Spegni" msgstr "Spegni"
@ -1387,97 +1379,84 @@ msgstr "Luminosità"
msgid "<unknown>" msgid "<unknown>"
msgstr "<sconosciuto>" msgstr "<sconosciuto>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Off" msgstr "Off"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Impostazioni rete"
# FIXME o femminile? boh # FIXME o femminile? boh
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "non gestito" msgstr "non gestito"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "disconnessione..." msgstr "disconnessione..."
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "connessione..." msgstr "connessione..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "richiesta autenticazione" msgstr "richiesta autenticazione"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "firmware mancante" msgstr "firmware mancante"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "non disponibile" msgstr "non disponibile"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "connessione non riuscita" msgstr "connessione non riuscita"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
msgid "Mobile Broadband Settings"
msgstr "Impostazioni banda larga mobile"
# (ndt) o disabilitata?
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Hardware disabilitato"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Reti Wi-Fi" msgstr "Reti Wi-Fi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Seleziona una rete" msgstr "Seleziona una rete"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Nessuna rete" msgstr "Nessuna rete"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Seleziona rete" msgstr "Seleziona rete"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
msgid "Wi-Fi Settings"
msgstr "Impostazioni Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Accendi" msgstr "Accendi"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1174
msgid "Not Connected"
msgstr "Non collegato"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1314
msgid "Network Manager" msgid "Network Manager"
msgstr "Gestore reti" msgstr "Gestore reti"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1353
msgid "Connection failed" msgid "Connection failed"
msgstr "Connessione non riuscita" msgstr "Connessione non riuscita"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1354
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Attivazione della connessione di rete non riuscita" msgstr "Attivazione della connessione di rete non riuscita"
@ -1498,11 +1477,13 @@ msgid "Estimating…"
msgstr "In stima…" msgstr "In stima…"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
#| msgid "%d\\u2236%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "%d.%02d rimanente (%d%%)" msgstr "%d.%02d rimanente (%d%%)"
# in stile MacOS sarebbe "al pieno" :P # in stile MacOS sarebbe "al pieno" :P
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#| msgid "%d\\u2236%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "%d.%02d alla carica (%d%%)" msgstr "%d.%02d alla carica (%d%%)"
@ -1514,10 +1495,6 @@ msgstr "Modalità aeroplano"
msgid "On" msgid "On"
msgstr "On" msgstr "On"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Impostazioni rete"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Cambia utente" msgstr "Cambia utente"

115
po/lt.po
View File

@ -11,8 +11,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-10 21:27+0000\n" "POT-Creation-Date: 2013-09-28 19:49+0000\n"
"PO-Revision-Date: 2013-10-13 20:05+0300\n" "PO-Revision-Date: 2013-09-29 20:32+0300\n"
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n" "Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n" "Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
"Language: lt\n" "Language: lt\n"
@ -279,7 +279,7 @@ msgstr "Išskleidžiamajame sąraše pasirinkite konfigūruotiną plėtinį."
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Atsisakyti" msgstr "Atsisakyti"
@ -326,15 +326,15 @@ msgstr "Tapatybės patvirtinimo klaida"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(arba perbraukite pirštu)" msgstr "(arba perbraukite pirštu)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Komanda nerasta" msgstr "Komanda nerasta"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Nepavyko perskaityti komandos:" msgstr "Nepavyko perskaityti komandos:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Nepavyko įvykdyti „%s“:" msgstr "Nepavyko įvykdyti „%s“:"
@ -497,7 +497,7 @@ msgstr "Št"
#: ../js/ui/calendar.js:389 #: ../js/ui/calendar.js:389
msgid "calendar:MY" msgid "calendar:MY"
msgstr "calendar:YM" msgstr "calendar:MY"
#: ../js/ui/calendar.js:447 #: ../js/ui/calendar.js:447
msgid "Previous month" msgid "Previous month"
@ -560,16 +560,16 @@ msgstr "Atverti su %s"
msgid "Eject" msgid "Eject"
msgstr "Išimti" msgstr "Išimti"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Slaptažodis:" msgstr "Slaptažodis:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Įveskite dar kartą:" msgstr "Įveskite dar kartą:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Prisijungti" msgstr "Prisijungti"
@ -1050,12 +1050,9 @@ msgstr "Rodyti klaidas"
msgid "Enabled" msgid "Enabled"
msgstr "Įjungta" msgstr "Įjungta"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Išjungta" msgstr "Išjungta"
@ -1087,32 +1084,27 @@ msgstr "Atverti"
msgid "Remove" msgid "Remove"
msgstr "Pašalinti" msgstr "Pašalinti"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
#| msgid "Notification Settings"
msgid "Notifications"
msgstr "Pranešimai"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Išvalyti pranešimus" msgstr "Išvalyti pranešimus"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Pranešimų nustatymai" msgstr "Pranešimų nustatymai"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Dėklo meniu" msgstr "Dėklo meniu"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Nėra pranešimų" msgstr "Nėra pranešimų"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Pranešimų juosta" msgstr "Pranešimų juosta"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Sistemos informacija" msgstr "Sistemos informacija"
@ -1281,8 +1273,8 @@ msgstr "Didelis tekstas"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Išjungti" msgstr "Išjungti"
@ -1369,99 +1361,83 @@ msgstr "Ryškumas"
msgid "<unknown>" msgid "<unknown>"
msgstr "<nežinoma>" msgstr "<nežinoma>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Išjungta" msgstr "Išjungta"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Tinklo nustatymai"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "nevaldomas" msgstr "nevaldomas"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "atsijungiama..." msgstr "atsijungiama..."
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "jungiamasi..." msgstr "jungiamasi..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "reikia patvirtinti tapatybę" msgstr "reikia patvirtinti tapatybę"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "Trūksta integruotos programinės įrangos (firmware)" msgstr "Trūksta integruotos programinės įrangos (firmware)"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "nepasiekiamas" msgstr "nepasiekiamas"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "nepavyko prisijungti" msgstr "nepavyko prisijungti"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
#| msgid "Mobile broadband network password"
msgid "Mobile Broadband Settings"
msgstr "Mobiliojo plačiajuosčio tinklo nustatymai"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
#| msgid "Disabled"
msgid "Hardware Disabled"
msgstr "Aparatinė įranga išjungta"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Wi-Fi tinklai" msgstr "Wi-Fi tinklai"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Pasirinkite tinklą" msgstr "Pasirinkite tinklą"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Nėra tinklų" msgstr "Nėra tinklų"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Pasirinkite tinklą" msgstr "Pasirinkite tinklą"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
#| msgid "Settings"
msgid "Wi-Fi Settings"
msgstr "Belaidžio ryšio nustatymai"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Įjungti" msgstr "Įjungti"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1173
#| msgid "Connect"
msgid "Not Connected"
msgstr "Atsijungta"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1313
msgid "Network Manager" msgid "Network Manager"
msgstr "Tinklo valdymas" msgstr "Tinklo valdymas"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1352
msgid "Connection failed" msgid "Connection failed"
msgstr "Nepavyko prisijungti" msgstr "Nepavyko prisijungti"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1353
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Tinklo ryšio nepavyko aktyvuoti" msgstr "Tinklo ryšio nepavyko aktyvuoti"
@ -1482,10 +1458,12 @@ msgid "Estimating…"
msgstr "Įvertinama…" msgstr "Įvertinama…"
#: ../js/ui/status/power.js:77 #: ../js/ui/status/power.js:77
#| msgid "%d\\u2236%02d Remaining (%d%%)"
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "Liko %d%02d (%d%%)" msgstr "Liko %d%02d (%d%%)"
#: ../js/ui/status/power.js:82 #: ../js/ui/status/power.js:82
#| msgid "%d\\u2236%02d Until Full (%d%%)"
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "%d%02d iki pilno (%d%%)" msgstr "%d%02d iki pilno (%d%%)"
@ -1497,10 +1475,6 @@ msgstr "Skrydžio veiksena"
msgid "On" msgid "On"
msgstr "Įjungta" msgstr "Įjungta"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Tinklo nustatymai"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Keisti naudotoją" msgstr "Keisti naudotoją"
@ -1647,3 +1621,4 @@ msgstr "Slaptažodis negali būti tuščias"
#: ../src/shell-polkit-authentication-agent.c:343 #: ../src/shell-polkit-authentication-agent.c:343
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą" msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"

402
po/lv.po

File diff suppressed because it is too large Load Diff

765
po/nb.po

File diff suppressed because it is too large Load Diff

270
po/nl.po
View File

@ -14,10 +14,11 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"POT-Creation-Date: 2013-10-12 19:57+0200\n" "shell&keywords=I18N+L10N&component=general\n"
"PO-Revision-Date: 2013-10-12 19:59+0200\n" "POT-Creation-Date: 2013-09-14 18:10+0000\n"
"Last-Translator: Wouter Bolsterlee <wbolster@gnome.org>\n" "PO-Revision-Date: 2013-09-21 22:46+0100\n"
"Last-Translator: Reinout van Schouwen <reinouts@gnome.org>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n" "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n" "Language: nl\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -268,10 +269,6 @@ msgstr "Werkbladen dynamisch beheren"
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
msgstr "Alleen werkbladen op hoofdmonitor" msgstr "Alleen werkbladen op hoofdmonitor"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Delay focus changes in mouse mode until the pointer stops moving"
msgstr "Focus pas wijzigen nadat de muisaanwijzer is gestopt met bewegen"
#: ../js/extensionPrefs/main.js:125 #: ../js/extensionPrefs/main.js:125
#, c-format #, c-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
@ -285,10 +282,10 @@ msgstr "Uitbreiding"
msgid "Select an extension to configure using the combobox above." msgid "Select an extension to configure using the combobox above."
msgstr "Selecteer de te configureren uitbreiding uit de keuzelijst hierboven." msgstr "Selecteer de te configureren uitbreiding uit de keuzelijst hierboven."
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:132
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:686
msgid "Cancel" msgid "Cancel"
msgstr "Annuleren" msgstr "Annuleren"
@ -327,8 +324,8 @@ msgstr "(bijv. gebruiker of %s)"
#. TTLS and PEAP are actually much more complicated, but this complication #. TTLS and PEAP are actually much more complicated, but this complication
#. is not visible here since we only care about phase2 authentication #. is not visible here since we only care about phase2 authentication
#. (and don't even care of which one) #. (and don't even care of which one)
#: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:259 #: ../js/gdm/loginDialog.js:627 ../js/ui/components/networkAgent.js:255
#: ../js/ui/components/networkAgent.js:277 #: ../js/ui/components/networkAgent.js:273
msgid "Username: " msgid "Username: "
msgstr "Gebruikersnaam: " msgstr "Gebruikersnaam: "
@ -349,42 +346,42 @@ msgstr "Authenticatie mislukt"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(of vinger aanbieden)" msgstr "(of vinger aanbieden)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Opdracht niet gevonden" msgstr "Opdracht niet gevonden"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Kon opdracht niet parsen:" msgstr "Kon opdracht niet parsen:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Uitvoeren van %s mislukt:" msgstr "Uitvoeren van %s mislukt:"
#: ../js/ui/appDisplay.js:596 #: ../js/ui/appDisplay.js:598
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Vaak gebruikte toepassingen verschijnen hier" msgstr "Vaak gebruikte toepassingen verschijnen hier"
#: ../js/ui/appDisplay.js:712 #: ../js/ui/appDisplay.js:714
msgid "Frequent" msgid "Frequent"
msgstr "Vaak gebruikt" msgstr "Vaak gebruikt"
#: ../js/ui/appDisplay.js:719 #: ../js/ui/appDisplay.js:721
msgid "All" msgid "All"
msgstr "Alles" msgstr "Alles"
#: ../js/ui/appDisplay.js:1514 #: ../js/ui/appDisplay.js:1516
msgid "New Window" msgid "New Window"
msgstr "Nieuw venster" msgstr "Nieuw venster"
#: ../js/ui/appDisplay.js:1517 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:1519 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Uit favorieten verwijderen" msgstr "Uit favorieten verwijderen"
#: ../js/ui/appDisplay.js:1518 #: ../js/ui/appDisplay.js:1520
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Aan favorieten toevoegen" msgstr "Aan favorieten toevoegen"
@ -398,7 +395,7 @@ msgstr "%s is toegevoegd aan uw favorieten."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s is verwijderd uit uw favorieten." msgstr "%s is verwijderd uit uw favorieten."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:806 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:807
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Voorkeuren" msgstr "Voorkeuren"
@ -586,50 +583,50 @@ msgstr "Openen met %s"
msgid "Eject" msgid "Eject"
msgstr "Uitwerpen" msgstr "Uitwerpen"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:88 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Wachtwoord:" msgstr "Wachtwoord:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:107
msgid "Type again:" msgid "Type again:"
msgstr "Nogmaals:" msgstr "Nogmaals:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:127 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:689
msgid "Connect" msgid "Connect"
msgstr "Verbinden" msgstr "Verbinden"
#. Cisco LEAP #. Cisco LEAP
#: ../js/ui/components/networkAgent.js:222 #: ../js/ui/components/networkAgent.js:218
#: ../js/ui/components/networkAgent.js:234 #: ../js/ui/components/networkAgent.js:230
#: ../js/ui/components/networkAgent.js:261 #: ../js/ui/components/networkAgent.js:257
#: ../js/ui/components/networkAgent.js:281 #: ../js/ui/components/networkAgent.js:277
#: ../js/ui/components/networkAgent.js:291 #: ../js/ui/components/networkAgent.js:287
msgid "Password: " msgid "Password: "
msgstr "Wachtwoord:" msgstr "Wachtwoord:"
#. static WEP #. static WEP
#: ../js/ui/components/networkAgent.js:227 #: ../js/ui/components/networkAgent.js:223
msgid "Key: " msgid "Key: "
msgstr "Sleutel: " msgstr "Sleutel: "
#: ../js/ui/components/networkAgent.js:265 #: ../js/ui/components/networkAgent.js:261
msgid "Identity: " msgid "Identity: "
msgstr "Identiteit: " msgstr "Identiteit: "
#: ../js/ui/components/networkAgent.js:267 #: ../js/ui/components/networkAgent.js:263
msgid "Private key password: " msgid "Private key password: "
msgstr "Wachtwoord van privésleutel: " msgstr "Wachtwoord van privésleutel: "
#: ../js/ui/components/networkAgent.js:279 #: ../js/ui/components/networkAgent.js:275
msgid "Service: " msgid "Service: "
msgstr "Service: " msgstr "Service: "
#: ../js/ui/components/networkAgent.js:308 #: ../js/ui/components/networkAgent.js:304
msgid "Authentication required by wireless network" msgid "Authentication required by wireless network"
msgstr "Authenticatie nodig voor draadloos netwerk" msgstr "Authenticatie nodig voor draadloos netwerk"
#: ../js/ui/components/networkAgent.js:309 #: ../js/ui/components/networkAgent.js:305
#, c-format #, c-format
msgid "" msgid ""
"Passwords or encryption keys are required to access the wireless network " "Passwords or encryption keys are required to access the wireless network "
@ -638,35 +635,35 @@ msgstr ""
"Er is een wachtwoord of een sleutel voor encryptie nodig voor toegang tot " "Er is een wachtwoord of een sleutel voor encryptie nodig voor toegang tot "
"het draadloze netwerk %s." "het draadloze netwerk %s."
#: ../js/ui/components/networkAgent.js:313 #: ../js/ui/components/networkAgent.js:309
msgid "Wired 802.1X authentication" msgid "Wired 802.1X authentication"
msgstr "802.1X-authenticatie (bedraad)" msgstr "802.1X-authenticatie (bedraad)"
#: ../js/ui/components/networkAgent.js:315 #: ../js/ui/components/networkAgent.js:311
msgid "Network name: " msgid "Network name: "
msgstr "Netwerknaam: " msgstr "Netwerknaam: "
#: ../js/ui/components/networkAgent.js:320 #: ../js/ui/components/networkAgent.js:316
msgid "DSL authentication" msgid "DSL authentication"
msgstr "DSL-authenticatie" msgstr "DSL-authenticatie"
#: ../js/ui/components/networkAgent.js:327 #: ../js/ui/components/networkAgent.js:323
msgid "PIN code required" msgid "PIN code required"
msgstr "PIN-code vereist" msgstr "PIN-code vereist"
#: ../js/ui/components/networkAgent.js:328 #: ../js/ui/components/networkAgent.js:324
msgid "PIN code is needed for the mobile broadband device" msgid "PIN code is needed for the mobile broadband device"
msgstr "PIN-code vereist voor het apparaat voor mobiel breedband" msgstr "PIN-code vereist voor het apparaat voor mobiel breedband"
#: ../js/ui/components/networkAgent.js:329 #: ../js/ui/components/networkAgent.js:325
msgid "PIN: " msgid "PIN: "
msgstr "PIN: " msgstr "PIN: "
#: ../js/ui/components/networkAgent.js:335 #: ../js/ui/components/networkAgent.js:331
msgid "Mobile broadband network password" msgid "Mobile broadband network password"
msgstr "Netwerkwachtwoord voor mobiel breedband" msgstr "Netwerkwachtwoord voor mobiel breedband"
#: ../js/ui/components/networkAgent.js:336 #: ../js/ui/components/networkAgent.js:332
#, c-format #, c-format
msgid "A password is required to connect to '%s'." msgid "A password is required to connect to '%s'."
msgstr "Er is een wachtwoord nodig om met %s te verbinden." msgstr "Er is een wachtwoord nodig om met %s te verbinden."
@ -1037,14 +1034,11 @@ msgid "Restart & Install Updates"
msgstr "Opnieuw opstarten en updates installeren" msgstr "Opnieuw opstarten en updates installeren"
#: ../js/ui/endSessionDialog.js:114 #: ../js/ui/endSessionDialog.js:114
#, c-format
msgid "The system will automatically restart and install updates in %d second." msgid "The system will automatically restart and install updates in %d second."
msgid_plural "" msgid_plural ""
"The system will automatically restart and install updates in %d seconds." "The system will automatically restart and install updates in %d seconds."
msgstr[0] "" msgstr[0] "De computer zal opnieuw opstarten en updates installeren over %d seconde."
"De computer zal opnieuw opstarten en updates installeren over %d seconde." msgstr[1] "De computer zal opnieuw opstarten en updates installeren over %d seconden."
msgstr[1] ""
"De computer zal opnieuw opstarten en updates installeren over %d seconden."
#: ../js/ui/endSessionDialog.js:119 #: ../js/ui/endSessionDialog.js:119
msgctxt "button" msgctxt "button"
@ -1106,12 +1100,9 @@ msgstr "Fouten tonen"
msgid "Enabled" msgid "Enabled"
msgstr "Ingeschakeld" msgstr "Ingeschakeld"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode)
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Uitgeschakeld" msgstr "Uitgeschakeld"
@ -1143,35 +1134,31 @@ msgstr "Openen"
msgid "Remove" msgid "Remove"
msgstr "Verwijderen" msgstr "Verwijderen"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Notificaties"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Berichten wissen" msgstr "Berichten wissen"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Notificatie-instellingen" msgstr "Notificatie-instellingen"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Overzichtmenu" msgstr "Overzichtmenu"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Geen berichten" msgstr "Geen berichten"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1812
msgid "Message Tray" msgid "Message Tray"
msgstr "Berichtenoverzicht" msgstr "Berichtenoverzicht"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2787
msgid "System Information" msgid "System Information"
msgstr "Systeeminformatie" msgstr "Systeeminformatie"
#: ../js/ui/notificationDaemon.js:630 ../src/shell-app.c:396 #: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:396
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Onbekend" msgstr "Onbekend"
@ -1199,17 +1186,17 @@ msgstr "Overzicht"
msgid "Type to search…" msgid "Type to search…"
msgstr "Typ om te zoeken…" msgstr "Typ om te zoeken…"
#: ../js/ui/panel.js:516 #: ../js/ui/panel.js:518
msgid "Quit" msgid "Quit"
msgstr "Afsluiten" msgstr "Afsluiten"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". #. in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:568 #: ../js/ui/panel.js:570
msgid "Activities" msgid "Activities"
msgstr "Activiteiten" msgstr "Activiteiten"
#: ../js/ui/panel.js:900 #: ../js/ui/panel.js:903
msgid "Top Bar" msgid "Top Bar"
msgstr "Bovenbalk" msgstr "Bovenbalk"
@ -1218,7 +1205,7 @@ msgstr "Bovenbalk"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:259 #: ../js/ui/popupMenu.js:233
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1266,11 +1253,11 @@ msgstr "Kon niet vergrendelen"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Vergrendelen is door een toepassing voorkomen" msgstr "Vergrendelen is door een toepassing voorkomen"
#: ../js/ui/searchDisplay.js:448 #: ../js/ui/searchDisplay.js:447
msgid "Searching…" msgid "Searching…"
msgstr "Zoeken…" msgstr "Zoeken…"
#: ../js/ui/searchDisplay.js:492 #: ../js/ui/searchDisplay.js:491
msgid "No results." msgid "No results."
msgstr "Geen resultaten" msgstr "Geen resultaten"
@ -1302,56 +1289,56 @@ msgstr "Wachtwoord onthouden"
msgid "Accessibility" msgid "Accessibility"
msgstr "Toegankelijkheid" msgstr "Toegankelijkheid"
#: ../js/ui/status/accessibility.js:56 #: ../js/ui/status/accessibility.js:58
msgid "Zoom" msgid "Zoom"
msgstr "Zoomen" msgstr "Zoomen"
#: ../js/ui/status/accessibility.js:63 #: ../js/ui/status/accessibility.js:65
msgid "Screen Reader" msgid "Screen Reader"
msgstr "Schermlezer" msgstr "Schermlezer"
#: ../js/ui/status/accessibility.js:67 #: ../js/ui/status/accessibility.js:69
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "Schermtoetsenbord" msgstr "Schermtoetsenbord"
#: ../js/ui/status/accessibility.js:71 #: ../js/ui/status/accessibility.js:73
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Visuele alerteringen" msgstr "Visuele alerteringen"
#: ../js/ui/status/accessibility.js:74 #: ../js/ui/status/accessibility.js:76
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Plaktoetsen" msgstr "Plaktoetsen"
#: ../js/ui/status/accessibility.js:77 #: ../js/ui/status/accessibility.js:79
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Trage Toetsen" msgstr "Trage Toetsen"
#: ../js/ui/status/accessibility.js:80 #: ../js/ui/status/accessibility.js:82
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Springende toetsen" msgstr "Springende toetsen"
#: ../js/ui/status/accessibility.js:83 #: ../js/ui/status/accessibility.js:85
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Muistoetsen" msgstr "Muistoetsen"
#: ../js/ui/status/accessibility.js:142 #: ../js/ui/status/accessibility.js:144
msgid "High Contrast" msgid "High Contrast"
msgstr "Hoog contrast" msgstr "Hoog contrast"
#: ../js/ui/status/accessibility.js:191 #: ../js/ui/status/accessibility.js:193
msgid "Large Text" msgid "Large Text"
msgstr "Grote tekst" msgstr "Grote tekst"
#. The Bluetooth menu only appears when Bluetooth is in use, #. The Bluetooth menu only appears when Bluetooth is in use,
#. so just statically build it with a "Turn Off" menu item. #. so just statically build it with a "Turn Off" menu item.
#: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63 #: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:62
#: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128 #: ../js/ui/status/bluetooth.js:99 ../js/ui/status/bluetooth.js:127
#: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195 #: ../js/ui/status/bluetooth.js:163 ../js/ui/status/bluetooth.js:194
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1034 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Uitschakelen" msgstr "Uitschakelen"
@ -1359,81 +1346,79 @@ msgstr "Uitschakelen"
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Bluetooth-instellingen" msgstr "Bluetooth-instellingen"
#: ../js/ui/status/bluetooth.js:58 #: ../js/ui/status/bluetooth.js:57
#, c-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "%d Verbonden apparaat" msgstr[0] "%d Verbonden apparaat"
msgstr[1] "%d Verbonden apparaten" msgstr[1] "%d Verbonden apparaten"
#: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129 #: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Autorisatie-aanvraag van %s" msgstr "Autorisatie-aanvraag van %s"
#: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172 #: ../js/ui/status/bluetooth.js:106 ../js/ui/status/bluetooth.js:171
#: ../js/ui/status/bluetooth.js:203 #: ../js/ui/status/bluetooth.js:202
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "Het apparaat %s wil aankoppelen met deze computer" msgstr "Het apparaat %s wil aankoppelen met deze computer"
#: ../js/ui/status/bluetooth.js:109 #: ../js/ui/status/bluetooth.js:108
msgid "Allow" msgid "Allow"
msgstr "Toestaan" msgstr "Toestaan"
#: ../js/ui/status/bluetooth.js:110 #: ../js/ui/status/bluetooth.js:109
msgid "Deny" msgid "Deny"
msgstr "Weigeren" msgstr "Weigeren"
#: ../js/ui/status/bluetooth.js:135 #: ../js/ui/status/bluetooth.js:134
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "Het apparaat %s wil toegang tot de dienst %s" msgstr "Het apparaat %s wil toegang tot de dienst %s"
#: ../js/ui/status/bluetooth.js:137 #: ../js/ui/status/bluetooth.js:136
msgid "Always grant access" msgid "Always grant access"
msgstr "Altijd toestaan" msgstr "Altijd toestaan"
#: ../js/ui/status/bluetooth.js:138 #: ../js/ui/status/bluetooth.js:137
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Eenmalig toestaan" msgstr "Eenmalig toestaan"
#: ../js/ui/status/bluetooth.js:139 #: ../js/ui/status/bluetooth.js:138
msgid "Reject" msgid "Reject"
msgstr "Afwijzen" msgstr "Afwijzen"
#. Translators: argument is the device short name #. Translators: argument is the device short name
#: ../js/ui/status/bluetooth.js:166 #: ../js/ui/status/bluetooth.js:165
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Koppelbevestiging voor %s" msgstr "Koppelbevestiging voor %s"
#: ../js/ui/status/bluetooth.js:173 #: ../js/ui/status/bluetooth.js:172
#, c-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
msgstr "" msgstr
"Bevestig dat de toegangscode %06d hetzelfde is als die van het apparaat." "Bevestig dat de toegangscode %06d hetzelfde is als die van het apparaat."
#. Translators: this is the verb, not the noun #. Translators: this is the verb, not the noun
#: ../js/ui/status/bluetooth.js:176 #: ../js/ui/status/bluetooth.js:175
msgid "Matches" msgid "Matches"
msgstr "Komt overeen" msgstr "Komt overeen"
#: ../js/ui/status/bluetooth.js:177 #: ../js/ui/status/bluetooth.js:176
msgid "Does not match" msgid "Does not match"
msgstr "Komt niet overeen" msgstr "Komt niet overeen"
#: ../js/ui/status/bluetooth.js:196 #: ../js/ui/status/bluetooth.js:195
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Verzoek tot koppelen met %s" msgstr "Verzoek tot koppelen met %s"
#: ../js/ui/status/bluetooth.js:204 #: ../js/ui/status/bluetooth.js:203
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "Geef de op het apparaat aangegeven PIN-code." msgstr "Geef de op het apparaat aangegeven PIN-code."
#: ../js/ui/status/bluetooth.js:221 #: ../js/ui/status/bluetooth.js:220
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
@ -1441,7 +1426,7 @@ msgstr "OK"
msgid "Brightness" msgid "Brightness"
msgstr "Helderheid" msgstr "Helderheid"
#: ../js/ui/status/keyboard.js:401 #: ../js/ui/status/keyboard.js:403
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Toetsenbordindeling tonen" msgstr "Toetsenbordindeling tonen"
@ -1449,95 +1434,83 @@ msgstr "Toetsenbordindeling tonen"
msgid "<unknown>" msgid "<unknown>"
msgstr "<onbekend>" msgstr "<onbekend>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1049
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Uit" msgstr "Uit"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:955
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Netwerkinstellingen"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) #. under NetworkManager's control (and thus cannot be used in the menu)
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "niet gemanaged" msgstr "niet gemanaged"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "verbinding verbreken…" msgstr "verbinding verbreken…"
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1100
msgid "connecting..." msgid "connecting..."
msgstr "verbinden…" msgstr "verbinden…"
#. Translators: this is for network connections that require some kind of key or password #. Translators: this is for network connections that require some kind of key or password
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1103
msgid "authentication required" msgid "authentication required"
msgstr "authenticatie nodig" msgstr "authenticatie nodig"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing #. module, which is missing
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "firmware ontbreekt" msgstr "firmware ontbreekt"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage #. is disabled by rfkill, or it has no coverage
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "niet beschikbaar" msgstr "niet beschikbaar"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1105
msgid "connection failed" msgid "connection failed"
msgstr "verbinding mislukt" msgstr "verbinding mislukt"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:654
msgid "Mobile Broadband Settings"
msgstr "Instellingen voor mobiel breedband"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Uitgeschakeld in hardware"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Wi-Fi-netwerken" msgstr "Wi-Fi-netwerken"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:656
msgid "Select a network" msgid "Select a network"
msgstr "Selecteer een netwerk" msgstr "Selecteer een netwerk"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:680
msgid "No Networks" msgid "No Networks"
msgstr "Geen netwerken" msgstr "Geen netwerken"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:949
msgid "Select Network" msgid "Select Network"
msgstr "Selecteer netwerk" msgstr "Selecteer netwerk"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1034
msgid "Wi-Fi Settings"
msgstr "Instellingen voor Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Inschakelen" msgstr "Inschakelen"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1167
msgid "Not Connected"
msgstr "Niet verbonden"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1306
msgid "Network Manager" msgid "Network Manager"
msgstr "Netwerk-manager" msgstr "Netwerk-manager"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1345
msgid "Connection failed" msgid "Connection failed"
msgstr "Verbinding mislukt" msgstr "Verbinding mislukt"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1346
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Activeren van netwerkverbinding mislukt" msgstr "Activeren van netwerkverbinding mislukt"
@ -1583,10 +1556,6 @@ msgstr "Vliegtuigstand"
msgid "On" msgid "On"
msgstr "Aan" msgstr "Aan"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Netwerkinstellingen"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Gebruiker wisselen" msgstr "Gebruiker wisselen"
@ -1698,7 +1667,7 @@ msgid_plural "%u Inputs"
msgstr[0] "%u invoerkanaal" msgstr[0] "%u invoerkanaal"
msgstr[1] "%u invoerkanalen" msgstr[1] "%u invoerkanalen"
#: ../src/gvc/gvc-mixer-control.c:2371 #: ../src/gvc/gvc-mixer-control.c:2373
msgid "System Sounds" msgid "System Sounds"
msgstr "Systeemgeluiden" msgstr "Systeemgeluiden"
@ -1877,6 +1846,9 @@ msgstr "Authenticatievenster is door de gebruiker afgesloten"
#~ msgid "Set Up a New Device…" #~ msgid "Set Up a New Device…"
#~ msgstr "Nieuw apparaat instellen…" #~ msgstr "Nieuw apparaat instellen…"
#~ msgid "hardware disabled"
#~ msgstr "uitgeschakeld in hardware"
#~ msgid "Connection" #~ msgid "Connection"
#~ msgstr "Verbinding" #~ msgstr "Verbinding"
@ -1914,6 +1886,9 @@ msgstr "Authenticatievenster is door de gebruiker afgesloten"
#~ msgid "Auto Ethernet" #~ msgid "Auto Ethernet"
#~ msgstr "Automatisch ethernetverbinding" #~ msgstr "Automatisch ethernetverbinding"
#~ msgid "Mobile broadband"
#~ msgstr "Mobiel breedband"
#~ msgid "Auto broadband" #~ msgid "Auto broadband"
#~ msgstr "Automatische breedbandverbinding" #~ msgstr "Automatische breedbandverbinding"
@ -2011,6 +1986,9 @@ msgstr "Authenticatievenster is door de gebruiker afgesloten"
#~ msgid "Idle" #~ msgid "Idle"
#~ msgstr "Inactief" #~ msgstr "Inactief"
#~ msgid "Notifications"
#~ msgstr "Notificaties"
#~ msgid "Your chat status will be set to busy" #~ msgid "Your chat status will be set to busy"
#~ msgstr "De chatstatus zal op bezig gezet worden" #~ msgstr "De chatstatus zal op bezig gezet worden"

113
po/pl.po
View File

@ -12,8 +12,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-10-10 23:41+0200\n" "POT-Creation-Date: 2013-09-23 20:34+0200\n"
"PO-Revision-Date: 2013-10-10 23:42+0200\n" "PO-Revision-Date: 2013-09-23 20:37+0200\n"
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
"Language-Team: Polish <gnomepl@aviary.pl>\n" "Language-Team: Polish <gnomepl@aviary.pl>\n"
"Language: pl\n" "Language: pl\n"
@ -289,7 +289,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:686
msgid "Cancel" msgid "Cancel"
msgstr "Anuluj" msgstr "Anuluj"
@ -337,15 +337,15 @@ msgstr "Błąd uwierzytelniania"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(lub przeciągnięcie palca)" msgstr "(lub przeciągnięcie palca)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Nie odnaleziono polecenia" msgstr "Nie odnaleziono polecenia"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Nie można przetworzyć polecenia:" msgstr "Nie można przetworzyć polecenia:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, javascript-format #, javascript-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Wykonanie polecenia \"%s\" się nie powiodło:" msgstr "Wykonanie polecenia \"%s\" się nie powiodło:"
@ -384,7 +384,7 @@ msgstr "Program %s został dodany do ulubionych."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Program %s został usunięty z ulubionych." msgstr "Program %s został usunięty z ulubionych."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:808 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:807
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Ustawienia" msgstr "Ustawienia"
@ -575,16 +575,16 @@ msgstr "Otwórz za pomocą %s"
msgid "Eject" msgid "Eject"
msgstr "Wysuń" msgstr "Wysuń"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Hasło:" msgstr "Hasło:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Proszę wpisać ponownie:" msgstr "Proszę wpisać ponownie:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:689
msgid "Connect" msgid "Connect"
msgstr "Połącz" msgstr "Połącz"
@ -1087,12 +1087,9 @@ msgstr "Wyświetl błędy"
msgid "Enabled" msgid "Enabled"
msgstr "Włączone" msgstr "Włączone"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Wyłączone" msgstr "Wyłączone"
@ -1124,31 +1121,27 @@ msgstr "Otwórz"
msgid "Remove" msgid "Remove"
msgstr "Usuń" msgstr "Usuń"
#: ../js/ui/messageTray.js:1530 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Powiadomienia"
#: ../js/ui/messageTray.js:1537
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Wyczyść wiadomości" msgstr "Wyczyść wiadomości"
#: ../js/ui/messageTray.js:1564 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Ustawienia powiadomień" msgstr "Ustawienia powiadomień"
#: ../js/ui/messageTray.js:1617 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Menu obszaru powiadamiania" msgstr "Menu obszaru powiadamiania"
#: ../js/ui/messageTray.js:1833 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Brak wiadomości" msgstr "Brak wiadomości"
#: ../js/ui/messageTray.js:1871 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Obszar powiadamiania" msgstr "Obszar powiadamiania"
#: ../js/ui/messageTray.js:2846 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Informacje systemowe" msgstr "Informacje systemowe"
@ -1191,7 +1184,7 @@ msgstr "Zakończ"
msgid "Activities" msgid "Activities"
msgstr "Podgląd" msgstr "Podgląd"
#: ../js/ui/panel.js:904 #: ../js/ui/panel.js:903
msgid "Top Bar" msgid "Top Bar"
msgstr "Górny pasek" msgstr "Górny pasek"
@ -1237,11 +1230,11 @@ msgstr "Nie można zablokować"
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Blokowanie zostało zablokowane przez program" msgstr "Blokowanie zostało zablokowane przez program"
#: ../js/ui/searchDisplay.js:448 #: ../js/ui/searchDisplay.js:447
msgid "Searching…" msgid "Searching…"
msgstr "Wyszukiwanie…" msgstr "Wyszukiwanie…"
#: ../js/ui/searchDisplay.js:492 #: ../js/ui/searchDisplay.js:491
msgid "No results." msgid "No results."
msgstr "Brak wyników." msgstr "Brak wyników."
@ -1319,8 +1312,8 @@ msgstr "Duży tekst"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1034 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Wyłącz" msgstr "Wyłącz"
@ -1414,95 +1407,83 @@ msgstr "Jasność"
msgid "<unknown>" msgid "<unknown>"
msgstr "<nieznane>" msgstr "<nieznane>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1049
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Wyłączone" msgstr "Wyłączone"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:955
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Ustawienia sieci"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "niezarządzane" msgstr "niezarządzane"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "rozłączanie…" msgstr "rozłączanie…"
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1100
msgid "connecting..." msgid "connecting..."
msgstr "łączenie…" msgstr "łączenie…"
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1103
msgid "authentication required" msgid "authentication required"
msgstr "wymagane jest uwierzytelnienie" msgstr "wymagane jest uwierzytelnienie"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "brak oprogramowania sprzętowego" msgstr "brak oprogramowania sprzętowego"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "niedostępne" msgstr "niedostępne"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1105
msgid "connection failed" msgid "connection failed"
msgstr "połączenie się nie powiodło" msgstr "połączenie się nie powiodło"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:654
msgid "Mobile Broadband Settings"
msgstr "Ustawienia sieci komórkowej"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Sprzęt jest wyłączony"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Sieci Wi-Fi" msgstr "Sieci Wi-Fi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:656
msgid "Select a network" msgid "Select a network"
msgstr "Wybór sieci" msgstr "Wybór sieci"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:680
msgid "No Networks" msgid "No Networks"
msgstr "Brak sieci" msgstr "Brak sieci"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:949
msgid "Select Network" msgid "Select Network"
msgstr "Wybierz sieć" msgstr "Wybierz sieć"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1034
msgid "Wi-Fi Settings"
msgstr "Ustawienia sieci Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Włącz" msgstr "Włącz"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1167
msgid "Not Connected"
msgstr "Nie połączono"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1307
msgid "Network Manager" msgid "Network Manager"
msgstr "Menedżer sieci" msgstr "Menedżer sieci"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1346
msgid "Connection failed" msgid "Connection failed"
msgstr "Połączenie się nie powiodło" msgstr "Połączenie się nie powiodło"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1347
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Aktywacja połączenia sieciowego się nie powiodła" msgstr "Aktywacja połączenia sieciowego się nie powiodła"
@ -1540,10 +1521,6 @@ msgstr "Tryb samolotowy"
msgid "On" msgid "On"
msgstr "Włączone" msgstr "Włączone"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Ustawienia sieci"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Przełącz użytkownika" msgstr "Przełącz użytkownika"

519
po/pt.po

File diff suppressed because it is too large Load Diff

View File

@ -19,9 +19,9 @@ msgstr ""
"Project-Id-Version: gnome-shell\n" "Project-Id-Version: gnome-shell\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-26 13:17+0000\n" "POT-Creation-Date: 2013-09-27 16:40+0000\n"
"PO-Revision-Date: 2013-10-27 15:38-0300\n" "PO-Revision-Date: 2013-09-27 14:40-0300\n"
"Last-Translator: Rafael Ferreira <rafael.f.f1@gmail.com>\n" "Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n" "Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
"Language: pt_BR\n" "Language: pt_BR\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -291,23 +291,23 @@ msgid "Select an extension to configure using the combobox above."
msgstr "" msgstr ""
"Selecione uma extensão para configurar usando a caixa de seleção abaixo." "Selecione uma extensão para configurar usando a caixa de seleção abaixo."
#: ../js/gdm/authPrompt.js:146 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:221 ../js/ui/status/network.js:739 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/gdm/authPrompt.js:168 ../js/gdm/authPrompt.js:216 #: ../js/gdm/authPrompt.js:167 ../js/gdm/authPrompt.js:215
msgid "Next" msgid "Next"
msgstr "Próximo" msgstr "Próximo"
#: ../js/gdm/authPrompt.js:212 ../js/ui/shellMountOperation.js:403 #: ../js/gdm/authPrompt.js:211 ../js/ui/shellMountOperation.js:403
#: ../js/ui/unlockDialog.js:59 #: ../js/ui/unlockDialog.js:59
msgid "Unlock" msgid "Unlock"
msgstr "Desbloquear" msgstr "Desbloquear"
#: ../js/gdm/authPrompt.js:214 #: ../js/gdm/authPrompt.js:213
msgctxt "button" msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Entrar" msgstr "Entrar"
@ -334,23 +334,23 @@ msgstr "Nome de usuário: "
msgid "Login Window" msgid "Login Window"
msgstr "Janela de sessão" msgstr "Janela de sessão"
#: ../js/gdm/util.js:321 #: ../js/gdm/util.js:306
msgid "Authentication error" msgid "Authentication error"
msgstr "Erro de autenticação" msgstr "Erro de autenticação"
#: ../js/gdm/util.js:451 #: ../js/gdm/util.js:436
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ou deslize o dedo)" msgstr "(ou deslize o dedo)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Comando não encontrado" msgstr "Comando não encontrado"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Não foi possível analisar comando:" msgstr "Não foi possível analisar comando:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
#, javascript-format #, javascript-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "A execução de \"%s\" falhou:" msgstr "A execução de \"%s\" falhou:"
@ -367,15 +367,15 @@ msgstr "Frequente"
msgid "All" msgid "All"
msgstr "Todos" msgstr "Todos"
#: ../js/ui/appDisplay.js:1523 #: ../js/ui/appDisplay.js:1514
msgid "New Window" msgid "New Window"
msgstr "Nova janela" msgstr "Nova janela"
#: ../js/ui/appDisplay.js:1526 ../js/ui/dash.js:284 #: ../js/ui/appDisplay.js:1517 ../js/ui/dash.js:284
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Remover dos favoritos" msgstr "Remover dos favoritos"
#: ../js/ui/appDisplay.js:1527 #: ../js/ui/appDisplay.js:1518
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Adicionar aos favoritos" msgstr "Adicionar aos favoritos"
@ -389,7 +389,7 @@ msgstr "%s foi adicionado aos seus favoritos."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "%s foi removido dos seus favoritos." msgstr "%s foi removido dos seus favoritos."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:806 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:808
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Configurações" msgstr "Configurações"
@ -581,16 +581,16 @@ msgstr "Abrir com %s"
msgid "Eject" msgid "Eject"
msgstr "Ejetar" msgstr "Ejetar"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Senha:" msgstr "Senha:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Digite novamente:" msgstr "Digite novamente:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:132 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:295 ../js/ui/status/network.js:742 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Conectar" msgstr "Conectar"
@ -684,60 +684,60 @@ msgstr "Autenticação"
msgid "Sorry, that didn't work. Please try again." msgid "Sorry, that didn't work. Please try again."
msgstr "Desculpe, isto não funcionou. Por favor, tente novamente." msgstr "Desculpe, isto não funcionou. Por favor, tente novamente."
#: ../js/ui/components/telepathyClient.js:237 #: ../js/ui/components/telepathyClient.js:238
msgid "Invitation" msgid "Invitation"
msgstr "Convite" msgstr "Convite"
#: ../js/ui/components/telepathyClient.js:297 #: ../js/ui/components/telepathyClient.js:298
msgid "Call" msgid "Call"
msgstr "Chamada" msgstr "Chamada"
#: ../js/ui/components/telepathyClient.js:313 #: ../js/ui/components/telepathyClient.js:314
msgid "File Transfer" msgid "File Transfer"
msgstr "Transferência de arquivo" msgstr "Transferência de arquivo"
#: ../js/ui/components/telepathyClient.js:417 #: ../js/ui/components/telepathyClient.js:418
msgid "Chat" msgid "Chat"
msgstr "Conversar" msgstr "Conversar"
#: ../js/ui/components/telepathyClient.js:479 #: ../js/ui/components/telepathyClient.js:480
msgid "Unmute" msgid "Unmute"
msgstr "Ativar áudio" msgstr "Ativar áudio"
#: ../js/ui/components/telepathyClient.js:479 #: ../js/ui/components/telepathyClient.js:480
msgid "Mute" msgid "Mute"
msgstr "Sem áudio" msgstr "Sem áudio"
#. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"*/ #. Translators: this is the word "Yesterday" followed by a time string. i.e. "Yesterday, 14:30"*/
#: ../js/ui/components/telepathyClient.js:941 #: ../js/ui/components/telepathyClient.js:942
msgid "<b>Yesterday</b>, <b>%H:%M</b>" msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgstr "<b>Ontem</b>, <b>%H:%M</b>" msgstr "<b>Ontem</b>, <b>%H:%M</b>"
#. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30*/ #. Translators: this is the week day name followed by a time string. i.e. "Monday, 14:30*/
#: ../js/ui/components/telepathyClient.js:947 #: ../js/ui/components/telepathyClient.js:948
msgid "<b>%A</b>, <b>%H:%M</b>" msgid "<b>%A</b>, <b>%H:%M</b>"
msgstr "<b>%A</b>, <b>%H:%M</b>" msgstr "<b>%A</b>, <b>%H:%M</b>"
#. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"*/ #. Translators: this is the month name and day number followed by a time string. i.e. "May 25, 14:30"*/
#: ../js/ui/components/telepathyClient.js:952 #: ../js/ui/components/telepathyClient.js:953
msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>" msgid "<b>%B</b> <b>%d</b>, <b>%H:%M</b>"
msgstr "<b>%d</b> de <b>%B</b>, às <b>%H:%M</b>" msgstr "<b>%d</b> de <b>%B</b>, às <b>%H:%M</b>"
#. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"*/ #. Translators: this is the month name, day number, year number followed by a time string. i.e. "May 25 2012, 14:30"*/
#: ../js/ui/components/telepathyClient.js:956 #: ../js/ui/components/telepathyClient.js:957
msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> " msgid "<b>%B</b> <b>%d</b> <b>%Y</b>, <b>%H:%M</b> "
msgstr "<b>%d</b> de <b>%B</b> de <b>%Y</b>, às <b>%H:%M</b> " msgstr "<b>%d</b> de <b>%B</b> de <b>%Y</b>, às <b>%H:%M</b> "
#. Translators: this is the other person changing their old IM name to their new #. Translators: this is the other person changing their old IM name to their new
#. IM name. */ #. IM name. */
#: ../js/ui/components/telepathyClient.js:985 #: ../js/ui/components/telepathyClient.js:986
#, javascript-format #, javascript-format
msgid "%s is now known as %s" msgid "%s is now known as %s"
msgstr "%s agora é conhecido como %s" msgstr "%s agora é conhecido como %s"
#. translators: argument is a room name like #. translators: argument is a room name like
#. * room@jabber.org for example. */ #. * room@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1088 #: ../js/ui/components/telepathyClient.js:1089
#, javascript-format #, javascript-format
msgid "Invitation to %s" msgid "Invitation to %s"
msgstr "Convite para %s" msgstr "Convite para %s"
@ -745,38 +745,38 @@ msgstr "Convite para %s"
#. translators: first argument is the name of a contact and the second #. translators: first argument is the name of a contact and the second
#. * one the name of a room. "Alice is inviting you to join room@jabber.org #. * one the name of a room. "Alice is inviting you to join room@jabber.org
#. * for example. */ #. * for example. */
#: ../js/ui/components/telepathyClient.js:1096 #: ../js/ui/components/telepathyClient.js:1097
#, javascript-format #, javascript-format
msgid "%s is inviting you to join %s" msgid "%s is inviting you to join %s"
msgstr "%s está convidando você para participar de %s" msgstr "%s está convidando você para participar de %s"
#: ../js/ui/components/telepathyClient.js:1098 #: ../js/ui/components/telepathyClient.js:1099
#: ../js/ui/components/telepathyClient.js:1139 #: ../js/ui/components/telepathyClient.js:1140
#: ../js/ui/components/telepathyClient.js:1179 #: ../js/ui/components/telepathyClient.js:1180
#: ../js/ui/components/telepathyClient.js:1242 #: ../js/ui/components/telepathyClient.js:1243
msgid "Decline" msgid "Decline"
msgstr "Recusar" msgstr "Recusar"
#: ../js/ui/components/telepathyClient.js:1099 #: ../js/ui/components/telepathyClient.js:1100
#: ../js/ui/components/telepathyClient.js:1180 #: ../js/ui/components/telepathyClient.js:1181
#: ../js/ui/components/telepathyClient.js:1243 #: ../js/ui/components/telepathyClient.js:1244
msgid "Accept" msgid "Accept"
msgstr "Aceitar" msgstr "Aceitar"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1129 #: ../js/ui/components/telepathyClient.js:1130
#, javascript-format #, javascript-format
msgid "Video call from %s" msgid "Video call from %s"
msgstr "Chamada de vídeo para %s" msgstr "Chamada de vídeo para %s"
#. translators: argument is a contact name like Alice for example. */ #. translators: argument is a contact name like Alice for example. */
#: ../js/ui/components/telepathyClient.js:1132 #: ../js/ui/components/telepathyClient.js:1133
#, javascript-format #, javascript-format
msgid "Call from %s" msgid "Call from %s"
msgstr "Chamada de %s" msgstr "Chamada de %s"
#. translators: this is a button label (verb), not a noun */ #. translators: this is a button label (verb), not a noun */
#: ../js/ui/components/telepathyClient.js:1141 #: ../js/ui/components/telepathyClient.js:1142
msgid "Answer" msgid "Answer"
msgstr "Atender" msgstr "Atender"
@ -785,110 +785,110 @@ msgstr "Atender"
#. * file name. The string will be something #. * file name. The string will be something
#. * like: "Alice is sending you test.ogg" #. * like: "Alice is sending you test.ogg"
#. */ #. */
#: ../js/ui/components/telepathyClient.js:1173 #: ../js/ui/components/telepathyClient.js:1174
#, javascript-format #, javascript-format
msgid "%s is sending you %s" msgid "%s is sending you %s"
msgstr "%s está enviando %s" msgstr "%s está enviando %s"
#. To translators: The parameter is the contact's alias */ #. To translators: The parameter is the contact's alias */
#: ../js/ui/components/telepathyClient.js:1208 #: ../js/ui/components/telepathyClient.js:1209
#, javascript-format #, javascript-format
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s quer permissão para vê-lo quando conectado" msgstr "%s quer permissão para vê-lo quando conectado"
#: ../js/ui/components/telepathyClient.js:1300 #: ../js/ui/components/telepathyClient.js:1301
msgid "Network error" msgid "Network error"
msgstr "Erro de rede" msgstr "Erro de rede"
#: ../js/ui/components/telepathyClient.js:1302 #: ../js/ui/components/telepathyClient.js:1303
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Falha de autenticação" msgstr "Falha de autenticação"
#: ../js/ui/components/telepathyClient.js:1304 #: ../js/ui/components/telepathyClient.js:1305
msgid "Encryption error" msgid "Encryption error"
msgstr "Erro de criptografia" msgstr "Erro de criptografia"
#: ../js/ui/components/telepathyClient.js:1306 #: ../js/ui/components/telepathyClient.js:1307
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Certificado não fornecido" msgstr "Certificado não fornecido"
#: ../js/ui/components/telepathyClient.js:1308 #: ../js/ui/components/telepathyClient.js:1309
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Certificado não confiável" msgstr "Certificado não confiável"
#: ../js/ui/components/telepathyClient.js:1310 #: ../js/ui/components/telepathyClient.js:1311
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Certificado expirado" msgstr "Certificado expirado"
#: ../js/ui/components/telepathyClient.js:1312 #: ../js/ui/components/telepathyClient.js:1313
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Certificado não ativado" msgstr "Certificado não ativado"
#: ../js/ui/components/telepathyClient.js:1314 #: ../js/ui/components/telepathyClient.js:1315
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Máquina do certificado não confere" msgstr "Máquina do certificado não confere"
#: ../js/ui/components/telepathyClient.js:1316 #: ../js/ui/components/telepathyClient.js:1317
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Impressão digital do certificado não confere" msgstr "Impressão digital do certificado não confere"
#: ../js/ui/components/telepathyClient.js:1318 #: ../js/ui/components/telepathyClient.js:1319
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Certificado auto-assinado" msgstr "Certificado auto-assinado"
#: ../js/ui/components/telepathyClient.js:1320 #: ../js/ui/components/telepathyClient.js:1321
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "O status está definido como desconectado." msgstr "O status está definido como desconectado."
#: ../js/ui/components/telepathyClient.js:1322 #: ../js/ui/components/telepathyClient.js:1323
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Criptografia não disponível" msgstr "Criptografia não disponível"
#: ../js/ui/components/telepathyClient.js:1324 #: ../js/ui/components/telepathyClient.js:1325
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "O certificado é inválido" msgstr "O certificado é inválido"
#: ../js/ui/components/telepathyClient.js:1326 #: ../js/ui/components/telepathyClient.js:1327
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "A conexão foi recusada" msgstr "A conexão foi recusada"
#: ../js/ui/components/telepathyClient.js:1328 #: ../js/ui/components/telepathyClient.js:1329
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "A conexão não pode ser estabelecida" msgstr "A conexão não pode ser estabelecida"
#: ../js/ui/components/telepathyClient.js:1330 #: ../js/ui/components/telepathyClient.js:1331
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Conexão perdida" msgstr "Conexão perdida"
#: ../js/ui/components/telepathyClient.js:1332 #: ../js/ui/components/telepathyClient.js:1333
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Esta conta já está conectada ao servidor" msgstr "Esta conta já está conectada ao servidor"
#: ../js/ui/components/telepathyClient.js:1334 #: ../js/ui/components/telepathyClient.js:1335
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "A conexão foi substituída por uma nova conexão usando o mesmo recurso" msgstr "A conexão foi substituída por uma nova conexão usando o mesmo recurso"
#: ../js/ui/components/telepathyClient.js:1336 #: ../js/ui/components/telepathyClient.js:1337
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "A conta já existe no servidor" msgstr "A conta já existe no servidor"
#: ../js/ui/components/telepathyClient.js:1338 #: ../js/ui/components/telepathyClient.js:1339
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "O servidor está atualmente muito ocupado para controlar a conexão" msgstr "O servidor está atualmente muito ocupado para controlar a conexão"
#: ../js/ui/components/telepathyClient.js:1340 #: ../js/ui/components/telepathyClient.js:1341
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "O certificado foi revogado" msgstr "O certificado foi revogado"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1343
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"O certificado usa um algoritmo de cifragem inseguro ou é criptograficamente " "O certificado usa um algoritmo de cifragem inseguro ou é criptograficamente "
"fraco" "fraco"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1345
msgid "" msgid ""
"The length of the server certificate, or the depth of the server certificate " "The length of the server certificate, or the depth of the server certificate "
"chain, exceed the limits imposed by the cryptography library" "chain, exceed the limits imposed by the cryptography library"
@ -896,22 +896,22 @@ msgstr ""
"O comprimento do certificado do servidor, ou a profundidade da cadeia do " "O comprimento do certificado do servidor, ou a profundidade da cadeia do "
"certificado excedeu os limites impostos pela biblioteca de criptografia" "certificado excedeu os limites impostos pela biblioteca de criptografia"
#: ../js/ui/components/telepathyClient.js:1346 #: ../js/ui/components/telepathyClient.js:1347
msgid "Internal error" msgid "Internal error"
msgstr "Erro interno" msgstr "Erro interno"
#. translators: argument is the account name, like #. translators: argument is the account name, like
#. * name@jabber.org for example. */ #. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1356 #: ../js/ui/components/telepathyClient.js:1357
#, javascript-format #, javascript-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Não foi possível conectar-se a %s" msgstr "Não foi possível conectar-se a %s"
#: ../js/ui/components/telepathyClient.js:1361 #: ../js/ui/components/telepathyClient.js:1362
msgid "View account" msgid "View account"
msgstr "Visualizar conta" msgstr "Visualizar conta"
#: ../js/ui/components/telepathyClient.js:1400 #: ../js/ui/components/telepathyClient.js:1401
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Razão desconhecida" msgstr "Razão desconhecida"
@ -1088,12 +1088,9 @@ msgstr "Exibir erros"
msgid "Enabled" msgid "Enabled"
msgstr "Habilitado" msgstr "Habilitado"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:472 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Desabilitado" msgstr "Desabilitado"
@ -1117,48 +1114,44 @@ msgstr "Ver fonte"
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: ../js/ui/messageTray.js:1347 #: ../js/ui/messageTray.js:1222
msgid "Open" msgid "Open"
msgstr "Abrir" msgstr "Abrir"
#: ../js/ui/messageTray.js:1354 #: ../js/ui/messageTray.js:1229
msgid "Remove" msgid "Remove"
msgstr "Remover" msgstr "Remover"
#: ../js/ui/messageTray.js:1657 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Notificações"
#: ../js/ui/messageTray.js:1664
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Sem mensagens" msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1683 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Configurações de notificação" msgstr "Configurações de Notificação"
#: ../js/ui/messageTray.js:1736 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Menu de notificação" msgstr "Menu de notificação"
#: ../js/ui/messageTray.js:1952 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Sem mensagens" msgstr "Sem mensagens"
#: ../js/ui/messageTray.js:1990 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Área de notificação" msgstr "Área de notificação"
#: ../js/ui/messageTray.js:2965 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Informações do sistema" msgstr "Informações do sistema"
#: ../js/ui/notificationDaemon.js:510 ../src/shell-app.c:396 #: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:396
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Desconhecido" msgstr "Desconhecido"
#: ../js/ui/overviewControls.js:488 ../js/ui/screenShield.js:153 #: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152
#, javascript-format #, javascript-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
@ -1181,21 +1174,21 @@ msgstr "Panorama"
msgid "Type to search…" msgid "Type to search…"
msgstr "Digite para pesquisar…" msgstr "Digite para pesquisar…"
#: ../js/ui/panel.js:516 #: ../js/ui/panel.js:518
msgid "Quit" msgid "Quit"
msgstr "Sair" msgstr "Sair"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */ #. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:568 #: ../js/ui/panel.js:570
msgid "Activities" msgid "Activities"
msgstr "Atividades" msgstr "Atividades"
#: ../js/ui/panel.js:900 #: ../js/ui/panel.js:904
msgid "Top Bar" msgid "Top Bar"
msgstr "Barra superior" msgstr "Barra superior"
#: ../js/ui/popupMenu.js:260 #: ../js/ui/popupMenu.js:233
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1209,30 +1202,30 @@ msgstr "Fechar"
#. Translators: This is a time format for a date in #. Translators: This is a time format for a date in
#. long format */ #. long format */
#: ../js/ui/screenShield.js:89 #: ../js/ui/screenShield.js:88
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d de %B" msgstr "%A, %d de %B"
#: ../js/ui/screenShield.js:155 #: ../js/ui/screenShield.js:154
#, javascript-format #, javascript-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "%d nova notificação" msgstr[0] "%d nova notificação"
msgstr[1] "%d novas notificações" msgstr[1] "%d novas notificações"
#: ../js/ui/screenShield.js:478 ../js/ui/status/system.js:333 #: ../js/ui/screenShield.js:477 ../js/ui/status/system.js:333
msgid "Lock" msgid "Lock"
msgstr "Bloquear" msgstr "Bloquear"
#: ../js/ui/screenShield.js:712 #: ../js/ui/screenShield.js:704
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME precisa bloquear a tela" msgstr "GNOME precisa bloquear a tela"
#: ../js/ui/screenShield.js:839 ../js/ui/screenShield.js:1305 #: ../js/ui/screenShield.js:831 ../js/ui/screenShield.js:1297
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Não foi possível bloquear" msgstr "Não foi possível bloquear"
#: ../js/ui/screenShield.js:840 ../js/ui/screenShield.js:1306 #: ../js/ui/screenShield.js:832 ../js/ui/screenShield.js:1298
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "O bloqueio foi impedido por um aplicativo" msgstr "O bloqueio foi impedido por um aplicativo"
@ -1272,111 +1265,111 @@ msgstr "Lembrar senha"
msgid "Accessibility" msgid "Accessibility"
msgstr "Acessibilidade" msgstr "Acessibilidade"
#: ../js/ui/status/accessibility.js:56 #: ../js/ui/status/accessibility.js:58
msgid "Zoom" msgid "Zoom"
msgstr "Ampliador" msgstr "Ampliador"
#: ../js/ui/status/accessibility.js:63 #: ../js/ui/status/accessibility.js:65
msgid "Screen Reader" msgid "Screen Reader"
msgstr "Leitor de tela" msgstr "Leitor de tela"
#: ../js/ui/status/accessibility.js:67 #: ../js/ui/status/accessibility.js:69
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "Teclado de tela" msgstr "Teclado de tela"
#: ../js/ui/status/accessibility.js:71 #: ../js/ui/status/accessibility.js:73
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Alertas visuais" msgstr "Alertas visuais"
#: ../js/ui/status/accessibility.js:74 #: ../js/ui/status/accessibility.js:76
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Teclas de aderência" msgstr "Teclas de aderência"
#: ../js/ui/status/accessibility.js:77 #: ../js/ui/status/accessibility.js:79
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Teclas lentas" msgstr "Teclas lentas"
#: ../js/ui/status/accessibility.js:80 #: ../js/ui/status/accessibility.js:82
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Teclas de repercussão" msgstr "Teclas de repercussão"
#: ../js/ui/status/accessibility.js:83 #: ../js/ui/status/accessibility.js:85
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Teclas do mouse" msgstr "Teclas do mouse"
#: ../js/ui/status/accessibility.js:142 #: ../js/ui/status/accessibility.js:144
msgid "High Contrast" msgid "High Contrast"
msgstr "Alto contraste" msgstr "Alto contraste"
#: ../js/ui/status/accessibility.js:191 #: ../js/ui/status/accessibility.js:193
msgid "Large Text" msgid "Large Text"
msgstr "Texto grande" msgstr "Texto grande"
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:62 #: ../js/ui/status/bluetooth.js:28 ../js/ui/status/bluetooth.js:63
#: ../js/ui/status/bluetooth.js:99 ../js/ui/status/bluetooth.js:127 #: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128
#: ../js/ui/status/bluetooth.js:163 ../js/ui/status/bluetooth.js:194 #: ../js/ui/status/bluetooth.js:164 ../js/ui/status/bluetooth.js:195
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:29 ../js/ui/status/network.js:132 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1099 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Desligar" msgstr "Desligar"
#: ../js/ui/status/bluetooth.js:32 #: ../js/ui/status/bluetooth.js:33
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Configurações de Bluetooth" msgstr "Configurações de Bluetooth"
#: ../js/ui/status/bluetooth.js:57 #: ../js/ui/status/bluetooth.js:58
#, javascript-format #, javascript-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "%d dispositivo conectado" msgstr[0] "%d dispositivo conectado"
msgstr[1] "%d dispositivos conectados" msgstr[1] "%d dispositivos conectados"
#: ../js/ui/status/bluetooth.js:100 ../js/ui/status/bluetooth.js:128 #: ../js/ui/status/bluetooth.js:101 ../js/ui/status/bluetooth.js:129
#, javascript-format #, javascript-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "Autorização requisitada de %s" msgstr "Autorização requisitada de %s"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/bluetooth.js:171 #: ../js/ui/status/bluetooth.js:107 ../js/ui/status/bluetooth.js:172
#: ../js/ui/status/bluetooth.js:202 #: ../js/ui/status/bluetooth.js:203
#, javascript-format #, javascript-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "O dispositivo %s deseja parear com este computador" msgstr "O dispositivo %s deseja parear com este computador"
#: ../js/ui/status/bluetooth.js:108 #: ../js/ui/status/bluetooth.js:109
msgid "Allow" msgid "Allow"
msgstr "Permitir" msgstr "Permitir"
#: ../js/ui/status/bluetooth.js:109 #: ../js/ui/status/bluetooth.js:110
msgid "Deny" msgid "Deny"
msgstr "Negar" msgstr "Negar"
#: ../js/ui/status/bluetooth.js:134 #: ../js/ui/status/bluetooth.js:135
#, javascript-format #, javascript-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "O dispositivo %s deseja acessar o serviço \"%s\"" msgstr "O dispositivo %s deseja acessar o serviço \"%s\""
#: ../js/ui/status/bluetooth.js:136 #: ../js/ui/status/bluetooth.js:137
msgid "Always grant access" msgid "Always grant access"
msgstr "Sempre permitir acesso" msgstr "Sempre permitir acesso"
#: ../js/ui/status/bluetooth.js:137 #: ../js/ui/status/bluetooth.js:138
msgid "Grant this time only" msgid "Grant this time only"
msgstr "Permitir apenas desta vez" msgstr "Permitir apenas desta vez"
#: ../js/ui/status/bluetooth.js:138 #: ../js/ui/status/bluetooth.js:139
msgid "Reject" msgid "Reject"
msgstr "Rejeitar" msgstr "Rejeitar"
#. Translators: argument is the device short name */ #. Translators: argument is the device short name */
#: ../js/ui/status/bluetooth.js:165 #: ../js/ui/status/bluetooth.js:166
#, javascript-format #, javascript-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "Confirmação de pareamento para %s" msgstr "Confirmação de pareamento para %s"
#: ../js/ui/status/bluetooth.js:172 #: ../js/ui/status/bluetooth.js:173
#, javascript-format #, javascript-format
msgid "" msgid ""
"Please confirm whether the Passkey '%06d' matches the one on the device." "Please confirm whether the Passkey '%06d' matches the one on the device."
@ -1385,24 +1378,24 @@ msgstr ""
"dispositivo." "dispositivo."
#. Translators: this is the verb, not the noun */ #. Translators: this is the verb, not the noun */
#: ../js/ui/status/bluetooth.js:175 #: ../js/ui/status/bluetooth.js:176
msgid "Matches" msgid "Matches"
msgstr "Corresponde" msgstr "Corresponde"
#: ../js/ui/status/bluetooth.js:176 #: ../js/ui/status/bluetooth.js:177
msgid "Does not match" msgid "Does not match"
msgstr "Não corresponde" msgstr "Não corresponde"
#: ../js/ui/status/bluetooth.js:195 #: ../js/ui/status/bluetooth.js:196
#, javascript-format #, javascript-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "Requisição de pareamento para %s" msgstr "Requisição de pareamento para %s"
#: ../js/ui/status/bluetooth.js:203 #: ../js/ui/status/bluetooth.js:204
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "Por favor, informe o PIN mencionado no dispositivo." msgstr "Por favor, informe o PIN mencionado no dispositivo."
#: ../js/ui/status/bluetooth.js:220 #: ../js/ui/status/bluetooth.js:221
msgid "OK" msgid "OK"
msgstr "OK" msgstr "OK"
@ -1410,100 +1403,87 @@ msgstr "OK"
msgid "Brightness" msgid "Brightness"
msgstr "Brilho" msgstr "Brilho"
#: ../js/ui/status/network.js:71 #: ../js/ui/status/network.js:72
msgid "<unknown>" msgid "<unknown>"
msgstr "<desconhecido>" msgstr "<desconhecido>"
# Referente ao estado "desligado" da rede. #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:222 ../js/ui/status/network.js:379
#: ../js/ui/status/network.js:1120
msgid "Off" msgid "Off"
msgstr "Desligado" msgstr "Desligar"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Configurações de rede"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:385 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "não gerenciado" msgstr "não gerenciado"
#: ../js/ui/status/network.js:387 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "desconectando..." msgstr "desconectando..."
#: ../js/ui/status/network.js:393 ../js/ui/status/network.js:1174 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "conectando..." msgstr "conectando..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:396 ../js/ui/status/network.js:1177 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "autenticação necessária" msgstr "autenticação necessária"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:404 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "firmware faltando" msgstr "firmware faltando"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:408 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "indisponível" msgstr "indisponível"
#: ../js/ui/status/network.js:410 ../js/ui/status/network.js:1179 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "conexão falhou" msgstr "conexão falhou"
#: ../js/ui/status/network.js:426 ../js/ui/status/network.js:512 #: ../js/ui/status/network.js:660
msgid "Mobile Broadband Settings"
msgstr "Configurações de banda larga móvel"
#: ../js/ui/status/network.js:468 ../js/ui/status/network.js:1118
msgid "Hardware Disabled"
msgstr "Hardware desabilitado"
#: ../js/ui/status/network.js:707
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Redes Wi-Fi" msgstr "Redes Wi-Fi"
#: ../js/ui/status/network.js:709 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Selecione uma rede" msgstr "Selecione uma rede"
#: ../js/ui/status/network.js:733 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Nenhuma rede" msgstr "Nenhuma rede"
#: ../js/ui/status/network.js:1005 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Selecione a rede" msgstr "Selecione a rede"
#: ../js/ui/status/network.js:1011 #: ../js/ui/status/network.js:1040
msgid "Wi-Fi Settings"
msgstr "Configurações de Wi-Fi"
#: ../js/ui/status/network.js:1099
msgid "Turn On" msgid "Turn On"
msgstr "Ligar" msgstr "Ligar"
#: ../js/ui/status/network.js:1122 #: ../js/ui/status/network.js:1173
msgid "Not Connected"
msgstr "Não conectado"
#: ../js/ui/status/network.js:1242
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1382 #: ../js/ui/status/network.js:1313
msgid "Network Manager" msgid "Network Manager"
msgstr "Gerenciador de rede" msgstr "Gerenciador de rede"
#: ../js/ui/status/network.js:1421 #: ../js/ui/status/network.js:1352
msgid "Connection failed" msgid "Connection failed"
msgstr "Falha de conexão" msgstr "Falha de conexão"
#: ../js/ui/status/network.js:1422 #: ../js/ui/status/network.js:1353
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Falha ao ativar a conexão da rede" msgstr "Falha ao ativar a conexão da rede"
@ -1541,10 +1521,6 @@ msgstr "Modo avião"
msgid "On" msgid "On"
msgstr "On" msgstr "On"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Configurações de rede"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Alternar usuário" msgstr "Alternar usuário"
@ -1840,6 +1816,9 @@ msgstr "O diálogo de autenticação foi descartado pelo usuário"
#~ msgid "Set Up a New Device…" #~ msgid "Set Up a New Device…"
#~ msgstr "Configurar um novo dispositivo…" #~ msgstr "Configurar um novo dispositivo…"
#~ msgid "hardware disabled"
#~ msgstr "hardware desabilitado"
#~ msgid "Connection" #~ msgid "Connection"
#~ msgstr "Conexão" #~ msgstr "Conexão"
@ -1858,5 +1837,8 @@ msgstr "O diálogo de autenticação foi descartado pelo usuário"
#~ msgid "Wired" #~ msgid "Wired"
#~ msgstr "Cabeada" #~ msgstr "Cabeada"
#~ msgid "Mobile broadband"
#~ msgstr "Banda larga móvel"
#~ msgid "Networking is disabled" #~ msgid "Networking is disabled"
#~ msgstr "Rede está desabilitada" #~ msgstr "Rede está desabilitada"

1301
po/ru.po

File diff suppressed because it is too large Load Diff

152
po/sl.po
View File

@ -9,8 +9,8 @@ msgstr ""
"Project-Id-Version: gnome-shell master\n" "Project-Id-Version: gnome-shell master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2013-10-13 20:43+0000\n" "POT-Creation-Date: 2013-09-28 14:39+0000\n"
"PO-Revision-Date: 2013-10-13 23:39+0100\n" "PO-Revision-Date: 2013-09-28 21:46+0100\n"
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
"Language: Slovenian\n" "Language: Slovenian\n"
@ -279,7 +279,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:145 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351 #: ../js/ui/components/polkitAgent.js:161 ../js/ui/endSessionDialog.js:351
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:728 #: ../js/ui/status/bluetooth.js:222 ../js/ui/status/network.js:692
msgid "Cancel" msgid "Cancel"
msgstr "Prekliči" msgstr "Prekliči"
@ -326,15 +326,15 @@ msgstr "Napaka overitve"
msgid "(or swipe finger)" msgid "(or swipe finger)"
msgstr "(ali pa povlecite prst)" msgstr "(ali pa povlecite prst)"
#: ../js/misc/util.js:115 #: ../js/misc/util.js:98
msgid "Command not found" msgid "Command not found"
msgstr "Ukaz ni mogoče najti" msgstr "Ukaz ni mogoče najti"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:131
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Ukaza ni mogoče razčleniti:" msgstr "Ukaza ni mogoče razčleniti:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:139
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "Izvedba '%s' je spodletela:" msgstr "Izvedba '%s' je spodletela:"
@ -370,7 +370,7 @@ msgstr "Program \"%s\" je dodan med priljubljeno."
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "Program \"%s\" je odstranjen iz priljubljenih." msgstr "Program \"%s\" je odstranjen iz priljubljenih."
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:806 #: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:808
#: ../js/ui/status/system.js:325 #: ../js/ui/status/system.js:325
msgid "Settings" msgid "Settings"
msgstr "Nastavitve" msgstr "Nastavitve"
@ -560,16 +560,16 @@ msgstr "Odpri s programom %s"
msgid "Eject" msgid "Eject"
msgstr "Izvrzi" msgstr "Izvrzi"
#: ../js/ui/components/keyring.js:89 ../js/ui/components/polkitAgent.js:280 #: ../js/ui/components/keyring.js:91 ../js/ui/components/polkitAgent.js:280
msgid "Password:" msgid "Password:"
msgstr "Geslo:" msgstr "Geslo:"
#: ../js/ui/components/keyring.js:108 #: ../js/ui/components/keyring.js:110
msgid "Type again:" msgid "Type again:"
msgstr "Vpišite znova:" msgstr "Vpišite znova:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:133 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:296 ../js/ui/status/network.js:731 #: ../js/ui/status/network.js:275 ../js/ui/status/network.js:695
msgid "Connect" msgid "Connect"
msgstr "Poveži" msgstr "Poveži"
@ -1057,12 +1057,9 @@ msgstr "Pokaži napake"
msgid "Enabled" msgid "Enabled"
msgstr "Omogočeno" msgstr "Omogočeno"
#. Translators: this is for a network device that cannot be activated
#. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:765 ../js/ui/status/network.js:473 #: ../js/ui/lookingGlass.js:765 ../src/gvc/gvc-mixer-control.c:1830
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Onemogočeno" msgstr "Onemogočeno"
@ -1086,48 +1083,44 @@ msgstr "Poglej vir"
msgid "Web Page" msgid "Web Page"
msgstr "Spletna stran" msgstr "Spletna stran"
#: ../js/ui/messageTray.js:1227 #: ../js/ui/messageTray.js:1222
msgid "Open" msgid "Open"
msgstr "Odpri" msgstr "Odpri"
#: ../js/ui/messageTray.js:1234 #: ../js/ui/messageTray.js:1229
msgid "Remove" msgid "Remove"
msgstr "Odstrani" msgstr "Odstrani"
#: ../js/ui/messageTray.js:1535 #: ../js/ui/messageTray.js:1513
msgid "Notifications"
msgstr "Obvestila"
#: ../js/ui/messageTray.js:1542
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Počisti sporočila" msgstr "Počisti sporočila"
#: ../js/ui/messageTray.js:1569 #: ../js/ui/messageTray.js:1540
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Nastavitve obvestil" msgstr "Nastavitve obvestil"
#: ../js/ui/messageTray.js:1622 #: ../js/ui/messageTray.js:1559
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Meni sistemske vrstice" msgstr "Meni sistemske vrstice"
#: ../js/ui/messageTray.js:1838 #: ../js/ui/messageTray.js:1775
msgid "No Messages" msgid "No Messages"
msgstr "Ni sporočil" msgstr "Ni sporočil"
#: ../js/ui/messageTray.js:1876 #: ../js/ui/messageTray.js:1813
msgid "Message Tray" msgid "Message Tray"
msgstr "Sporočilna vrstica" msgstr "Sporočilna vrstica"
#: ../js/ui/messageTray.js:2851 #: ../js/ui/messageTray.js:2788
msgid "System Information" msgid "System Information"
msgstr "Podrobnosti sistema" msgstr "Podrobnosti sistema"
#: ../js/ui/notificationDaemon.js:630 ../src/shell-app.c:396 #: ../js/ui/notificationDaemon.js:629 ../src/shell-app.c:396
msgctxt "program" msgctxt "program"
msgid "Unknown" msgid "Unknown"
msgstr "Neznano" msgstr "Neznano"
#: ../js/ui/overviewControls.js:488 ../js/ui/screenShield.js:152 #: ../js/ui/overviewControls.js:491 ../js/ui/screenShield.js:152
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "%d novih sporočil" msgstr[0] "%d novih sporočil"
@ -1151,21 +1144,21 @@ msgstr "Pregled"
msgid "Type to search…" msgid "Type to search…"
msgstr "Vnos niza za iskanje ..." msgstr "Vnos niza za iskanje ..."
#: ../js/ui/panel.js:516 #: ../js/ui/panel.js:518
msgid "Quit" msgid "Quit"
msgstr "Končaj" msgstr "Končaj"
#. Translators: If there is no suitable word for "Activities" #. Translators: If there is no suitable word for "Activities"
#. in your language, you can use the word for "Overview". */ #. in your language, you can use the word for "Overview". */
#: ../js/ui/panel.js:568 #: ../js/ui/panel.js:570
msgid "Activities" msgid "Activities"
msgstr "Dejavnosti" msgstr "Dejavnosti"
#: ../js/ui/panel.js:900 #: ../js/ui/panel.js:904
msgid "Top Bar" msgid "Top Bar"
msgstr "Vrhnja vrstica" msgstr "Vrhnja vrstica"
#: ../js/ui/popupMenu.js:259 #: ../js/ui/popupMenu.js:233
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -1243,43 +1236,43 @@ msgstr "Zapomni si geslo"
msgid "Accessibility" msgid "Accessibility"
msgstr "Dostopnost" msgstr "Dostopnost"
#: ../js/ui/status/accessibility.js:56 #: ../js/ui/status/accessibility.js:58
msgid "Zoom" msgid "Zoom"
msgstr "Približanje" msgstr "Približanje"
#: ../js/ui/status/accessibility.js:63 #: ../js/ui/status/accessibility.js:65
msgid "Screen Reader" msgid "Screen Reader"
msgstr "Zaslonski bralnik" msgstr "Zaslonski bralnik"
#: ../js/ui/status/accessibility.js:67 #: ../js/ui/status/accessibility.js:69
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "Zaslonska tipkovnica" msgstr "Zaslonska tipkovnica"
#: ../js/ui/status/accessibility.js:71 #: ../js/ui/status/accessibility.js:73
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Vidna opozorila" msgstr "Vidna opozorila"
#: ../js/ui/status/accessibility.js:74 #: ../js/ui/status/accessibility.js:76
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Lepljive tipke" msgstr "Lepljive tipke"
#: ../js/ui/status/accessibility.js:77 #: ../js/ui/status/accessibility.js:79
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Počasne tipke" msgstr "Počasne tipke"
#: ../js/ui/status/accessibility.js:80 #: ../js/ui/status/accessibility.js:82
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Odskočne tipke" msgstr "Odskočne tipke"
#: ../js/ui/status/accessibility.js:83 #: ../js/ui/status/accessibility.js:85
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Miškine tipke" msgstr "Miškine tipke"
#: ../js/ui/status/accessibility.js:142 #: ../js/ui/status/accessibility.js:144
msgid "High Contrast" msgid "High Contrast"
msgstr "Visok kontrast" msgstr "Visok kontrast"
#: ../js/ui/status/accessibility.js:191 #: ../js/ui/status/accessibility.js:193
msgid "Large Text" msgid "Large Text"
msgstr "Veliko besedilo" msgstr "Veliko besedilo"
@ -1289,8 +1282,8 @@ msgstr "Veliko besedilo"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:133 #: ../js/ui/status/bluetooth.js:30 ../js/ui/status/network.js:112
#: ../js/ui/status/network.js:1085 ../js/ui/status/rfkill.js:46 #: ../js/ui/status/network.js:1040 ../js/ui/status/rfkill.js:46
msgid "Turn Off" msgid "Turn Off"
msgstr "Onemogoči" msgstr "Onemogoči"
@ -1378,95 +1371,83 @@ msgstr "Svetlost"
msgid "<unknown>" msgid "<unknown>"
msgstr "<neznano>" msgstr "<neznano>"
#: ../js/ui/status/network.js:223 ../js/ui/status/network.js:380 #: ../js/ui/status/network.js:203 ../js/ui/status/network.js:1055
#: ../js/ui/status/network.js:1106
msgid "Off" msgid "Off"
msgstr "Nepovezano" msgstr "Nepovezano"
#: ../js/ui/status/network.js:276 ../js/ui/status/network.js:961
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Omrežne nastavitve"
#. Translators: this is for network devices that are physically present but are not #. Translators: this is for network devices that are physically present but are not
#. under NetworkManager's control (and thus cannot be used in the menu) */ #. under NetworkManager's control (and thus cannot be used in the menu) */
#: ../js/ui/status/network.js:386 #: ../js/ui/status/network.js:364
msgid "unmanaged" msgid "unmanaged"
msgstr "neupravljano" msgstr "neupravljano"
#: ../js/ui/status/network.js:388 #: ../js/ui/status/network.js:366
msgid "disconnecting..." msgid "disconnecting..."
msgstr "prekinjanje povezave ..." msgstr "prekinjanje povezave ..."
#: ../js/ui/status/network.js:394 ../js/ui/status/network.js:1160 #: ../js/ui/status/network.js:372 ../js/ui/status/network.js:1106
msgid "connecting..." msgid "connecting..."
msgstr "povezovanje ..." msgstr "povezovanje ..."
#. Translators: this is for network connections that require some kind of key or password */ #. Translators: this is for network connections that require some kind of key or password */
#: ../js/ui/status/network.js:397 ../js/ui/status/network.js:1163 #: ../js/ui/status/network.js:375 ../js/ui/status/network.js:1109
msgid "authentication required" msgid "authentication required"
msgstr "zahtevana je overitev" msgstr "zahtevana je overitev"
#. Translators: this is for devices that require some kind of firmware or kernel #. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */ #. module, which is missing */
#: ../js/ui/status/network.js:405 #: ../js/ui/status/network.js:383
msgid "firmware missing" msgid "firmware missing"
msgstr "manjka strojna programska oprema" msgstr "manjka strojna programska oprema"
#. Translators: this is for a network device that cannot be activated (for example it #. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */ #. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:409 #: ../js/ui/status/network.js:387
msgid "unavailable" msgid "unavailable"
msgstr "ni na voljo" msgstr "ni na voljo"
#: ../js/ui/status/network.js:411 ../js/ui/status/network.js:1165 #: ../js/ui/status/network.js:389 ../js/ui/status/network.js:1111
msgid "connection failed" msgid "connection failed"
msgstr "povezovanje je spodletelo" msgstr "povezovanje je spodletelo"
#: ../js/ui/status/network.js:427 ../js/ui/status/network.js:513 #: ../js/ui/status/network.js:660
msgid "Mobile Broadband Settings"
msgstr "Nastavitve mobilega širokopasovnega dostopa"
#: ../js/ui/status/network.js:469 ../js/ui/status/network.js:1104
msgid "Hardware Disabled"
msgstr "Strojna oprema je onemogočena"
#: ../js/ui/status/network.js:696
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Omrežja Wi-Fi" msgstr "Omrežja Wi-Fi"
#: ../js/ui/status/network.js:698 #: ../js/ui/status/network.js:662
msgid "Select a network" msgid "Select a network"
msgstr "Izbor omrežja" msgstr "Izbor omrežja"
#: ../js/ui/status/network.js:722 #: ../js/ui/status/network.js:686
msgid "No Networks" msgid "No Networks"
msgstr "Ni omrežij" msgstr "Ni omrežij"
#: ../js/ui/status/network.js:991 #: ../js/ui/status/network.js:955
msgid "Select Network" msgid "Select Network"
msgstr "Izbor omrežja" msgstr "Izbor omrežja"
#: ../js/ui/status/network.js:997 #: ../js/ui/status/network.js:1040
msgid "Wi-Fi Settings"
msgstr "Nastavitve Wi-Fi"
#: ../js/ui/status/network.js:1085
msgid "Turn On" msgid "Turn On"
msgstr "Omogoči" msgstr "Omogoči"
#: ../js/ui/status/network.js:1108 #: ../js/ui/status/network.js:1173
msgid "Not Connected"
msgstr "Ni vzpostavljene povezave"
#: ../js/ui/status/network.js:1228
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1368 #: ../js/ui/status/network.js:1313
msgid "Network Manager" msgid "Network Manager"
msgstr "Upravljalnik omrežij" msgstr "Upravljalnik omrežij"
#: ../js/ui/status/network.js:1407 #: ../js/ui/status/network.js:1352
msgid "Connection failed" msgid "Connection failed"
msgstr "Povezava je spodletela" msgstr "Povezava je spodletela"
#: ../js/ui/status/network.js:1408 #: ../js/ui/status/network.js:1353
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Omogočanje omrežne povezave je spodletelo." msgstr "Omogočanje omrežne povezave je spodletelo."
@ -1502,10 +1483,6 @@ msgstr "Način letala"
msgid "On" msgid "On"
msgstr "Povezano" msgstr "Povezano"
#: ../js/ui/status/rfkill.js:49
msgid "Network Settings"
msgstr "Omrežne nastavitve"
#: ../js/ui/status/system.js:305 #: ../js/ui/status/system.js:305
msgid "Switch User" msgid "Switch User"
msgstr "Preklopi uporabnika" msgstr "Preklopi uporabnika"
@ -1802,6 +1779,9 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "Set Up a New Device…" #~ msgid "Set Up a New Device…"
#~ msgstr "Nastavitev nove naprave ..." #~ msgstr "Nastavitev nove naprave ..."
#~ msgid "hardware disabled"
#~ msgstr "strojno onemogočen"
#~ msgid "Connection" #~ msgid "Connection"
#~ msgstr "Povezava" #~ msgstr "Povezava"
@ -1838,6 +1818,9 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "Wired" #~ msgid "Wired"
#~ msgstr "Žično" #~ msgstr "Žično"
#~ msgid "Mobile broadband"
#~ msgstr "Mobilni širokopasovni dostop"
#~ msgid "Networking is disabled" #~ msgid "Networking is disabled"
#~ msgstr "Omrežje je onemogočeno" #~ msgstr "Omrežje je onemogočeno"
@ -1925,6 +1908,9 @@ msgstr "Uporabnik je zavrnil pogovorno okno overitve"
#~ msgid "Idle" #~ msgid "Idle"
#~ msgstr "Nedejavno" #~ msgstr "Nedejavno"
#~ msgid "Notifications"
#~ msgstr "Obvestila"
#~ msgid "Your chat status will be set to busy" #~ msgid "Your chat status will be set to busy"
#~ msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno" #~ msgstr "Stanje vašega klepeta bo nastavljeno na zasedeno"

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