Compare commits

..

20 Commits

Author SHA1 Message Date
Jasper St. Pierre
28f4030aa2 retrigger greeter 2014-03-07 19:36:31 -05:00
Jasper St. Pierre
67fe376564 gdm: Make the smartcard and service status fields private
We don't need to export these publicly any more.
2014-03-07 19:36:31 -05:00
Jasper St. Pierre
fb824131ae gdm: Integrate username asking into the ShellUserVerifier flow
Currently, prompting for the username on the login screen is done
"out-of-band". This leads to subtle bugs where we're trying to
integrate two different state machines, or interpret results from
one state machine as part of another.

It also complicates the logic, as the ability to know whether we
need or want a username is currently in the UI layer rather than
the logic layer.

Move this into the verifier proper.
2014-03-07 19:36:18 -05:00
Jasper St. Pierre
056375cbcf gdm: Merge clear() and cancel()
cancel() isn't used anymore.
2014-03-07 18:49:41 -05:00
Jasper St. Pierre
84431cbc65 gdm: Move reset-on-smartcard / reset-on-ovirt code to ShellUserVerifier
We still need to expose smartcardDetected to determine whether to
prompt for a username. This part is another hairy mess of signals
and layer violations that will need untangling, but we'll get there...
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
92c283da4d gdm: Move the verificationStatus state machine to ShellUserVerifier
The idea here is that the ShellUserVerifier does all the logic of
identifying the user, and the AuthPrompt is simply the UI on top
of it.

Thus, it makes sense for more of the state machine to be driven by
the ShellUserVerifier.

This will become more apparent in the next commit.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
6e27ef8ff9 gdm: Emit the 'failed' status immediately, and not on reset
There's really no reason to do it this way: it works in both cases,
and it's a lot simpler to reason about.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
0c511c884b gdm: Remove the (partially) unused cancelled signal
When we emit the 'cancelled' signal if we were previously verifying,
we'll always emit a 'failed' signal. LoginDialog doesn't care about
cancelled, only UnlockDialog cares about both, but it does the same
thing for both, so there's no reason to have the extra signal.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
7afb503666 gdm: Rearrange code to make it slightly easier to read 2014-03-07 18:47:37 -05:00
Jasper St. Pierre
0b9d01a1c0 gdm: Merge some duplicate code
Do a reset at initialization time.

Technically, this isn't needed, since to start the process we'll need
to reset(); anyway after all the signals have connected, but this helps
the code be clean.
2014-03-07 18:47:37 -05:00
Jasper St. Pierre
b978d99820 gdm: Remove params from AuthPrompt.begin();
It's just one parameter now.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
6d8d094e0c gdm: Remove the hold from AuthPrompt / UserVerifier
After the removal before, it's now unused.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
97e0175f48 gdm: Don't bother passing a Hold through to the authPrompt
beginVerificationForUser is always the last task in the last, so it
doesn't matter when it's released.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
ebef4ff174 gdm: Clean up pending messages handling
Introduce a new doAfterPendingMessages helper to wait until
we have no more pending messages before doing an action.
2014-03-07 18:47:36 -05:00
Jasper St. Pierre
82b8b32355 gdm: Correct placement of verification-failed emission
If we fail to verify, and don't have any pending messages, we'll retry
or cancel, which will cause a state change to VERIFYING or NOT_VERIFYING,
and then change the state again to VERIFICATION_FAILED, messing up our
state machine.
2014-03-07 18:47:35 -05:00
Jasper St. Pierre
5b4337f716 gdm: Remove _cancelAndReset
Calling Cancel(); on the UserVerifier will make us get a reset
signal eventually, so simply wait for the natural flow.
2014-03-07 18:42:17 -05:00
Jasper St. Pierre
5eb377bd3b gdm: Replace preemptingService with checks in getForegroundService
This removes a piece of the chicken-wire state machine to determine
what the current foreground service should be.
2014-03-07 18:42:17 -05:00
Jasper St. Pierre
8173110842 gdm: Make a method private 2014-03-07 18:42:17 -05:00
Jasper St. Pierre
fee97da26b activate session 2014-03-07 18:42:07 -05:00
Jasper St. Pierre
0cc10e0c5d mutter-launch was killed upstream 2014-03-07 18:42:07 -05:00
174 changed files with 17774 additions and 25272 deletions

3
.gitignore vendored
View File

@@ -78,8 +78,11 @@ src/gnome-shell-calendar-server
src/gnome-shell-extension-prefs src/gnome-shell-extension-prefs
src/gnome-shell-extension-tool src/gnome-shell-extension-tool
src/gnome-shell-hotplug-sniffer src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild
src/gnome-shell-perf-helper src/gnome-shell-perf-helper
src/gnome-shell-perf-tool src/gnome-shell-perf-tool
src/gnome-shell-real
src/gnome-shell-wayland
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
src/run-js-test src/run-js-test
src/test-recorder src/test-recorder

135
NEWS
View File

@@ -1,138 +1,3 @@
3.13.3
======
* Don't allow closing windows with attached modals [Florian; #729886]
* Fix self-restarting on OpenBSD [Antoine; #727763]
* Improve behavior of window buttons with compositor menus [Florian; #731058]
* Work around atspi-related performance regression [Alejandro; #730118]
* Misc bug fixes and cleanups [Florian, Lan, Jasper, Christophe, Debarshi,
Zeeshan; #728271, #726460, #703833, #731118, #731220, #695487, #730527,
#728170, #731619, #731738, #731882, #731923]
Contributors:
Zeeshan Ali (Khattak), Christophe Fergeau, Adel Gadllah, Antoine Jacoutot,
Ting-Wei Lan, Florian Müllner, Alejandro Piñeiro, Debarshi Ray,
Carlos Soriano, Jasper St. Pierre, Wim Taymans, Rico Tzschichholz
Translations:
Philip Withnall [en_GB], Milo Casagrande [it], Aurimas Černius [lt],
Enrico Nicoletto [pt_BR], Kjartan Maraas [nb], Balázs Meskó [hu],
Muhammet Kara [tr], Daniel Mustieles [es], Yosef Or Boczko [he],
Matej Urbančič [sl], Mattias Eriksson [sv]
3.13.2
======
* Make airplane mode menu insensitive in lock screen [Giovanni; #729224]
* Don't always extend struts to the screen edge [Florian; #683819]
* Fix keynav for alternatives in AltSwitcher [Florian; #727259]
* Implement window menus in the shell [Jasper; #726352]
* Support resource:/// URLs in GNOME_SHELL_JS envvar [Owen; #730409]
* Fix switcher popups with keybindings containing Escape [Rui; #730739]
* Update extension-prefs UI to follow GNOME 3 patterns [Florian; #730829]
* Add support for fallback app menu in window decorations [Florian; #730752]
* Fix keynav escaping open app folders [Florian; #726760]
* Misc. bug fixes [Kalev, Florian, Owen; #729429, #728449, #730408, #730753,
#730653]
Contributors:
Giovanni Campagna, Piotr Drąg, Kalev Lember, Rui Matos, Florian Müllner,
Vadim Rutkovsky, Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
Translations:
Ihar Hrachyshka [be], Giovanni Campagna [it], Carles Ferrando [ca@valencia],
Daniel Mustieles [es], Aurimas Černius [lt], Enrico Nicoletto [pt_BR],
Yosef Or Boczko [he], Marek Černocký [cs], Muhammet Kara [tr],
Georges Neto [pt_BR], Andika Triwidada [id]
3.13.1
======
* Ensure the currently focused app icon is viewable [Rui; #726759]
* Improve language in location menu [Zeeshan; #726498]
* Improve HiDpi support [Cosimo; #726907]
* Set accessible role for window previews [Alejandro; #726670]
* Fix bad antialiasing on panel menu buttons [Carlos; #727336]
* Don't hide location menu [Zeeshan; #727398]
* Fix IM candidate window obscuring current text [Rui; #727579]
* Don't always extend struts to the screen edge [Florian; #663690]
* Add shortcuts for switching to the last workspace [Elad; #659288]
* Show OSD window on all monitors [Adel; #722684]
* Improve consistency of labels in network menu [Paul; #727163]
* Fix zombie search providers showing up [Jasper; #728597]
* Remove ConsoleKit support [Florian; #686626]
* Fix region screenshots with open shell menus [Florian; #709126]
* Support <shift>insert in text entries [Florian; #648318]
* Improve app picker scrolling on touch [Jasper; #729064]
* Don't make date button clickable when on current date [Carlos; #726724]
* Tweak heuristic for hiding workspace switcher [Florian; #662457]
* Add option to show in Software to app context menu [Matthias; #643043]
* Misc. bug fixes and cleanups [Bastien, Florian, Giovanni, Adel, Vadim,
Carlos; #727983, #727948, #728512, #728681, #728897, #727384, #728820,
#715042, #728449, #728343]
Contributors:
Elad Alfassa, Zeeshan Ali (Khattak), Giovanni Campagna, Cosimo Cecchi,
Matthias Clasen, Piotr Drąg, Adel Gadllah, Paul Lange, Rui Matos,
Simon McVittie, Florian Müllner, Bastien Nocera, Alejandro Piñeiro,
Vadim Rutkovsky, Carlos Soriano, Jasper St. Pierre
Translations:
Khaled Hosny [ar], Piotr Drąg [pl], Yosef Or Boczko [he],
Antonio Fernandes C. Neto [pt_BR], Marek Černocký [cs], maria thukididu [el],
Andika Triwidada [id], Daniel Mustieles [es], Changwoo Ryu [ko],
Benjamin Steinwender [de], Sphinx Jiang [zh_CN],
Inaki Larranaga Murgoitio [eu], Marcus Lundblad [sv], Aurimas Černius [lt],
Stas Solovey [ru], Alexandre Franke [fr], Matej Urbančič [sl],
Fran Diéguez [gl], Pau Iranzo [ca], Luca Ferretti [it], Milo Casagrande [it],
Tiago S [pt], Victor Ibragimov [tg], Dirgita [id], Khoem Sokhem [km],
Rūdolfs Mazurs [lv], Balázs Úr [hu], Ask H. Larsen [da], Ikuya Awashiro [ja],
Wouter Bolsterlee [nl], Daniel Korostil [uk], Daniel Șerbănescu [ro],
Enrico Nicoletto [pt_BR]
3.12.0
======
* gdm: Reset greeter when coming back to login screen [Jasper; #726989]
Contributors:
Jasper St. Pierre
Translations:
Daniel Martinez [an], Yuri Myasoedov [ru], Inaki Larranaga Murgoitio [eu],
Abderrahim Kitouni [ar], Praveen Illa [te], Matej Urbančič [sl],
Chao-Hsiung Liao [zh_HK, zh_TW], Frédéric Péters [fr],
Мирослав Николић [sr, sr@latin], Ask H. Larsen [da], Kenneth Nielsen [da],
Jiro Matsuzawa [ja], Dušan Kazik [sk]
3.11.92
=======
* calendar: Grab key focus after changing day [Volker; #725606]
* gdm: Don't load user list if disabled [Florian; #725905]
* Don't show network-offline in the top bar [Jasper; #725340]
* Improve radial shade effect of modal dialogs [Giovanni; #725830]
* Fix broken suspend-on-idle functionality [Giovanni; #712706]
* Close wifi selection dialog when device disappears [Giovanni; #723935]
* Don't close chats when pressing Escape [Giovanni; #724178]
* Improve smartcard support in login/lock screen [Ray; #726262, #726263]
* Wake up screen when resuming from suspend [Giovanni; #726378]
* Make bluetooth and location items insensitive when locked [Florian; #726319]
* Don't show bluetooth icon when there is no adapter [Giovanni; #725057]
* Make sure to keep the OSK on top of modal dialogs [Rui; #719451]
* Misc. bug fixes and cleanups [Giovanni, Ray, Adel, Daniel, Jasper, Florian;
#725832, #725958, #722149, #724977, #724798, #725020, #723976, #726119,
#726238, #585500, #704844, #726323, #726322, #726120, #726414]
Contributors:
Giovanni Campagna, Daniel Drake, Adel Gadllah, Rui Matos, Florian Müllner,
Volker Sobek, Jasper St. Pierre, Ray Strode
Translations:
Fabio Tomat [fur], Rafael Ferreira [pt_BR], Fran Diéguez [gl],
Marek Černocký [cs], Baurzhan Muftakhidinov [kk], Andika Triwidada [id],
A S Alam [pa], Rūdolfs Mazurs [lv], Wylmer Wang [zh_CN],
Aurimas Černius [lt], Cheng-Chia Tseng [zh_TW], Stas Solovey [ru],
Tiagosdot [pt], Benjamin Steinwender [de], Frédéric Peters [fr],
Daniel Korostil [uk], Yaron Shahrabani [he], Ville-Pekka Vainio [fi],
maria thukididu [el], Victor Ibragimov [tg], Kjartan Maraas [nb],
Gábor Kelemen [hu], Ask H. Larsen [da]
3.11.91 3.11.91
======= =======
* Don't use network profile name in menu [Giovanni; #725586] * Don't use network profile name in menu [Giovanni; #725586]

2
README
View File

@@ -8,7 +8,7 @@ For more information about GNOME Shell, including instructions on how
to build GNOME Shell from source and how to get involved with the project, to build GNOME Shell from source and how to get involved with the project,
see: see:
https://wiki.gnome.org/Projects/GnomeShell http://live.gnome.org/GnomeShell
Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell' Bugs should be reported at http://bugzilla.gnome.org against the 'gnome-shell'
product. product.

View File

@@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[3.13.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[3.11.91],[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])
@@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.15.90 CLUTTER_MIN_VERSION=1.15.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0 GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.13.3 MUTTER_MIN_VERSION=3.11.91
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
@@ -112,6 +112,13 @@ 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)
PKG_CHECK_MODULES(MUTTER_WAYLAND, [libmutter-wayland >= $MUTTER_MIN_VERSION],
[MUTTER_WAYLAND_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter-wayland`
AC_SUBST(MUTTER_WAYLAND_TYPELIB_DIR)
have_mutter_wayland=yes],
[have_mutter_wayland=no])
AM_CONDITIONAL(HAVE_MUTTER_WAYLAND, test $have_mutter_wayland != no)
PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION) PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11) PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
@@ -223,14 +230,6 @@ fi
AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no)
GNOME_COMPILE_WARNINGS([error]) GNOME_COMPILE_WARNINGS([error])
case "$WARN_CFLAGS" in
*-Werror*)
WARN_CFLAGS="$WARN_CFLAGS -Wno-error=deprecated-declarations"
;;
esac
AM_CFLAGS="$AM_CFLAGS $WARN_CFLAGS"
AC_SUBST(AM_CFLAGS)
BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}" BROWSER_PLUGIN_DIR="${BROWSER_PLUGIN_DIR:-"\${libdir}/mozilla/plugins"}"
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to]) AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])

View File

@@ -1,5 +1,9 @@
desktopdir=$(datadir)/applications desktopdir=$(datadir)/applications
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
if HAVE_MUTTER_WAYLAND
desktop_DATA += gnome-shell-wayland.desktop
endif HAVE_MUTTER_WAYLAND
# We substitute in bindir so it works as an autostart # We substitute in bindir so it works as an autostart
# file when built in a non-system prefix # file when built in a non-system prefix
@@ -35,6 +39,7 @@ dist_theme_DATA = \
theme/filter-selected-rtl.svg \ theme/filter-selected-rtl.svg \
theme/gnome-shell.css \ theme/gnome-shell.css \
theme/logged-in-indicator.svg \ theme/logged-in-indicator.svg \
theme/menu-arrow-symbolic.svg \
theme/message-tray-background.png \ theme/message-tray-background.png \
theme/more-results.svg \ theme/more-results.svg \
theme/noise-texture.png \ theme/noise-texture.png \

View File

@@ -1,4 +1,5 @@
[org.gnome.shell.overrides] [org.gnome.shell.overrides]
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
button-layout = /desktop/gnome/shell/windows/button_layout
edge-tiling = /desktop/gnome/shell/windows/edge_tiling edge-tiling = /desktop/gnome/shell/windows/edge_tiling
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary

View File

@@ -2,7 +2,7 @@
Type=Application Type=Application
_Name=GNOME Shell (wayland compositor) _Name=GNOME Shell (wayland compositor)
_Comment=Window management and application launching _Comment=Window management and application launching
Exec=@bindir@/gnome-shell --wayland --display-server Exec=@bindir@/gnome-shell-wayland --wayland --display-server
X-GNOME-Bugzilla-Bugzilla=GNOME X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-shell X-GNOME-Bugzilla-Product=gnome-shell
X-GNOME-Bugzilla-Component=general X-GNOME-Bugzilla-Component=general

View File

@@ -38,6 +38,7 @@
<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="in" name="flash"/>
<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>

View File

@@ -31,7 +31,7 @@
</_description> </_description>
</key> </key>
<key name="favorite-apps" type="as"> <key name="favorite-apps" type="as">
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop' ]</default> <default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
<_summary>List of desktop file IDs for favorite applications</_summary> <_summary>List of desktop file IDs for favorite applications</_summary>
<_description> <_description>
The applications corresponding to these identifiers The applications corresponding to these identifiers
@@ -40,10 +40,10 @@
</key> </key>
<key name="app-picker-view" type="u"> <key name="app-picker-view" type="u">
<default>0</default> <default>0</default>
<_summary>App Picker View</_summary> <summary>App Picker View</summary>
<_description> <description>
Index of the currently selected view in the application picker. Index of the currently selected view in the application picker.
</_description> </description>
</key> </key>
<key name="command-history" type="as"> <key name="command-history" type="as">
<default>[]</default> <default>[]</default>
@@ -128,8 +128,8 @@
</key> </key>
<key name="pause-resume-tweens" type="as"> <key name="pause-resume-tweens" type="as">
<default>[]</default> <default>[]</default>
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary> <summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
<_description></_description> <description></description>
</key> </key>
</schema> </schema>
@@ -175,11 +175,11 @@
gettext-domain="@GETTEXT_PACKAGE@"> gettext-domain="@GETTEXT_PACKAGE@">
<key type="b" name="current-workspace-only"> <key type="b" name="current-workspace-only">
<default>false</default> <default>false</default>
<_summary>Limit switcher to current workspace.</_summary> <summary>Limit switcher to current workspace.</summary>
<_description> <description>
If true, only applications that have windows on the current workspace are shown in the switcher. If true, only applications that have windows on the current workspace are shown in the switcher.
Otherwise, all applications are included. Otherwise, all applications are included.
</_description> </description>
</key> </key>
</schema> </schema>
@@ -202,11 +202,11 @@
</key> </key>
<key type="b" name="current-workspace-only"> <key type="b" name="current-workspace-only">
<default>true</default> <default>true</default>
<_summary>Limit switcher to current workspace.</_summary> <summary>Limit switcher to current workspace.</summary>
<_description> <description>
If true, only windows from the current workspace are shown in the switcher. If true, only windows from the current workspace are shown in the switcher.
Otherwise, all windows are included. Otherwise, all windows are included.
</_description> </description>
</key> </key>
</schema> </schema>
@@ -221,6 +221,15 @@
</_description> </_description>
</key> </key>
<key name="button-layout" type="s">
<default>":close"</default>
<_summary>Arrangement of buttons on the titlebar</_summary>
<_description>
This key overrides the key in org.gnome.desktop.wm.preferences when
running GNOME Shell.
</_description>
</key>
<key name="edge-tiling" type="b"> <key name="edge-tiling" type="b">
<default>true</default> <default>true</default>
<_summary>Enable edge tiling when dropping windows on screen edges</_summary> <_summary>Enable edge tiling when dropping windows on screen edges</_summary>

View File

@@ -153,21 +153,6 @@ StScrollBar StButton#vhandle:active {
-arrow-rise: 11px; -arrow-rise: 11px;
} }
.popup-menu-boxpointer.fallback-app-menu {
-arrow-border-radius: 4px;
-arrow-background-color: #ededed;
-arrow-border-width: 1px;
-arrow-border-color: #a6a6a6;
-arrow-base: 24px;
-arrow-rise: 11px;
}
.popup-menu-boxpointer.fallback-app-menu.dark {
-arrow-background-color: #3f4747;
-arrow-border-color: #282b2b;
}
.popup-menu { .popup-menu {
min-width: 200px; min-width: 200px;
} }
@@ -181,15 +166,6 @@ StScrollBar StButton#vhandle:active {
background-color: #333333; background-color: #333333;
} }
.fallback-app-menu .popup-submenu-menu-item:open {
background-color: #888888;
color: white;
}
.fallback-app-menu.dark .popup-submenu-menu-item:open {
background-color: #333333;
}
.popup-sub-menu { .popup-sub-menu {
background-gradient-start: rgba(80,80,80,0.3); background-gradient-start: rgba(80,80,80,0.3);
background-gradient-end: rgba(80,80,80,0.4); background-gradient-end: rgba(80,80,80,0.4);
@@ -197,20 +173,6 @@ StScrollBar StButton#vhandle:active {
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9); box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9);
} }
.fallback-app-menu .popup-sub-menu {
background-gradient-start: #dddddd;
background-gradient-end: #dfdfdf;
background-gradient-direction: vertical;
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.4);
}
.fallback-app-menu.dark .popup-sub-menu {
background-gradient-start: #474747;
background-gradient-end: #4b4b4b;
background-gradient-direction: vertical;
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.9);
}
.popup-sub-menu:scrolled .popup-menu-item:ltr { .popup-sub-menu:scrolled .popup-menu-item:ltr {
padding-right: 0em; padding-right: 0em;
} }
@@ -259,29 +221,7 @@ StScrollBar StButton#vhandle:active {
color: #9f9f9f; color: #9f9f9f;
} }
.fallback-app-menu .popup-menu-item { .popup-image-menu-item {
color: #43484a;
}
.fallback-app-menu .popup-menu-item:active {
color: white;
background-color: #4689cd;
}
.fallback-app-menu .popup-menu-item:insensitive {
color: gray;
}
.fallback-app-menu.dark .popup-menu-item {
color: white;
}
.fallback-app-menu.dark .popup-menu-item:active {
background-color: #445f7d;
}
.fallback-app-menu.dark .popup-menu-item:insensitive {
color: #9f9f9f;
} }
.popup-separator-menu-item { .popup-separator-menu-item {
@@ -293,15 +233,8 @@ StScrollBar StButton#vhandle:active {
padding: 8px 0px; padding: 8px 0px;
} }
.fallback-app-menu .popup-separator-menu-item { .popup-alternating-menu-item:alternate {
-gradient-start: #a0a2a3; font-weight: bold;
-gradient-end: #a0a2a3;
-margin-horizontal: 0;
}
.fallback-app-menu.dark .popup-separator-menu-item {
-gradient-start: #818584;
-gradient-end: #818584;
} }
.popup-status-menu-item { .popup-status-menu-item {
@@ -403,14 +336,6 @@ StScrollBar StButton#vhandle:active {
icon-size: 16px; icon-size: 16px;
} }
.no-networks-label {
color: #999999;
}
.no-networks-box {
spacing: 12px;
}
/* Buttons */ /* Buttons */
.candidate-page-button, .candidate-page-button,
@@ -657,6 +582,11 @@ StScrollBar StButton#vhandle:active {
app-icon-bottom-clip: 2px; app-icon-bottom-clip: 2px;
} }
.app-menu-icon {
width: 24px;
height: 24px;
}
.panel-button { .panel-button {
-natural-hpadding: 12px; -natural-hpadding: 12px;
-minimum-hpadding: 6px; -minimum-hpadding: 6px;
@@ -740,7 +670,7 @@ StScrollBar StButton#vhandle:active {
color: #e6e6e6; color: #e6e6e6;
border-radius: 32px; /* wish we could do 50% */ border-radius: 32px; /* wish we could do 50% */
padding: 13px; padding: 13px;
border: 2px solid #5f5f5f; /* using rgba() is flaky unfortunately */ border: 1px solid #5f5f5f; /* using rgba() is flaky unfortunately */
} }
.system-menu-action:hover, .system-menu-action:hover,
@@ -748,7 +678,7 @@ StScrollBar StButton#vhandle:active {
color: white; color: white;
background-color: #4c4c4c; background-color: #4c4c4c;
border: none; border: none;
padding: 15px; padding: 14px;
} }
.system-menu-action:active { .system-menu-action:active {
@@ -1049,8 +979,6 @@ StScrollBar StButton#vhandle:active {
.app-folder-icon { .app-folder-icon {
padding: 5px; padding: 5px;
spacing-rows: 5px;
spacing-columns: 5px;
} }
.dash-item-container > StButton { .dash-item-container > StButton {
@@ -1227,6 +1155,11 @@ StScrollBar StButton#vhandle:active {
text-shadow: black 0px 2px 2px; text-shadow: black 0px 2px 2px;
} }
#LookingGlassDialog .lg-inspector-title {
font-weight: bold;
padding-bottom: 8px;
}
.lg-dialog StEntry { .lg-dialog StEntry {
selection-background-color: #bbbbbb; selection-background-color: #bbbbbb;
selected-color: #333333; selected-color: #333333;
@@ -1306,8 +1239,14 @@ StScrollBar StButton#vhandle:active {
width: 0.3em; width: 0.3em;
} }
#calendarPopup .calendar {
padding: 10px;
}
.calendar { .calendar {
padding: .4em 1.75em .8em 1.75em; padding: .4em 1.75em .8em 1.75em;
spacing-rows: 0px;
spacing-columns: 0px;
} }
.calendar-month-label { .calendar-month-label {
@@ -1503,8 +1442,11 @@ StScrollBar StButton#vhandle:active {
padding-right: 8pt; padding-right: 8pt;
} }
/* Message Tray */ .url-highlighter {
link-color: #ccccff;
}
/* Message Tray */
#message-tray { #message-tray {
background: #2e3436 url(message-tray-background.png); background: #2e3436 url(message-tray-background.png);
background-repeat: repeat; background-repeat: repeat;
@@ -1527,12 +1469,13 @@ StScrollBar StButton#vhandle:active {
color: #eeeeee; color: #eeeeee;
} }
.url-highlighter { .no-messages-label,
link-color: #ccccff; .no-networks-label {
color: #999999;
} }
.no-messages-label { .no-networks-box {
color: #999999; spacing: 12px;
} }
.notification { .notification {
@@ -1828,6 +1771,26 @@ StScrollBar StButton#vhandle:active {
spacing: 8px; spacing: 8px;
} }
.thumbnail-scroll-gradient-left {
background-gradient-direction: horizontal;
background-gradient-start: rgba(51, 51, 51, 1.0);
background-gradient-end: rgba(51, 51, 51, 0);
border-radius: 24px;
border-radius-topright: 0px;
border-radius-bottomright: 0px;
width: 60px;
}
.thumbnail-scroll-gradient-right {
background-gradient-direction: horizontal;
background-gradient-start: rgba(51, 51, 51, 0);
background-gradient-end: rgba(51, 51, 51, 1.0);
border-radius: 24px;
border-radius-topleft: 0px;
border-radius-bottomleft: 0px;
width: 60px;
}
.switcher-list .item-box { .switcher-list .item-box {
padding: 8px; padding: 8px;
border-radius: 8px; border-radius: 8px;
@@ -2097,6 +2060,10 @@ StScrollBar StButton#vhandle:active {
icon-size: 48px; icon-size: 48px;
} }
.mount-password-reask {
color: red;
}
.show-processes-dialog, .show-processes-dialog,
.mount-question-dialog { .mount-question-dialog {
spacing: 24px; spacing: 24px;
@@ -2392,6 +2359,13 @@ StScrollBar StButton#vhandle:active {
padding-bottom: 1em; padding-bottom: 1em;
} }
.login-dialog-title {
font-size: 14pt;
font-weight: bold;
color: #666666;
padding-bottom: 2em;
}
.login-dialog { .login-dialog {
/* Reset border and background */ /* Reset border and background */
border: none; border: none;
@@ -2440,6 +2414,10 @@ StScrollBar StButton#vhandle:active {
background-size: contain; background-size: contain;
} }
.login-dialog-user-list-item-text-box {
padding: 0 0.5em;
}
.login-dialog-user-list-item .login-dialog-timed-login-indicator { .login-dialog-user-list-item .login-dialog-timed-login-indicator {
background-color: rgba(0,0,0,0.0); background-color: rgba(0,0,0,0.0);
height: 2px; height: 2px;

View File

@@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
id="svg3863"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="menu-arrow.svg">
<defs
id="defs3865" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="15.836083"
inkscape:cx="-3.1641676"
inkscape:cy="11.823817"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:grid-bbox="true"
inkscape:document-units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1366"
inkscape:window-height="702"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:snap-bbox="true">
<sodipodi:guide
orientation="1,0"
position="15.996443,16.922964"
id="guide3873" />
<sodipodi:guide
orientation="0,1"
position="28.041217,3.1256134"
id="guide3875" />
<sodipodi:guide
orientation="0,1"
position="-0.80372916,24.469088"
id="guide3877" />
<sodipodi:guide
orientation="1,0"
position="3.0363102,34.649657"
id="guide3879" />
<sodipodi:guide
orientation="1,0"
position="29.023553,28.577037"
id="guide3881" />
<inkscape:grid
type="xygrid"
id="grid2988" />
</sodipodi:namedview>
<metadata
id="metadata3868">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-16)">
<path
style="fill:#ffffff;fill-opacity:1;stroke:none"
d="m 4,23 8,0 -4,5 z"
id="path3883"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -66,7 +66,6 @@ IGNORE_HFILES= \
gactionmuxer.h \ gactionmuxer.h \
gactionobservable.h \ gactionobservable.h \
gactionobserver.h \ gactionobserver.h \
shell-network-agent.h \
shell-recorder-src.h shell-recorder-src.h
if !BUILD_RECORDER if !BUILD_RECORDER

View File

@@ -50,6 +50,7 @@
<xi:include href="xml/shell-wm.xml"/> <xi:include href="xml/shell-wm.xml"/>
<xi:include href="xml/shell-util.xml"/> <xi:include href="xml/shell-util.xml"/>
<xi:include href="xml/shell-mount-operation.xml"/> <xi:include href="xml/shell-mount-operation.xml"/>
<xi:include href="xml/shell-network-agent.xml"/>
<xi:include href="xml/shell-polkit-authentication-agent.xml"/> <xi:include href="xml/shell-polkit-authentication-agent.xml"/>
<xi:include href="xml/shell-tp-client.xml"/> <xi:include href="xml/shell-tp-client.xml"/>
</chapter> </chapter>

View File

@@ -17,15 +17,17 @@ packages. If you are interested in building GNOME Shell from source,
we would recommend building from version control using the build we would recommend building from version control using the build
script described at: script described at:
https://wiki.gnome.org/Projects/GnomeShell http://live.gnome.org/GnomeShell
Not only will that give you the very latest version of this rapidly Not only will that give you the very latest version of this rapidly
changing project, it will be much easier than get GNOME Shell and changing project, it will be much easier than get GNOME Shell and
its dependencies to build from tarballs.</description> its dependencies to build from tarballs.</description>
<homepage rdf:resource="https://wiki.gnome.org/Projects/GnomeShell" /> <!--
<homepage rdf:resource="http://live.gnome.org/GnomeShell" />
-->
<mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" /> <mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" />
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" /> <download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" /> <bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" /> <category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />

View File

@@ -23,11 +23,6 @@ const GnomeShellIface = '<node> \
</interface> \ </interface> \
</node>'; </node>';
const customCss = '.prefs-button { \
padding: 8px; \
border-radius: 20px; \
}';
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface); const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
function stripPrefix(string, prefix) { function stripPrefix(string, prefix) {
@@ -51,9 +46,13 @@ const Application = new Lang.Class({
this._extensionPrefsModules = {}; this._extensionPrefsModules = {};
this._extensionIters = {};
this._startupUuid = null; this._startupUuid = null;
this._loaded = false; },
this._skipMainWindow = false;
_buildModel: function() {
this._model = new Gtk.ListStore();
this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
}, },
_extensionAvailable: function(uuid) { _extensionAvailable: function(uuid) {
@@ -71,6 +70,11 @@ const Application = new Lang.Class({
return true; return true;
}, },
_setExtensionInsensitive: function(layout, cell, model, iter, data) {
let uuid = model.get_value(iter, 0);
cell.set_sensitive(this._extensionAvailable(uuid));
},
_getExtensionPrefsModule: function(extension) { _getExtensionPrefsModule: function(extension) {
let uuid = extension.metadata.uuid; let uuid = extension.metadata.uuid;
@@ -100,23 +104,21 @@ const Application = new Lang.Class({
widget = this._buildErrorUI(extension, e); widget = this._buildErrorUI(extension, e);
} }
let dialog = new Gtk.Dialog({ use_header_bar: true, // Destroy the current prefs widget, if it exists
modal: true, if (this._extensionPrefsBin.get_child())
title: extension.metadata.name }); this._extensionPrefsBin.get_child().destroy();
if (this._skipMainWindow) { this._extensionPrefsBin.add(widget);
this.application.add_window(dialog); this._extensionSelector.set_active_iter(this._extensionIters[uuid]);
if (this._window) },
this._window.destroy();
this._window = dialog;
this._window.window_position = Gtk.WindowPosition.CENTER;
} else {
dialog.transient_for = this._window;
}
dialog.set_default_size(600, 400); _extensionSelected: function() {
dialog.get_content_area().add(widget); let [success, iter] = this._extensionSelector.get_active_iter();
dialog.show(); if (!success)
return;
let uuid = this._model.get_value(iter, 0);
this._selectExtension(uuid);
}, },
_buildErrorUI: function(extension, exc) { _buildErrorUI: function(extension, exc) {
@@ -149,26 +151,48 @@ const Application = new Lang.Class({
_buildUI: function(app) { _buildUI: function(app) {
this._window = new Gtk.ApplicationWindow({ application: app, this._window = new Gtk.ApplicationWindow({ application: app,
window_position: Gtk.WindowPosition.CENTER }); window_position: Gtk.WindowPosition.CENTER,
title: _("GNOME Shell Extension Preferences") });
this._window.set_size_request(800, 500); this._window.set_size_request(600, 400);
this._titlebar = new Gtk.HeaderBar({ show_close_button: true, let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
title: _("GNOME Shell Extensions") }); this._window.add(vbox);
this._window.set_titlebar(this._titlebar);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER, let toolbar = new Gtk.Toolbar();
shadow_type: Gtk.ShadowType.IN, toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR);
halign: Gtk.Align.CENTER, vbox.add(toolbar);
margin: 18 }); let toolitem;
this._window.add(scroll);
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE }); let label = new Gtk.Label({ label: '<b>' + _("Extension") + '</b>',
this._extensionSelector.set_sort_func(Lang.bind(this, this._sortList)); use_markup: true });
this._extensionSelector.set_header_func(Lang.bind(this, this._updateHeader)); toolitem = new Gtk.ToolItem({ child: label });
toolbar.add(toolitem);
scroll.add(this._extensionSelector); this._extensionSelector = new Gtk.ComboBox({ model: this._model,
margin_left: 8,
hexpand: true });
this._extensionSelector.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
let renderer = new Gtk.CellRendererText();
this._extensionSelector.pack_start(renderer, true);
this._extensionSelector.add_attribute(renderer, 'text', 1);
this._extensionSelector.set_cell_data_func(renderer, Lang.bind(this, this._setExtensionInsensitive));
this._extensionSelector.connect('changed', Lang.bind(this, this._extensionSelected));
toolitem = new Gtk.ToolItem({ child: this._extensionSelector });
toolitem.set_expand(true);
toolbar.add(toolitem);
this._extensionPrefsBin = new Gtk.Frame();
vbox.add(this._extensionPrefsBin);
let label = new Gtk.Label({
label: _("Select an extension to configure using the combobox above."),
vexpand: true
});
this._extensionPrefsBin.add(label);
this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell'); this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell', '/org/gnome/Shell');
this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) { this._shellProxy.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
@@ -179,35 +203,6 @@ const Application = new Lang.Class({
this._window.show_all(); this._window.show_all();
}, },
_addCustomStyle: function() {
let provider = new Gtk.CssProvider();
try {
provider.load_from_data(customCss, -1);
} catch(e) {
log('Failed to add application style');
return;
}
let screen = this._window.window.get_screen();
let priority = Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION;
Gtk.StyleContext.add_provider_for_screen(screen, provider, priority);
},
_sortList: function(row1, row2) {
let name1 = ExtensionUtils.extensions[row1.uuid].metadata.name;
let name2 = ExtensionUtils.extensions[row2.uuid].metadata.name;
return name1.localeCompare(name2);
},
_updateHeader: function(row, before) {
if (!before || row.get_header())
return;
let sep = new Gtk.Separator({ orientation: Gtk.Orientation.HORIZONTAL });
row.set_header(sep);
},
_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));
@@ -216,24 +211,15 @@ const Application = new Lang.Class({
}, },
_extensionFound: function(finder, extension) { _extensionFound: function(finder, extension) {
let row = new ExtensionRow(extension.uuid); let iter = this._model.append();
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
row.prefsButton.visible = this._extensionAvailable(row.uuid); this._extensionIters[extension.uuid] = iter;
row.prefsButton.connect('clicked', Lang.bind(this,
function() {
this._selectExtension(row.uuid);
}));
row.show_all();
this._extensionSelector.add(row);
}, },
_extensionsLoaded: function() { _extensionsLoaded: function() {
if (this._startupUuid && this._extensionAvailable(this._startupUuid)) if (this._startupUuid && this._extensionAvailable(this._startupUuid))
this._selectExtension(this._startupUuid); this._selectExtension(this._startupUuid);
this._startupUuid = null; this._startupUuid = null;
this._skipMainWindow = false;
this._loaded = true;
}, },
_onActivate: function() { _onActivate: function() {
@@ -241,125 +227,29 @@ const Application = new Lang.Class({
}, },
_onStartup: function(app) { _onStartup: function(app) {
this._buildModel();
this._buildUI(app); this._buildUI(app);
this._addCustomStyle();
this._scanExtensions(); this._scanExtensions();
}, },
_onCommandLine: function(app, commandLine) { _onCommandLine: function(app, commandLine) {
app.activate(); app.activate();
let args = commandLine.get_arguments(); let args = commandLine.get_arguments();
if (args.length) { if (args.length) {
let uuid = args[0]; let uuid = args[0];
this._skipMainWindow = true;
// Strip off "extension:///" prefix which fakes a URI, if it exists // Strip off "extension:///" prefix which fakes a URI, if it exists
uuid = stripPrefix(uuid, "extension:///"); uuid = stripPrefix(uuid, "extension:///");
if (this._extensionAvailable(uuid)) if (this._extensionAvailable(uuid))
this._selectExtension(uuid); this._selectExtension(uuid);
else if (!this._loaded)
this._startupUuid = uuid;
else else
this._skipMainWindow = false; this._startupUuid = uuid;
} }
return 0; return 0;
} }
}); });
const ExtensionRow = new Lang.Class({
Name: 'ExtensionRow',
Extends: Gtk.ListBoxRow,
_init: function(uuid) {
this.parent();
this.uuid = uuid;
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
this._settings.connect('changed::enabled-extensions', Lang.bind(this,
function() {
this._switch.state = this._isEnabled();
}));
this._buildUI();
},
_buildUI: function() {
let extension = ExtensionUtils.extensions[this.uuid];
let hbox = new Gtk.Box({ orientation: Gtk.Orientation.HORIZONTAL,
hexpand: true, margin: 12, spacing: 6 });
this.add(hbox);
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL,
spacing: 6, hexpand: true });
hbox.add(vbox);
let name = GLib.markup_escape_text(extension.metadata.name, -1);
let label = new Gtk.Label({ label: '<b>' + name + '</b>',
use_markup: true,
halign: Gtk.Align.START });
vbox.add(label);
let desc = extension.metadata.description.split('\n')[0];
label = new Gtk.Label({ label: desc,
ellipsize: Pango.EllipsizeMode.END,
halign: Gtk.Align.START });
vbox.add(label);
let button = new Gtk.Button({ valign: Gtk.Align.CENTER,
no_show_all: true });
button.add(new Gtk.Image({ icon_name: 'emblem-system-symbolic',
icon_size: Gtk.IconSize.BUTTON,
visible: true }));
button.get_style_context().add_class('prefs-button');
hbox.add(button);
this.prefsButton = button;
this._switch = new Gtk.Switch({ valign: Gtk.Align.CENTER,
state: this._isEnabled() });
this._switch.connect('notify::active', Lang.bind(this,
function() {
if (this._switch.active)
this._enable();
else
this._disable();
}));
this._switch.connect('state-set', function() { return true; });
hbox.add(this._switch);
},
_isEnabled: function() {
let extensions = this._settings.get_strv('enabled-extensions');
return extensions.indexOf(this.uuid) != -1;
},
_enable: function() {
let extensions = this._settings.get_strv('enabled-extensions');
if (extensions.indexOf(this.uuid) != -1)
return;
extensions.push(this.uuid);
this._settings.set_strv('enabled-extensions', extensions);
},
_disable: function() {
let extensions = this._settings.get_strv('enabled-extensions');
let pos = extensions.indexOf(this.uuid);
if (pos == -1)
return;
do {
extensions.splice(pos, 1);
pos = extensions.indexOf(this.uuid);
} while (pos != -1);
this._settings.set_strv('enabled-extensions', extensions);
}
});
function initEnvironment() { function initEnvironment() {
// Monkey-patch in a "global" object that fakes some Shell utilities // Monkey-patch in a "global" object that fakes some Shell utilities
// that ExtensionUtils depends on. // that ExtensionUtils depends on.

View File

@@ -24,24 +24,10 @@ const AuthPromptMode = {
UNLOCK_OR_LOG_IN: 1 UNLOCK_OR_LOG_IN: 1
}; };
const AuthPromptStatus = {
NOT_VERIFYING: 0,
VERIFYING: 1,
VERIFICATION_FAILED: 2,
VERIFICATION_SUCCEEDED: 3
};
const BeginRequestType = {
PROVIDE_USERNAME: 0,
DONT_PROVIDE_USERNAME: 1
};
const AuthPrompt = new Lang.Class({ const AuthPrompt = new Lang.Class({
Name: 'AuthPrompt', Name: 'AuthPrompt',
_init: function(gdmClient, mode) { _init: function(gdmClient, mode) {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this._gdmClient = gdmClient; this._gdmClient = gdmClient;
this._mode = mode; this._mode = mode;
@@ -53,14 +39,11 @@ const AuthPrompt = new Lang.Class({
this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly }); this._userVerifier = new GdmUtil.ShellUserVerifier(this._gdmClient, { reauthenticationOnly: reauthenticationOnly });
this._userVerifier.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion)); this._userVerifier.connect('ask-question', Lang.bind(this, this._onAskQuestion));
this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage)); this._userVerifier.connect('show-message', Lang.bind(this, this._onShowMessage));
this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed)); this._userVerifier.connect('verification-failed', Lang.bind(this, this._onVerificationFailed));
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('ovirt-user-authenticated', Lang.bind(this, this._onOVirtUserAuthenticated));
this.smartcardDetected = this._userVerifier.smartcardDetected;
this.connect('next', Lang.bind(this, function() { this.connect('next', Lang.bind(this, function() {
this.updateSensitivity(false); this.updateSensitivity(false);
@@ -133,6 +116,10 @@ const AuthPrompt = new Lang.Class({
this._defaultButtonWell.add_child(this._spinner.actor); this._defaultButtonWell.add_child(this._spinner.actor);
}, },
get verificationStatus() {
return this._userVerifier.verificationStatus;
},
_onDestroy: function() { _onDestroy: function() {
this._userVerifier.clear(); this._userVerifier.clear();
this._userVerifier.disconnectAll(); this._userVerifier.disconnectAll();
@@ -193,6 +180,14 @@ const AuthPrompt = new Lang.Class({
})); }));
}, },
_onNeedsUserName: function() {
this.emit('needs-username');
},
gotUserName: function(userName) {
this._userVerifier.gotUserName(userName);
},
_onAskQuestion: function(verifier, serviceName, question, passwordChar) { _onAskQuestion: function(verifier, serviceName, question, passwordChar) {
if (this._preemptiveAnswer) { if (this._preemptiveAnswer) {
if (this._queryingService) if (this._queryingService)
@@ -221,30 +216,6 @@ const AuthPrompt = new Lang.Class({
this.emit('prompted'); this.emit('prompted');
}, },
_onOVirtUserAuthenticated: function() {
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
},
_onSmartcardStatusChanged: function() {
this.smartcardDetected = this._userVerifier.smartcardDetected;
// Most of the time we want to reset if the user inserts or removes
// a smartcard. Smartcard insertion "preempts" what the user was
// doing, and smartcard removal aborts the preemption.
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
// with a smartcard
// 2) Don't reset if we've already succeeded at verification and
// the user is getting logged in.
if (this._userVerifier.serviceIsDefault(GdmUtil.SMARTCARD_SERVICE_NAME) &&
this.verificationStatus == AuthPromptStatus.VERIFYING &&
this.smartcardDetected)
return;
if (this.verificationStatus != AuthPromptStatus.VERIFICATION_SUCCEEDED)
this.reset();
},
_onShowMessage: function(userVerifier, message, type) { _onShowMessage: function(userVerifier, message, type) {
this.setMessage(message, type); this.setMessage(message, type);
this.emit('prompted'); this.emit('prompted');
@@ -256,15 +227,11 @@ const AuthPrompt = new Lang.Class({
this.updateSensitivity(true); this.updateSensitivity(true);
this.setActorInDefaultButtonWell(null); this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
},
_onVerificationComplete: function() { this.emit('failed');
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
}, },
_onReset: function() { _onReset: function() {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.reset(); this.reset();
}, },
@@ -428,38 +395,13 @@ const AuthPrompt = new Lang.Class({
}, },
reset: function() { reset: function() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
if (oldStatus == AuthPromptStatus.VERIFYING)
this._userVerifier.cancel();
this._queryingService = null; this._queryingService = null;
this.clear(); this.clear();
this._message.opacity = 0; this._message.opacity = 0;
this.setUser(null); this.setUser(null);
this.stopSpinning(); this.stopSpinning();
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED) this.emit('reset');
this.emit('failed');
let beginRequestType;
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
// The user is constant at the unlock screen, so it will immediately
// respond to the request with the username
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
} else if (this._userVerifier.serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
this._userVerifier.serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME)) {
// We don't need to know the username if the user preempted the login screen
// with a smartcard or with preauthenticated oVirt credentials
beginRequestType = BeginRequestType.DONT_PROVIDE_USERNAME;
} else {
// In all other cases, we should get the username up front.
beginRequestType = BeginRequestType.PROVIDE_USERNAME;
}
this.emit('reset', beginRequestType);
}, },
addCharacter: function(unichar) { addCharacter: function(unichar) {
@@ -470,18 +412,13 @@ const AuthPrompt = new Lang.Class({
this._entry.clutter_text.insert_unichar(unichar); this._entry.clutter_text.insert_unichar(unichar);
}, },
begin: function(params) { begin: function() {
params = Params.parse(params, { userName: null,
hold: null });
this.updateSensitivity(false); this.updateSensitivity(false);
this._userVerifier.begin();
},
let hold = params.hold; needsUsername: function() {
if (!hold) this._userVerifier.begin(userName);
hold = new Batch.Hold();
this._userVerifier.begin(params.userName, hold);
this.verificationStatus = AuthPromptStatus.VERIFYING;
}, },
finish: function(onComplete) { finish: function(onComplete) {
@@ -499,7 +436,6 @@ const AuthPrompt = new Lang.Class({
cancel: function() { cancel: function() {
this.reset(); this.reset();
this.emit('cancelled');
} }
}); });
Signals.addSignalMethods(AuthPrompt.prototype); Signals.addSignalMethods(AuthPrompt.prototype);

View File

@@ -36,7 +36,6 @@ const BoxPointer = imports.ui.boxpointer;
const CtrlAltTab = imports.ui.ctrlAltTab; const CtrlAltTab = imports.ui.ctrlAltTab;
const GdmUtil = imports.gdm.util; const GdmUtil = imports.gdm.util;
const Layout = imports.ui.layout; const Layout = imports.ui.layout;
const LoginManager = imports.misc.loginManager;
const Main = imports.ui.main; const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Realmd = imports.gdm.realmd; const Realmd = imports.gdm.realmd;
@@ -48,6 +47,8 @@ const _SCROLL_ANIMATION_TIME = 0.5;
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0; const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
const _LOGO_ICON_HEIGHT = 48; const _LOGO_ICON_HEIGHT = 48;
let _loginDialog = null;
const UserListItem = new Lang.Class({ const UserListItem = new Lang.Class({
Name: 'UserListItem', Name: 'UserListItem',
@@ -382,7 +383,7 @@ const LoginDialog = new Lang.Class({
Lang.bind(this, this._onTimedLoginRequested)); Lang.bind(this, this._onTimedLoginRequested));
} }
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY, this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
Lang.bind(this, this._updateBanner)); Lang.bind(this, this._updateBanner));
@@ -420,6 +421,7 @@ const LoginDialog = new Lang.Class({
this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN); this._authPrompt = new AuthPrompt.AuthPrompt(gdmClient, AuthPrompt.AuthPromptMode.UNLOCK_OR_LOG_IN);
this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted)); this._authPrompt.connect('prompted', Lang.bind(this, this._onPrompted));
this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._authPrompt.hide(); this._authPrompt.hide();
this.actor.add_child(this._authPrompt.actor); this.actor.add_child(this._authPrompt.actor);
@@ -468,7 +470,7 @@ const LoginDialog = new Lang.Class({
this._sessionMenuButton.actor.show(); this._sessionMenuButton.actor.show();
this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor); this._authPrompt.addActorToDefaultButtonWell(this._sessionMenuButton.actor);
this._disableUserList = undefined; this._updateDisableUserList();
this._userListLoaded = false; this._userListLoaded = false;
LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy)); LoginManager.getLoginManager().getCurrentSessionProxy(Lang.bind(this, this._gotGreeterSessionProxy));
@@ -476,12 +478,11 @@ const LoginDialog = new Lang.Class({
// If the user list is enabled, it should take key focus; make sure the // If the user list is enabled, it should take key focus; make sure the
// screen shield is initialized first to prevent it from stealing the // screen shield is initialized first to prevent it from stealing the
// focus later // focus later
Main.layoutManager.connect('startup-complete', Main.layoutManager.connect('startup-complete', Lang.bind(this, this._reset));
Lang.bind(this, this._updateDisableUserList));
}, },
_ensureUserListLoaded: function() { _ensureUserListLoaded: function() {
if (!this._userManager.is_loaded) { if (!this._userManager.is_loaded)
this._userManagerLoadedId = this._userManager.connect('notify::is-loaded', this._userManagerLoadedId = this._userManager.connect('notify::is-loaded',
Lang.bind(this, function() { Lang.bind(this, function() {
if (this._userManager.is_loaded) { if (this._userManager.is_loaded) {
@@ -490,21 +491,24 @@ const LoginDialog = new Lang.Class({
this._userManagerLoadedId = 0; this._userManagerLoadedId = 0;
} }
})); }));
} else { else
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList)); GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList));
GLib.Source.set_name_by_id(id, '[gnome-shell] _loadUserList'); },
}
_reset: function() {
this._authPrompt.reset();
this._authPrompt.begin();
}, },
_updateDisableUserList: function() { _updateDisableUserList: function() {
let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY); let disableUserList = this._settings.get_boolean(GdmUtil.DISABLE_USER_LIST_KEY);
if (disableUserList == this._disableUserList)
return;
if (disableUserList != this._disableUserList) { this._disableUserList = disableUserList;
this._disableUserList = disableUserList;
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING) if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME)
this._authPrompt.reset(); this._reset();
}
}, },
_updateCancelButton: function() { _updateCancelButton: function() {
@@ -512,7 +516,7 @@ const LoginDialog = new Lang.Class({
// Hide the cancel button if the user list is disabled and we're asking for // Hide the cancel button if the user list is disabled and we're asking for
// a username // a username
if (this._authPrompt.verificationStatus == AuthPrompt.AuthPromptStatus.NOT_VERIFYING && this._disableUserList) if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.ASKING_FOR_USERNAME && this._disableUserList)
cancelVisible = false; cancelVisible = false;
else else
cancelVisible = true; cancelVisible = true;
@@ -537,12 +541,9 @@ const LoginDialog = new Lang.Class({
return; return;
this._logoBin.destroy_all_children(); this._logoBin.destroy_all_children();
if (this._logoFileUri) { if (this._logoFileUri)
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._logoBin.add_child(this._textureCache.load_uri_async(this._logoFileUri, this._logoBin.add_child(this._textureCache.load_uri_async(this._logoFileUri,
-1, _LOGO_ICON_HEIGHT, -1, _LOGO_ICON_HEIGHT));
scaleFactor));
}
}, },
_updateLogo: function() { _updateLogo: function() {
@@ -560,19 +561,18 @@ const LoginDialog = new Lang.Class({
this._showPrompt(); this._showPrompt();
}, },
_onReset: function(authPrompt, beginRequest) { _onReset: function() {
this._sessionMenuButton.updateSensitivity(true); this._sessionMenuButton.updateSensitivity(true);
this._user = null; this._user = null;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { this._reset();
if (!this._disableUserList) },
this._showUserList();
else _onNeedsUserName: function() {
this._hideUserListAskForUsernameAndBeginVerification(); if (!this._disableUserList)
} else { this._showUserList();
this._hideUserListAndBeginVerification(); else
} this._hideUserListAskForUsernameAndBeginVerification();
}, },
_onDefaultSessionChanged: function(client, sessionId) { _onDefaultSessionChanged: function(client, sessionId) {
@@ -580,8 +580,8 @@ const LoginDialog = new Lang.Class({
}, },
_shouldShowSessionMenuButton: function() { _shouldShowSessionMenuButton: function() {
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFYING && if (this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFYING &&
this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_FAILED) this._authPrompt.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_FAILED)
return false; return false;
if (this._user && this._user.is_loaded && this._user.is_logged_in()) if (this._user && this._user.is_loaded && this._user.is_logged_in())
@@ -631,7 +631,7 @@ const LoginDialog = new Lang.Class({
this._user = this._userManager.get_user(answer); this._user = this._userManager.get_user(answer);
this._authPrompt.clear(); this._authPrompt.clear();
this._authPrompt.startSpinning(); this._authPrompt.startSpinning();
this._authPrompt.begin({ userName: answer }); this._authPrompt.gotUserName(answer);
this._updateCancelButton(); this._updateCancelButton();
realmManager.disconnect(realmSignalId) realmManager.disconnect(realmSignalId)
@@ -641,33 +641,29 @@ const LoginDialog = new Lang.Class({
this._showPrompt(); this._showPrompt();
}, },
_loginScreenSessionActivated: function() { _sessionActivated: function() {
if (this._authPrompt.verificationStatus != AuthPrompt.AuthPromptStatus.VERIFICATION_SUCCEEDED) // We fade out the shell after logging in, and then re-set
return; // the greeter wen we're VT switched to again.
Tweener.addTween(this.actor, // XXX: re-trigger startup animation
{ opacity: 255, if (this._authPrompt.verificationStatus == GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED) {
time: _FADE_ANIMATION_TIME, this._reset();
transition: 'easeOutQuad',
onUpdate: function() {
let children = Main.layoutManager.uiGroup.get_children();
for (let i = 0; i < children.length; i++) { // XXX: do something better here
if (children[i] != Main.layoutManager.screenShieldGroup) this.actor.opacity = 255;
children[i].opacity = this.actor.opacity;
} let children = Main.layoutManager.uiGroup.get_children();
}, for (let i = 0; i < children.length; i++) {
onUpdateScope: this, if (children[i] != Main.layoutManager.screenShieldGroup)
onComplete: function() { children[i].opacity = 255;
this._authPrompt.reset(); }
}, }
onCompleteScope: this });
}, },
_gotGreeterSessionProxy: function(proxy) { _gotGreeterSessionProxy: function(proxy) {
proxy.connect('g-properties-changed', Lang.bind(this, function() { proxy.connect('g-properties-changed', Lang.bind(this, function() {
if (proxy.Active) if (proxy.Active)
this._loginScreenSessionActivated(); this._sessionActivated();
})); }));
}, },
@@ -686,11 +682,10 @@ const LoginDialog = new Lang.Class({
}, },
onUpdateScope: this, onUpdateScope: this,
onComplete: function() { onComplete: function() {
let id = Mainloop.idle_add(Lang.bind(this, function() { Mainloop.idle_add(Lang.bind(this, function() {
this._greeter.call_start_session_when_ready_sync(serviceName, true, null); this._greeter.call_start_session_when_ready_sync(serviceName, true, null);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._greeter.call_start_session_when_ready_sync');
}, },
onCompleteScope: this }); onCompleteScope: this });
}, },
@@ -746,7 +741,6 @@ const LoginDialog = new Lang.Class({
hold.release(); hold.release();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(this._timedLoginIdleTimeOutId, '[gnome-shell] this._timedLoginAnimationTime');
return hold; return hold;
}, },
@@ -843,11 +837,6 @@ const LoginDialog = new Lang.Class({
this._askForUsernameAndBeginVerification(); this._askForUsernameAndBeginVerification();
}, },
_hideUserListAndBeginVerification: function() {
this._hideUserList();
this._authPrompt.begin();
},
_showUserList: function() { _showUserList: function() {
this._ensureUserListLoaded(); this._ensureUserListLoaded();
this._authPrompt.hide(); this._authPrompt.hide();
@@ -861,11 +850,7 @@ const LoginDialog = new Lang.Class({
this._authPrompt.setUser(item.user); this._authPrompt.setUser(item.user);
let userName = item.user.get_user_name(); let userName = item.user.get_user_name();
let hold = new Batch.Hold(); this._authPrompt.gotUserName(userName);
this._authPrompt.begin({ userName: userName,
hold: hold });
return hold;
}, },
_onUserListActivated: function(activatedItem) { _onUserListActivated: function(activatedItem) {
@@ -880,9 +865,9 @@ const LoginDialog = new Lang.Class({
this._updateCancelButton(); this._updateCancelButton();
let batch = new Batch.ConcurrentBatch(this, [new Batch.ConsecutiveBatch(this, tasks), let batch = new Batch.ConsecutiveBatch(this, tasks);
this._beginVerificationForItem(activatedItem)]);
batch.run(); batch.run();
this._beginVerificationForItem(activatedItem);
}, },
_onDestroy: function() { _onDestroy: function() {

View File

@@ -119,6 +119,14 @@ function cloneAndFadeOutActor(actor) {
return hold; return hold;
} }
const VerificationStatus = {
NOT_VERIFYING: 0,
ASKING_FOR_USERNAME: 1,
VERIFYING: 2,
VERIFICATION_FAILED: 3,
VERIFICATION_SUCCEEDED: 4,
};
const ShellUserVerifier = new Lang.Class({ const ShellUserVerifier = new Lang.Class({
Name: 'ShellUserVerifier', Name: 'ShellUserVerifier',
@@ -128,10 +136,9 @@ const ShellUserVerifier = new Lang.Class({
this._client = client; this._client = client;
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._settings.connect('changed', this._settings.connect('changed',
Lang.bind(this, this._updateDefaultService)); Lang.bind(this, this._updateDefaultService));
this._updateDefaultService();
this._fprintManager = new Fprint.FprintManager(); this._fprintManager = new Fprint.FprintManager();
this._smartcardManager = SmartcardManager.getSmartcardManager(); this._smartcardManager = SmartcardManager.getSmartcardManager();
@@ -152,45 +159,69 @@ const ShellUserVerifier = new Lang.Class({
this.hasPendingMessages = false; this.hasPendingMessages = false;
this.reauthenticating = false; this.reauthenticating = false;
this._failCounter = 0;
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager(); this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._oVirtCredentialsManager.connect('user-authenticated', Lang.bind(this, this._oVirtUserAuthenticated));
if (this._oVirtCredentialsManager.hasToken()) if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken()); this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtCredentialsManager.connect('user-authenticated', this._reset();
Lang.bind(this, this._oVirtUserAuthenticated));
}, },
begin: function(userName, hold) { _reset: function() {
this._cancellable = new Gio.Cancellable(); // Clear previous attempts to authenticate
this._hold = hold; this.verificationStatus = VerificationStatus.NOT_VERIFYING;
this._userName = null;
this._failCounter = 0;
this._updateDefaultService();
this.emit('reset');
},
begin: function() {
if (this._mode == AuthPromptMode.UNLOCK_ONLY) {
// The user is constant at the unlock screen, so it will immediately
// respond to the request with the username
needsUsername = true;
} else if (this._serviceIsForeground(GdmUtil.OVIRT_SERVICE_NAME) ||
(this._smartcardDetected &&
this._serviceIsForeground(GdmUtil.SMARTCARD_SERVICE_NAME))) {
// We don't need to know the username if the user preempted the login screen
// with a smartcard or with preauthenticated oVirt credentials
needsUsername = false;
} else {
// In all other cases, we should get the username up front.
needsUsername = true;
}
if (needsUsername) {
this.verificationStatus = VerificationStatus.ASKING_FOR_USERNAME;
this.emit('needs-username');
} else {
this._beginAuthentication();
}
},
gotUserName: function(userName) {
this._userName = userName; this._userName = userName;
this._beginAuthentication();
},
_beginAuthentication: function() {
this.verificationStatus = VerificationStatus.VERIFYING;
this._cancellable = new Gio.Cancellable();
this.reauthenticating = false; this.reauthenticating = false;
this._checkForFingerprintReader(); this._checkForFingerprintReader();
if (userName) { if (this._userName) {
// If possible, reauthenticate an already running session, // If possible, reauthenticate an already running session,
// so any session specific credentials get updated appropriately // so any session specific credentials get updated appropriately
this._client.open_reauthentication_channel(userName, this._cancellable, this._client.open_reauthentication_channel(this._userName, this._cancellable,
Lang.bind(this, this._reauthenticationChannelOpened)); Lang.bind(this, this._reauthenticationChannelOpened));
} else { } else {
this._client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot)); this._client.get_user_verifier(this._cancellable, Lang.bind(this, this._userVerifierGot));
} }
}, },
cancel: function() {
if (this._cancellable)
this._cancellable.cancel();
if (this._userVerifier) {
this._userVerifier.call_cancel_sync(null);
this.clear();
}
},
clear: function() { clear: function() {
if (this._cancellable) { if (this._cancellable) {
this._cancellable.cancel(); this._cancellable.cancel();
@@ -198,6 +229,7 @@ const ShellUserVerifier = new Lang.Class({
} }
if (this._userVerifier) { if (this._userVerifier) {
this._userVerifier.call_cancel_sync(null);
this._userVerifier.run_dispose(); this._userVerifier.run_dispose();
this._userVerifier = null; this._userVerifier = null;
} }
@@ -205,24 +237,29 @@ const ShellUserVerifier = new Lang.Class({
this._clearMessageQueue(); this._clearMessageQueue();
}, },
answerQuery: function(serviceName, answer) { _doAfterPendingMessages: function(func) {
if (!this.hasPendingMessages) { if (this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null); let signalId = this.connect('no-more-messages', Lang.bind(this, function() {
this.disconnect(signalId);
func();
}));
} else { } else {
let signalId = this.connect('no-more-messages', func();
Lang.bind(this, function() {
this.disconnect(signalId);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
} }
}, },
answerQuery: function(serviceName, answer) {
this._doAfterPendingMessages(Lang.bind(this, function() {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
},
_getIntervalForMessage: function(message) { _getIntervalForMessage: function(message) {
// We probably could be smarter here // We probably could be smarter here
return message.length * USER_READ_TIME; return message.length * USER_READ_TIME;
}, },
finishMessageQueue: function() { _finishMessageQueue: function() {
if (!this.hasPendingMessages) if (!this.hasPendingMessages)
return; return;
@@ -234,7 +271,7 @@ const ShellUserVerifier = new Lang.Class({
_queueMessageTimeout: function() { _queueMessageTimeout: function() {
if (this._messageQueue.length == 0) { if (this._messageQueue.length == 0) {
this.finishMessageQueue(); this._finishMessageQueue();
return; return;
} }
@@ -252,7 +289,6 @@ const ShellUserVerifier = new Lang.Class({
this._queueMessageTimeout(); this._queueMessageTimeout();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout');
}, },
_queueMessage: function(message, messageType) { _queueMessage: function(message, messageType) {
@@ -264,7 +300,7 @@ const ShellUserVerifier = new Lang.Class({
}, },
_clearMessageQueue: function() { _clearMessageQueue: function() {
this.finishMessageQueue(); this._finishMessageQueue();
if (this._messageQueueTimeoutId != 0) { if (this._messageQueueTimeoutId != 0) {
GLib.source_remove(this._messageQueueTimeoutId); GLib.source_remove(this._messageQueueTimeoutId);
@@ -289,9 +325,9 @@ const ShellUserVerifier = new Lang.Class({
})); }));
}, },
_oVirtUserAuthenticated: function(token) { _oVirtUserAuthenticated: function() {
this._preemptingService = OVIRT_SERVICE_NAME; if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED)
this.emit('ovirt-user-authenticated'); this._reset();
}, },
_checkForSmartcard: function() { _checkForSmartcard: function() {
@@ -299,26 +335,34 @@ const ShellUserVerifier = new Lang.Class({
if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY)) if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
smartcardDetected = false; smartcardDetected = false;
else if (this._reauthOnly) else if (this.reauthenticating)
smartcardDetected = this._smartcardManager.hasInsertedLoginToken(); smartcardDetected = this._smartcardManager.hasInsertedLoginToken();
else else
smartcardDetected = this._smartcardManager.hasInsertedTokens(); smartcardDetected = this._smartcardManager.hasInsertedTokens();
if (smartcardDetected != this.smartcardDetected) { if (this._smartcardDetected == smartcardDetected)
this.smartcardDetected = smartcardDetected; return;
if (this.smartcardDetected) this._smartcardDetected = smartcardDetected;
this._preemptingService = SMARTCARD_SERVICE_NAME;
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
this._preemptingService = null;
this.emit('smartcard-status-changed'); // Most of the time we want to reset if the user inserts or removes
} // a smartcard. Smartcard insertion "preempts" what the user was
// doing, and smartcard removal aborts the preemption.
// The exceptions are: 1) Don't reset on smartcard insertion if we're already verifying
// with a smartcard
// 2) Don't reset if we've already succeeded at verification and
// the user is getting logged in.
if (this._serviceIsDefault(SMARTCARD_SERVICE_NAME) &&
this.verificationStatus == VerificationStatus.VERIFYING &&
this._smartcardDetected)
return;
if (this.verificationStatus != VerificationStatus.VERIFICATION_SUCCEEDED)
this._reset();
}, },
_reportInitError: function(where, error) { _reportInitError: function(where, error) {
logError(error, where); logError(error, where);
this._hold.release();
this._queueMessage(_("Authentication error"), MessageType.ERROR); this._queueMessage(_("Authentication error"), MessageType.ERROR);
this._verificationFailed(false); this._verificationFailed(false);
@@ -344,7 +388,6 @@ const ShellUserVerifier = new Lang.Class({
this.reauthenticating = true; this.reauthenticating = true;
this._connectSignals(); this._connectSignals();
this._beginVerification(); this._beginVerification();
this._hold.release();
}, },
_userVerifierGot: function(client, result) { _userVerifierGot: function(client, result) {
@@ -359,7 +402,6 @@ const ShellUserVerifier = new Lang.Class({
this._connectSignals(); this._connectSignals();
this._beginVerification(); this._beginVerification();
this._hold.release();
}, },
_connectSignals: function() { _connectSignals: function() {
@@ -373,31 +415,32 @@ const ShellUserVerifier = new Lang.Class({
}, },
_getForegroundService: function() { _getForegroundService: function() {
if (this._preemptingService) if (this._oVirtCredentialsManager.hasToken())
return this._preemptingService; return OVIRT_SERVICE_NAME;
if (this._smartcardDetected)
return SMARTCARD_SERVICE_NAME;
return this._defaultService; return this._defaultService;
}, },
serviceIsForeground: function(serviceName) { _serviceIsForeground: function(serviceName) {
return serviceName == this._getForegroundService(); return serviceName == this._getForegroundService();
}, },
serviceIsDefault: function(serviceName) { _serviceIsDefault: function(serviceName) {
return serviceName == this._defaultService; return serviceName == this._defaultService;
}, },
_updateDefaultService: function() { _updateDefaultService: function() {
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY)) if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
this._defaultService = PASSWORD_SERVICE_NAME; this._defaultService = PASSWORD_SERVICE_NAME;
else if (this.smartcardDetected) else if (this._smartcardDetected)
this._defaultService = SMARTCARD_SERVICE_NAME; this._defaultService = SMARTCARD_SERVICE_NAME;
else if (this._haveFingerprintReader) else if (this._haveFingerprintReader)
this._defaultService = FINGERPRINT_SERVICE_NAME; this._defaultService = FINGERPRINT_SERVICE_NAME;
}, },
_startService: function(serviceName) { _startService: function(serviceName) {
this._hold.acquire();
if (this._userName) { if (this._userName) {
this._userVerifier.call_begin_verification_for_user(serviceName, this._userVerifier.call_begin_verification_for_user(serviceName,
this._userName, this._userName,
@@ -411,8 +454,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification for user', e); this._reportInitError('Failed to start verification for user', e);
return; return;
} }
this._hold.release();
})); }));
} else { } else {
this._userVerifier.call_begin_verification(serviceName, this._userVerifier.call_begin_verification(serviceName,
@@ -426,8 +467,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification', e); this._reportInitError('Failed to start verification', e);
return; return;
} }
this._hold.release();
})); }));
} }
}, },
@@ -435,12 +474,12 @@ const ShellUserVerifier = new Lang.Class({
_beginVerification: function() { _beginVerification: function() {
this._startService(this._getForegroundService()); this._startService(this._getForegroundService());
if (this._userName && this._haveFingerprintReader && !this.serviceIsForeground(FINGERPRINT_SERVICE_NAME)) if (this._userName && this._haveFingerprintReader && !this._serviceIsForeground(FINGERPRINT_SERVICE_NAME))
this._startService(FINGERPRINT_SERVICE_NAME); this._startService(FINGERPRINT_SERVICE_NAME);
}, },
_onInfo: function(client, serviceName, info) { _onInfo: function(client, serviceName, info) {
if (this.serviceIsForeground(serviceName)) { if (this._serviceIsForeground(serviceName)) {
this._queueMessage(info, MessageType.INFO); this._queueMessage(info, MessageType.INFO);
} else if (serviceName == FINGERPRINT_SERVICE_NAME && } else if (serviceName == FINGERPRINT_SERVICE_NAME &&
this._haveFingerprintReader) { this._haveFingerprintReader) {
@@ -455,21 +494,21 @@ const ShellUserVerifier = new Lang.Class({
}, },
_onProblem: function(client, serviceName, problem) { _onProblem: function(client, serviceName, problem) {
if (!this.serviceIsForeground(serviceName)) if (!this._serviceIsForeground(serviceName))
return; return;
this._queueMessage(problem, MessageType.ERROR); this._queueMessage(problem, MessageType.ERROR);
}, },
_onInfoQuery: function(client, serviceName, question) { _onInfoQuery: function(client, serviceName, question) {
if (!this.serviceIsForeground(serviceName)) if (!this._serviceIsForeground(serviceName))
return; return;
this.emit('ask-question', serviceName, question, ''); this.emit('ask-question', serviceName, question, '');
}, },
_onSecretInfoQuery: function(client, serviceName, secretQuestion) { _onSecretInfoQuery: function(client, serviceName, secretQuestion) {
if (!this.serviceIsForeground(serviceName)) if (!this._serviceIsForeground(serviceName))
return; return;
if (serviceName == OVIRT_SERVICE_NAME) { if (serviceName == OVIRT_SERVICE_NAME) {
@@ -482,24 +521,11 @@ const ShellUserVerifier = new Lang.Class({
}, },
_onReset: function() { _onReset: function() {
// Clear previous attempts to authenticate this._reset();
this._failCounter = 0;
this._updateDefaultService();
this.emit('reset');
}, },
_onVerificationComplete: function() { _onVerificationComplete: function() {
this.emit('verification-complete'); this.verificationStatus = VerificationStatus.VERIFICATION_SUCCEEDED;
},
_cancelAndReset: function() {
this.cancel();
this._onReset();
},
_retry: function() {
this.begin(this._userName, new Batch.Hold());
}, },
_verificationFailed: function(retry) { _verificationFailed: function(retry) {
@@ -512,38 +538,23 @@ const ShellUserVerifier = new Lang.Class({
let canRetry = retry && this._userName && let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY); this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) { this.verificationStatus = VerificationStatus.VERIFICATION_FAILED;
if (!this.hasPendingMessages) {
this._retry();
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._retry();
}));
}
} else {
if (!this.hasPendingMessages) {
this._cancelAndReset();
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._cancelAndReset();
}));
}
}
this.emit('verification-failed'); this.emit('verification-failed');
this._doAfterPendingMessages(Lang.bind(this, function() {
if (canRetry)
this._beginAuthentication();
else
this.clear();
}));
}, },
_onConversationStopped: function(client, serviceName) { _onConversationStopped: function(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials // If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication // then discard the credentials and revert to default authentication
// mechanism. // mechanism.
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) { if (this._serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken(); this._oVirtCredentialsManager.resetToken();
this._preemptingService = null;
this._verificationFailed(false); this._verificationFailed(false);
return; return;
} }
@@ -551,7 +562,7 @@ const ShellUserVerifier = new Lang.Class({
// 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
if (this.serviceIsForeground(serviceName)) { if (this._serviceIsForeground(serviceName)) {
this._verificationFailed(true); this._verificationFailed(true);
} }
}, },

View File

@@ -84,7 +84,6 @@
<file>ui/userWidget.js</file> <file>ui/userWidget.js</file>
<file>ui/viewSelector.js</file> <file>ui/viewSelector.js</file>
<file>ui/windowAttentionHandler.js</file> <file>ui/windowAttentionHandler.js</file>
<file>ui/windowMenu.js</file>
<file>ui/windowManager.js</file> <file>ui/windowManager.js</file>
<file>ui/workspace.js</file> <file>ui/workspace.js</file>
<file>ui/workspaceSwitcherPopup.js</file> <file>ui/workspaceSwitcherPopup.js</file>

View File

@@ -39,13 +39,39 @@ const SystemdLoginSessionIface = '<node> \
<interface name="org.freedesktop.login1.Session"> \ <interface name="org.freedesktop.login1.Session"> \
<signal name="Lock" /> \ <signal name="Lock" /> \
<signal name="Unlock" /> \ <signal name="Unlock" /> \
<property name="Active" type="b" access="read" /> \ <property name="Active" access="readonly" /> \
</interface> \ </interface> \
</node>'; </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> \
<interface name="org.freedesktop.ConsoleKit.Manager"> \
<method name="CanRestart"> \
<arg type="b" direction="out"/> \
</method> \
<method name="CanStop"> \
<arg type="b" direction="out"/> \
</method> \
<method name="Restart" /> \
<method name="Stop" /> \
<method name="GetCurrentSession"> \
<arg type="o" direction="out" /> \
</method> \
</interface> \
</node>';
const ConsoleKitSessionIface = '<node> \
<interface name="org.freedesktop.ConsoleKit.Session"> \
<signal name="Lock" /> \
<signal name="Unlock" /> \
</interface> \
</node>';
const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface);
const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface);
function haveSystemd() { function haveSystemd() {
return GLib.access("/run/systemd/seats", 0) >= 0; return GLib.access("/run/systemd/seats", 0) >= 0;
} }
@@ -75,7 +101,7 @@ function canLock() {
-1, null); -1, null);
let version = result.deep_unpack()[0].deep_unpack(); let version = result.deep_unpack()[0].deep_unpack();
return haveSystemd() && versionCompare('3.5.91', version); return versionCompare('3.5.91', version);
} catch(e) { } catch(e) {
return false; return false;
} }
@@ -93,7 +119,7 @@ function getLoginManager() {
if (haveSystemd()) if (haveSystemd())
_loginManager = new LoginManagerSystemd(); _loginManager = new LoginManagerSystemd();
else else
_loginManager = new LoginManagerDummy(); _loginManager = new LoginManagerConsoleKit();
} }
return _loginManager; return _loginManager;
@@ -110,6 +136,9 @@ const LoginManagerSystemd = new Lang.Class({
Lang.bind(this, this._prepareForSleep)); Lang.bind(this, this._prepareForSleep));
}, },
// Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment.
getCurrentSessionProxy: function(callback) { getCurrentSessionProxy: function(callback) {
if (this._currentSession) { if (this._currentSession) {
callback (this._currentSession); callback (this._currentSession);
@@ -162,7 +191,7 @@ const LoginManagerSystemd = new Lang.Class({
let fd = -1; let fd = -1;
try { try {
let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result); let [outVariant, fdList] = proxy.call_with_unix_fd_list_finish(result);
fd = fdList.steal_fds()[0]; fd = fdList.steal_fds(outVariant.deep_unpack())[0];
callback(new Gio.UnixInputStream({ fd: fd })); callback(new Gio.UnixInputStream({ fd: fd }));
} catch(e) { } catch(e) {
logError(e, "Error getting systemd inhibitor"); logError(e, "Error getting systemd inhibitor");
@@ -177,13 +206,35 @@ const LoginManagerSystemd = new Lang.Class({
}); });
Signals.addSignalMethods(LoginManagerSystemd.prototype); Signals.addSignalMethods(LoginManagerSystemd.prototype);
const LoginManagerDummy = new Lang.Class({ const LoginManagerConsoleKit = new Lang.Class({
Name: 'LoginManagerDummy', Name: 'LoginManagerConsoleKit',
_init: function() {
this._proxy = new ConsoleKitManager(Gio.DBus.system,
'org.freedesktop.ConsoleKit',
'/org/freedesktop/ConsoleKit/Manager');
},
// Having this function is a bit of a hack since the Systemd and ConsoleKit
// session objects have different interfaces - but in both cases there are
// Lock/Unlock signals, and that's all we count upon at the moment.
getCurrentSessionProxy: function(callback) { getCurrentSessionProxy: function(callback) {
// we could return a DummySession object that fakes whatever callers if (this._currentSession) {
// expect (at the time of writing: connect() and connectSignal() callback (this._currentSession);
// methods), but just never calling the callback should be safer return;
}
this._proxy.GetCurrentSessionRemote(Lang.bind(this,
function(result, error) {
if (error) {
logError(error, 'Could not get a proxy for the current session');
} else {
this._currentSession = new ConsoleKitSession(Gio.DBus.system,
'org.freedesktop.ConsoleKit',
result[0]);
callback(this._currentSession);
}
}));
}, },
canSuspend: function(asyncCallback) { canSuspend: function(asyncCallback) {
@@ -203,4 +254,4 @@ const LoginManagerDummy = new Lang.Class({
callback(null); callback(null);
} }
}); });
Signals.addSignalMethods(LoginManagerDummy.prototype); Signals.addSignalMethods(LoginManagerConsoleKit.prototype);

View File

@@ -129,7 +129,7 @@ function trySpawn(argv)
// Dummy child watch; we don't want to double-fork internally // Dummy child watch; we don't want to double-fork internally
// because then we lose the parent-child relationship, which // because then we lose the parent-child relationship, which
// can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275 // can break polkit. See https://bugzilla.redhat.com//show_bug.cgi?id=819275
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {}); GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {}, null);
} }
// trySpawnCommandLine: // trySpawnCommandLine:

View File

@@ -167,8 +167,6 @@ const AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, this._nextWindow()); this._select(this._selectedIndex, this._nextWindow());
else if (keysym == Clutter.Up) else if (keysym == Clutter.Up)
this._select(this._selectedIndex, null, true); this._select(this._selectedIndex, null, true);
else
return Clutter.EVENT_PROPAGATE;
} else { } else {
if (keysym == Clutter.Left) if (keysym == Clutter.Left)
this._select(this._previous()); this._select(this._previous());
@@ -176,11 +174,7 @@ const AppSwitcherPopup = new Lang.Class({
this._select(this._next()); this._select(this._next());
else if (keysym == Clutter.Down) else if (keysym == Clutter.Down)
this._select(this._selectedIndex, 0); this._select(this._selectedIndex, 0);
else
return Clutter.EVENT_PROPAGATE;
} }
return Clutter.EVENT_STOP;
}, },
_scrollHandler: function(direction) { _scrollHandler: function(direction) {
@@ -311,7 +305,6 @@ const AppSwitcherPopup = new Lang.Class({
this._thumbnailTimeoutId = Mainloop.timeout_add ( this._thumbnailTimeoutId = Mainloop.timeout_add (
THUMBNAIL_POPUP_TIME, THUMBNAIL_POPUP_TIME,
Lang.bind(this, this._timeoutPopupThumbnails)); Lang.bind(this, this._timeoutPopupThumbnails));
GLib.Source.set_name_by_id(this._thumbnailTimeoutId, '[gnome-shell] this._timeoutPopupThumbnails');
} }
}, },
@@ -367,12 +360,12 @@ const WindowSwitcherPopup = new Lang.Class({
_init: function(items) { _init: function(items) {
this.parent(items); this.parent(items);
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.window-switcher' }); this._settings = new Gio.Settings({ schema: 'org.gnome.shell.window-switcher' });
}, },
_getWindowList: function() { _getWindowList: function() {
let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null; let workspace = this._settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() : null;
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace); return global.display.get_tab_list(Meta.TabList.NORMAL, global.screen, workspace);
}, },
_createSwitcher: function() { _createSwitcher: function() {
@@ -410,11 +403,7 @@ const WindowSwitcherPopup = new Lang.Class({
this._select(this._previous()); this._select(this._previous());
else if (keysym == Clutter.Right) else if (keysym == Clutter.Right)
this._select(this._next()); this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
} }
return Clutter.EVENT_STOP;
}, },
_finish: function() { _finish: function() {
@@ -456,10 +445,11 @@ const AppSwitcher = new Lang.Class({
this._arrows = []; this._arrows = [];
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let settings = new Gio.Settings({ schema_id: 'org.gnome.shell.app-switcher' }); let settings = new Gio.Settings({ schema: 'org.gnome.shell.app-switcher' });
let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace() let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace()
: null; : null;
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace); let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL,
global.screen, workspace);
// Construct the AppIcons, add to the popup // Construct the AppIcons, add to the popup
for (let i = 0; i < apps.length; i++) { for (let i = 0; i < apps.length; i++) {
@@ -566,7 +556,6 @@ const AppSwitcher = new Lang.Class({
this._mouseTimeOutId = 0; this._mouseTimeOutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
} else } else
this._itemEntered(index); this._itemEntered(index);
}, },

View File

@@ -21,9 +21,7 @@ const Animation = new Lang.Class({
this._isPlaying = false; this._isPlaying = false;
this._timeoutId = 0; this._timeoutId = 0;
this._frame = 0; this._frame = 0;
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height, scaleFactor,
Lang.bind(this, this._animationsLoaded)); Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations); this.actor.set_child(this._animations);
}, },
@@ -34,7 +32,6 @@ const Animation = new Lang.Class({
this._showFrame(0); this._showFrame(0);
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update)); this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._update');
} }
this._isPlaying = true; this._isPlaying = true;

View File

@@ -16,7 +16,6 @@ const Atk = imports.gi.Atk;
const AppFavorites = imports.ui.appFavorites; const AppFavorites = imports.ui.appFavorites;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const GrabHelper = imports.ui.grabHelper;
const IconGrid = imports.ui.iconGrid; const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main; const Main = imports.ui.main;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
@@ -42,7 +41,9 @@ const MIN_FREQUENT_APPS_COUNT = 3;
const INDICATORS_BASE_TIME = 0.25; const INDICATORS_BASE_TIME = 0.25;
const INDICATORS_ANIMATION_DELAY = 0.125; const INDICATORS_ANIMATION_DELAY = 0.125;
const INDICATORS_ANIMATION_MAX_TIME = 0.75; const INDICATORS_ANIMATION_MAX_TIME = 0.75;
// Fraction of page height the finger or mouse must reach
// to change page
const PAGE_SWITCH_TRESHOLD = 0.2;
const PAGE_SWITCH_TIME = 0.3; const PAGE_SWITCH_TIME = 0.3;
const VIEWS_SWITCH_TIME = 0.4; const VIEWS_SWITCH_TIME = 0.4;
@@ -80,10 +81,6 @@ function _getFolderName(folder) {
return name; return name;
} }
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
const BaseAppView = new Lang.Class({ const BaseAppView = new Lang.Class({
Name: 'BaseAppView', Name: 'BaseAppView',
Abstract: true, Abstract: true,
@@ -102,9 +99,6 @@ const BaseAppView = new Lang.Class({
else else
this._grid = new IconGrid.IconGrid(gridParams); this._grid = new IconGrid.IconGrid(gridParams);
this._grid.connect('key-focus-in', Lang.bind(this, function(grid, actor) {
this._keyFocusIn(actor);
}));
// Standard hack for ClutterBinLayout // Standard hack for ClutterBinLayout
this._grid.actor.x_expand = true; this._grid.actor.x_expand = true;
@@ -112,10 +106,6 @@ const BaseAppView = new Lang.Class({
this._allItems = []; this._allItems = [];
}, },
_keyFocusIn: function(actor) {
// Nothing by default
},
removeAll: function() { removeAll: function() {
this._grid.destroyAll(); this._grid.destroyAll();
this._items = {}; this._items = {};
@@ -371,7 +361,7 @@ const AllView = new Lang.Class({
Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, function() { Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, function() {
Main.queueDeferredWork(this._redisplayWorkId); Main.queueDeferredWork(this._redisplayWorkId);
})); }));
this._folderSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' }); this._folderSettings = new Gio.Settings({ schema: 'org.gnome.desktop.app-folders' });
this._folderSettings.connect('changed::folder-children', Lang.bind(this, function() { this._folderSettings.connect('changed::folder-children', Lang.bind(this, function() {
Main.queueDeferredWork(this._redisplayWorkId); Main.queueDeferredWork(this._redisplayWorkId);
})); }));
@@ -442,8 +432,8 @@ const AllView = new Lang.Class({
}, },
goToPage: function(pageNumber) { goToPage: function(pageNumber) {
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1); if(pageNumber < 0 || pageNumber > this._grid.nPages() - 1)
return;
if (this._currentPage == pageNumber && this._displayingPopup && this._currentPopup) if (this._currentPage == pageNumber && this._displayingPopup && this._currentPopup)
return; return;
if (this._displayingPopup && this._currentPopup) if (this._displayingPopup && this._currentPopup)
@@ -475,12 +465,14 @@ const AllView = new Lang.Class({
// longer than PAGE_SWITCH_TIME // longer than PAGE_SWITCH_TIME
time = Math.min(time, PAGE_SWITCH_TIME); time = Math.min(time, PAGE_SWITCH_TIME);
this._currentPage = pageNumber; if (pageNumber < this._grid.nPages() && pageNumber >= 0) {
Tweener.addTween(this._adjustment, this._currentPage = pageNumber;
{ value: this._grid.getPageY(this._currentPage), Tweener.addTween(this._adjustment,
time: time, { value: this._grid.getPageY(this._currentPage),
transition: 'easeOutQuad' }); time: time,
this._pageIndicators.setCurrentPage(pageNumber); transition: 'easeOutQuad' });
this._pageIndicators.setCurrentPage(pageNumber);
}
}, },
_diffToPage: function (pageNumber) { _diffToPage: function (pageNumber) {
@@ -527,19 +519,15 @@ const AllView = new Lang.Class({
_onPanEnd: function(action) { _onPanEnd: function(action) {
if (this._displayingPopup) if (this._displayingPopup)
return; return;
let diffCurrentPage = this._diffToPage(this._currentPage);
let pageHeight = this._grid.getPageHeight(); if (diffCurrentPage > this._scrollView.height * PAGE_SWITCH_TRESHOLD) {
if (action.get_velocity(0)[2] > 0)
// Calculate the scroll value we'd be at, which is our current this.goToPage(this._currentPage - 1);
// scroll plus any velocity the user had when they released else
// their finger. this.goToPage(this._currentPage + 1);
} else {
let velocity = -action.get_velocity(0)[2]; this.goToPage(this._currentPage);
let endPanValue = this._adjustment.value + velocity; }
let closestPage = Math.round(endPanValue / pageHeight);
this.goToPage(closestPage);
this._panning = false; this._panning = false;
}, },
@@ -570,7 +558,7 @@ const AllView = new Lang.Class({
})); }));
}, },
_keyFocusIn: function(icon) { _ensureIconVisible: function(icon) {
let itemPage = this._grid.getItemPage(icon); let itemPage = this._grid.getItemPage(icon);
this.goToPage(itemPage); this.goToPage(itemPage);
}, },
@@ -741,7 +729,7 @@ const AppDisplay = new Lang.Class({
Name: 'AppDisplay', Name: 'AppDisplay',
_init: function() { _init: function() {
this._privacySettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.privacy' }); this._privacySettings = new Gio.Settings({ schema: 'org.gnome.desktop.privacy' });
this._privacySettings.connect('changed::remember-app-usage', this._privacySettings.connect('changed::remember-app-usage',
Lang.bind(this, this._updateFrequentVisibility)); Lang.bind(this, this._updateFrequentVisibility));
@@ -769,7 +757,7 @@ const AppDisplay = new Lang.Class({
this._viewStack = new St.Widget({ x_expand: true, y_expand: true, this._viewStack = new St.Widget({ x_expand: true, y_expand: true,
layout_manager: this._viewStackLayout }); layout_manager: this._viewStackLayout });
this._viewStackLayout.connect('allocated-size-changed', Lang.bind(this, this._onAllocatedSizeChanged)); this._viewStackLayout.connect('allocated-size-changed', Lang.bind(this, this._onAllocatedSizeChanged));
this.actor.add_actor(this._viewStack); this.actor.add_actor(this._viewStack, { expand: true });
let layout = new ControlsBoxLayout({ homogeneous: true }); let layout = new ControlsBoxLayout({ homogeneous: true });
this._controls = new St.Widget({ style_class: 'app-view-controls', this._controls = new St.Widget({ style_class: 'app-view-controls',
layout_manager: layout }); layout_manager: layout });
@@ -941,28 +929,20 @@ const FolderView = new Lang.Class({
this.actor.add_action(action); this.actor.add_action(action);
}, },
_keyFocusIn: function(actor) {
Util.ensureActorVisibleInScrollView(this.actor, actor);
},
createFolderIcon: function(size) { createFolderIcon: function(size) {
let layout = new Clutter.TableLayout(); let layout = new Clutter.TableLayout();
let icon = new St.Widget({ layout_manager: layout, let icon = new St.Widget({ layout_manager: layout,
style_class: 'app-folder-icon' }); style_class: 'app-folder-icon' });
layout.hookup_style(icon);
let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size); let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
let numItems = this._allItems.length; let aligns = [ Clutter.ActorAlign.START, Clutter.ActorAlign.END ];
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL; for (let i = 0; i < Math.min(this._allItems.length, 4); i++) {
for (let i = 0; i < 4; i++) { let texture = this._allItems[i].app.create_icon_texture(subSize);
let bin; let bin = new St.Bin({ child: texture,
if (i < numItems) { x_expand: true, y_expand: true });
let texture = this._allItems[i].app.create_icon_texture(subSize); bin.set_x_align(aligns[i % 2]);
bin = new St.Bin({ child: texture }); bin.set_y_align(aligns[Math.floor(i / 2)]);
} else { layout.pack(bin, i % 2, Math.floor(i / 2));
bin = new St.Bin({ width: subSize, height: subSize });
}
layout.pack(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2));
} }
return icon; return icon;
@@ -1251,8 +1231,18 @@ const AppFolderPopup = new Lang.Class({
function() { function() {
this.actor.destroy(); this.actor.destroy();
})); }));
this._grabHelper = new GrabHelper.GrabHelper(this.actor); this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
this._grabHelper.addActor(Main.layoutManager.overviewGroup); },
_onKeyPress: function(actor, event) {
if (!this._isOpen)
return Clutter.EVENT_PROPAGATE;
if (event.get_key_symbol() != Clutter.KEY_Escape)
return Clutter.EVENT_PROPAGATE;
this.popdown();
return Clutter.EVENT_STOP;
}, },
toggle: function() { toggle: function() {
@@ -1266,12 +1256,6 @@ const AppFolderPopup = new Lang.Class({
if (this._isOpen) if (this._isOpen)
return; return;
this._isOpen = this._grabHelper.grab({ actor: this.actor,
onUngrab: Lang.bind(this, this.popdown) });
if (!this._isOpen)
return;
this.actor.show(); this.actor.show();
this._boxPointer.setArrowActor(this._source.actor); this._boxPointer.setArrowActor(this._source.actor);
@@ -1280,6 +1264,7 @@ const AppFolderPopup = new Lang.Class({
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
this._isOpen = true;
this.emit('open-state-changed', true); this.emit('open-state-changed', true);
}, },
@@ -1287,8 +1272,6 @@ const AppFolderPopup = new Lang.Class({
if (!this._isOpen) if (!this._isOpen)
return; return;
this._grabHelper.ungrab({ actor: this.actor });
this._boxPointer.hide(BoxPointer.PopupAnimation.FADE | this._boxPointer.hide(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE); BoxPointer.PopupAnimation.SLIDE);
this._isOpen = false; this._isOpen = false;
@@ -1405,7 +1388,6 @@ const AppIcon = new Lang.Class({
this.popupMenu(); this.popupMenu();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
} else if (button == 3) { } else if (button == 3) {
this.popupMenu(); this.popupMenu();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
@@ -1601,26 +1583,6 @@ const AppIconMenu = new Lang.Class({
favs.addFavorite(this._source.app.get_id()); favs.addFavorite(this._source.app.get_id());
})); }));
} }
if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) {
this._appendSeparator();
let item = this._appendMenuItem(_("Show Details"));
item.connect('activate', Lang.bind(this, function() {
let id = this._source.app.get_id();
let args = GLib.Variant.new('(ss)', [id, '']);
Gio.DBus.get(Gio.BusType.SESSION, null,
function(o, res) {
let bus = Gio.DBus.get_finish(res);
bus.call('org.gnome.Software',
'/org/gnome/Software',
'org.gtk.Actions', 'Activate',
GLib.Variant.new('(sava{sv})',
['details', [args], null]),
null, 0, -1, null, null);
Main.overview.hide();
});
}));
}
} }
}, },

View File

@@ -132,25 +132,6 @@ const BackgroundCache = new Lang.Class({
this._removeContent(this._images, content); this._removeContent(this._images, content);
}, },
_attachCallerToFileLoad: function(caller, fileLoad) {
fileLoad.callers.push(caller);
if (!caller.cancellable)
return;
caller.cancellable.connect(Lang.bind(this, function() {
let idx = fileLoad.callers.indexOf(caller);
fileLoad.callers.splice(idx, 1);
if (fileLoad.callers.length == 0) {
fileLoad.cancellable.cancel();
let idx = this._pendingFileLoads.indexOf(fileLoad);
this._pendingFileLoads.splice(idx, 1);
}
}));
},
_loadImageContent: function(params) { _loadImageContent: function(params) {
params = Params.parse(params, { monitorIndex: 0, params = Params.parse(params, { monitorIndex: 0,
style: null, style: null,
@@ -159,28 +140,27 @@ const BackgroundCache = new Lang.Class({
cancellable: null, cancellable: null,
onFinished: null }); onFinished: null });
let caller = { monitorIndex: params.monitorIndex,
effects: params.effects,
cancellable: params.cancellable,
onFinished: params.onFinished };
for (let i = 0; i < this._pendingFileLoads.length; i++) { for (let i = 0; i < this._pendingFileLoads.length; i++) {
let fileLoad = this._pendingFileLoads[i]; if (this._pendingFileLoads[i].filename == params.filename &&
this._pendingFileLoads[i].style == params.style) {
if (fileLoad.filename == params.filename && this._pendingFileLoads[i].callers.push({ shouldCopy: true,
fileLoad.style == params.style) { monitorIndex: params.monitorIndex,
this._attachCallerToFileLoad(caller, fileLoad); effects: params.effects,
onFinished: params.onFinished });
return; return;
} }
} }
let fileLoad = { filename: params.filename, this._pendingFileLoads.push({ filename: params.filename,
style: params.style, style: params.style,
cancellable: new Gio.Cancellable(), callers: [{ shouldCopy: false,
callers: [] }; monitorIndex: params.monitorIndex,
this._attachCallerToFileLoad(caller, fileLoad); effects: params.effects,
onFinished: params.onFinished }] });
let content = new Meta.Background({ meta_screen: global.screen }); let content = new Meta.Background({ meta_screen: global.screen,
monitor: params.monitorIndex,
effects: params.effects });
content.load_file_async(params.filename, content.load_file_async(params.filename,
params.style, params.style,
@@ -191,26 +171,35 @@ const BackgroundCache = new Lang.Class({
content.load_file_finish(result); content.load_file_finish(result);
this._monitorFile(params.filename); this._monitorFile(params.filename);
this._images.push(content);
} catch(e) { } catch(e) {
content = null; content = null;
} }
for (let i = 0; i < fileLoad.callers.length; i++) { for (let i = 0; i < this._pendingFileLoads.length; i++) {
let caller = fileLoad.callers[i]; let pendingLoad = this._pendingFileLoads[i];
if (caller.onFinished) { if (pendingLoad.filename != params.filename ||
let newContent; pendingLoad.style != params.style)
continue;
if (content) { for (let j = 0; j < pendingLoad.callers.length; j++) {
newContent = content.copy(caller.monitorIndex, caller.effects); if (pendingLoad.callers[j].onFinished) {
this._images.push(newContent); let newContent;
if (content && pendingLoad.callers[j].shouldCopy) {
newContent = content.copy(pendingLoad.callers[j].monitorIndex,
pendingLoad.callers[j].effects);
this._images.push(newContent);
} else {
newContent = content;
}
pendingLoad.callers[j].onFinished(newContent);
} }
caller.onFinished(newContent);
} }
}
let idx = this._pendingFileLoads.indexOf(fileLoad); this._pendingFileLoads.splice(i, 1);
this._pendingFileLoads.splice(idx, 1); }
})); }));
}, },
@@ -271,11 +260,10 @@ const BackgroundCache = new Lang.Class({
if (this._animationFilename == params.filename) { if (this._animationFilename == params.filename) {
if (params.onLoaded) { if (params.onLoaded) {
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() { GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
params.onLoaded(this._animation); params.onLoaded(this._animation);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
} }
} }
@@ -287,11 +275,10 @@ const BackgroundCache = new Lang.Class({
this._animation = animation; this._animation = animation;
if (params.onLoaded) { if (params.onLoaded) {
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() { GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
params.onLoaded(this._animation); params.onLoaded(this._animation);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] params.onLoaded');
} }
})); }));
} }
@@ -388,11 +375,10 @@ const Background = new Lang.Class({
this.isLoaded = true; this.isLoaded = true;
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() { GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
this.emit('loaded'); this.emit('loaded');
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit');
}, },
_loadPattern: function() { _loadPattern: function() {
@@ -535,7 +521,6 @@ const Background = new Lang.Class({
this._updateAnimation(); this._updateAnimation();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
}, },
_loadAnimation: function(filename) { _loadAnimation: function(filename) {
@@ -725,7 +710,7 @@ const BackgroundManager = new Lang.Class({
controlPosition: true, controlPosition: true,
settingsSchema: BACKGROUND_SCHEMA }); settingsSchema: BACKGROUND_SCHEMA });
this._settings = new Gio.Settings({ schema_id: params.settingsSchema }); this._settings = new Gio.Settings({ schema: params.settingsSchema });
this._container = params.container; this._container = params.container;
this._layoutManager = params.layoutManager; this._layoutManager = params.layoutManager;
this._effects = params.effects; this._effects = params.effects;
@@ -758,18 +743,17 @@ const BackgroundManager = new Lang.Class({
Lang.bind(this, function() { Lang.bind(this, function() {
newBackground.disconnect(newBackground.loadedSignalId); newBackground.disconnect(newBackground.loadedSignalId);
newBackground.loadedSignalId = 0; newBackground.loadedSignalId = 0;
if (this._newBackground != newBackground) {
/* Not interesting, we queued another load */
newBackground.actor.destroy();
return;
}
Tweener.addTween(this.background.actor, Tweener.addTween(this.background.actor,
{ opacity: 0, { opacity: 0,
time: FADE_ANIMATION_TIME, time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
if (this._newBackground != newBackground) {
/* Not interesting, we queued another load */
newBackground.actor.destroy();
return;
}
this.background.actor.destroy(); this.background.actor.destroy();
this.background = newBackground; this.background = newBackground;
this._newBackground = null; this._newBackground = null;

View File

@@ -35,7 +35,7 @@ function addBackgroundMenu(actor, layoutManager) {
function openMenu() { function openMenu() {
let [x, y] = global.get_pointer(); let [x, y] = global.get_pointer();
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0); Main.layoutManager.setDummyCursorPosition(x, y);
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE); actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
} }

View File

@@ -14,9 +14,6 @@ const Shell = imports.gi.Shell;
const MSECS_IN_DAY = 24 * 60 * 60 * 1000; const MSECS_IN_DAY = 24 * 60 * 60 * 1000;
const SHOW_WEEKDATE_KEY = 'show-weekdate'; const SHOW_WEEKDATE_KEY = 'show-weekdate';
// alias to prevent xgettext from picking up strings translated in GTK+
const gtk30_ = Gettext_gtk30.gettext;
// in org.gnome.desktop.interface // in org.gnome.desktop.interface
const CLOCK_FORMAT_KEY = 'clock-format'; const CLOCK_FORMAT_KEY = 'clock-format';
@@ -383,14 +380,14 @@ const Calendar = new Lang.Class({
_init: function() { _init: function() {
this._weekStart = Shell.util_get_week_start(); this._weekStart = Shell.util_get_week_start();
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell.calendar' }); this._settings = new Gio.Settings({ schema: 'org.gnome.shell.calendar' });
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange)); this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY); this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
// Find the ordering for month/year in the calendar heading // Find the ordering for month/year in the calendar heading
this._headerFormatWithoutYear = '%B'; this._headerFormatWithoutYear = '%B';
switch (gtk30_('calendar:MY')) { switch (Gettext_gtk30.gettext('calendar:MY')) {
case 'calendar:MY': case 'calendar:MY':
this._headerFormat = '%B %Y'; this._headerFormat = '%B %Y';
break; break;
@@ -408,9 +405,9 @@ const Calendar = new Lang.Class({
this._shouldDateGrabFocus = false; this._shouldDateGrabFocus = false;
this.actor = new St.Widget({ style_class: 'calendar', this.actor = new St.Table({ homogeneous: false,
layout_manager: new Clutter.TableLayout(), style_class: 'calendar',
reactive: true }); reactive: true });
this.actor.connect('scroll-event', this.actor.connect('scroll-event',
Lang.bind(this, this._onScroll)); Lang.bind(this, this._onScroll));
@@ -423,10 +420,8 @@ const Calendar = new Lang.Class({
setEventSource: function(eventSource) { setEventSource: function(eventSource) {
this._eventSource = eventSource; this._eventSource = eventSource;
this._eventSource.connect('changed', Lang.bind(this, function() { this._eventSource.connect('changed', Lang.bind(this, function() {
this._rebuildCalendar();
this._update(); this._update();
})); }));
this._rebuildCalendar();
this._update(); this._update();
}, },
@@ -441,14 +436,13 @@ const Calendar = new Lang.Class({
}, },
_buildHeader: function() { _buildHeader: function() {
let layout = this.actor.layout_manager;
let offsetCols = this._useWeekdate ? 1 : 0; let offsetCols = this._useWeekdate ? 1 : 0;
this.actor.destroy_all_children(); this.actor.destroy_all_children();
// Top line of the calendar '<| September 2009 |>' // Top line of the calendar '<| September 2009 |>'
this._topBox = new St.BoxLayout(); this._topBox = new St.BoxLayout();
layout.pack(this._topBox, 0, 0); this.actor.add(this._topBox,
layout.set_span(this._topBox, offsetCols + 7, 1); { row: 0, col: 0, col_span: offsetCols + 7 });
this._backButton = new St.Button({ style_class: 'calendar-change-month-back', this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
accessible_name: _("Previous month"), accessible_name: _("Previous month"),
@@ -480,12 +474,10 @@ const Calendar = new Lang.Class({
let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay()); let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay());
let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading', let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading',
text: customDayAbbrev }); text: customDayAbbrev });
let col; this.actor.add(label,
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL) { row: 1,
col = 6 - (7 + iter.getDay() - this._weekStart) % 7; col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7,
else x_fill: false, x_align: St.Align.MIDDLE });
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.pack(label, col, 1);
iter.setTime(iter.getTime() + MSECS_IN_DAY); iter.setTime(iter.getTime() + MSECS_IN_DAY);
} }
@@ -604,7 +596,6 @@ const Calendar = new Lang.Class({
beginDate.setTime(beginDate.getTime() - (weekPadding + daysToWeekStart) * MSECS_IN_DAY); beginDate.setTime(beginDate.getTime() - (weekPadding + daysToWeekStart) * MSECS_IN_DAY);
let layout = this.actor.layout_manager;
let iter = new Date(beginDate); let iter = new Date(beginDate);
let row = 2; let row = 2;
// nRows here means 6 weeks + one header + one navbar // nRows here means 6 weeks + one header + one navbar
@@ -652,19 +643,16 @@ const Calendar = new Lang.Class({
button.style_class = styleClass; button.style_class = styleClass;
let offsetCols = this._useWeekdate ? 1 : 0; let offsetCols = this._useWeekdate ? 1 : 0;
let col; this.actor.add(button,
if (rtl) { row: row, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7 });
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
else
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.pack(button, col, row);
this._buttons.push(button); this._buttons.push(button);
if (this._useWeekdate && iter.getDay() == 4) { if (this._useWeekdate && iter.getDay() == 4) {
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(), let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
style_class: 'calendar-day-base calendar-week-number'}); style_class: 'calendar-day-base calendar-week-number'});
layout.pack(label, rtl ? 7 : 0, row); this.actor.add(label,
{ row: row, col: 0, y_align: St.Align.MIDDLE });
} }
iter.setTime(iter.getTime() + MSECS_IN_DAY); iter.setTime(iter.getTime() + MSECS_IN_DAY);
@@ -707,12 +695,9 @@ const EventsList = new Lang.Class({
Name: 'EventsList', Name: 'EventsList',
_init: function() { _init: function() {
let layout = new Clutter.TableLayout(); this.actor = new St.Table({ style_class: 'events-table' });
this.actor = new St.Widget({ style_class: 'events-table',
layout_manager: layout });
layout.hookup_style(this.actor);
this._date = new Date(); this._date = new Date();
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._desktopSettings.connect('changed', Lang.bind(this, this._update)); this._desktopSettings.connect('changed', Lang.bind(this, this._update));
this._weekStart = Shell.util_get_week_start(); this._weekStart = Shell.util_get_week_start();
}, },
@@ -734,13 +719,9 @@ const EventsList = new Lang.Class({
dayLabel.clutter_text.line_wrap = false; dayLabel.clutter_text.line_wrap = false;
dayLabel.clutter_text.ellipsize = false; dayLabel.clutter_text.ellipsize = false;
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL; this.actor.add(dayLabel, { row: index, col: 0,
x_expand: false, x_align: St.Align.END,
let layout = this.actor.layout_manager; y_fill: false, y_align: St.Align.START });
layout.pack(dayLabel, rtl ? 2 : 0, index);
layout.child_set(dayLabel, { x_expand: false,
x_align: Clutter.TableAlignment.END,
y_align: Clutter.TableAlignment.START });
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY); let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let timeString = _formatEventTime(event, clockFormat); let timeString = _formatEventTime(event, clockFormat);
@@ -749,17 +730,18 @@ const EventsList = new Lang.Class({
timeLabel.clutter_text.line_wrap = false; timeLabel.clutter_text.line_wrap = false;
timeLabel.clutter_text.ellipsize = false; timeLabel.clutter_text.ellipsize = false;
layout.pack(timeLabel, 1, index); this.actor.add(timeLabel, { row: index, col: 1,
layout.child_set(timeLabel, { x_expand: false, x_expand: false, x_align: St.Align.MIDDLE,
y_align: Clutter.TableAlignment.START }); y_fill: false, y_align: St.Align.START });
let titleLabel = new St.Label({ style_class: 'events-day-task', let titleLabel = new St.Label({ style_class: 'events-day-task',
text: event.summary }); text: event.summary });
titleLabel.clutter_text.line_wrap = true; titleLabel.clutter_text.line_wrap = true;
titleLabel.clutter_text.ellipsize = false; titleLabel.clutter_text.ellipsize = false;
layout.pack(titleLabel, rtl ? 0 : 2, index); this.actor.add(titleLabel, { row: index, col: 2,
layout.child_set(titleLabel, { x_expand: true }); x_expand: true, x_align: St.Align.START,
y_fill: false, y_align: St.Align.START });
}, },
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) { _addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
@@ -768,10 +750,13 @@ const EventsList = new Lang.Class({
if (events.length == 0 && !showNothingScheduled) if (events.length == 0 && !showNothingScheduled)
return index; return index;
let label = new St.Label({ style_class: 'events-day-header', text: header }); this.actor.add(new St.Label({ style_class: 'events-day-header', text: header }),
let layout = this.actor.layout_manager; { row: index, col: 0, col_span: 3,
layout.pack(label, 0, index); // In theory, x_expand should be true here, but x_expand
layout.child_set(label, { column_span: 3, x_expand: false }); // is a property of the column for StTable, ie all day cells
// get it too
x_expand: false, x_align: St.Align.START,
y_fill: false, y_align: St.Align.START });
index++; index++;
for (let n = 0; n < events.length; n++) { for (let n = 0; n < events.length; n++) {

View File

@@ -23,7 +23,7 @@ const AutomountManager = new Lang.Class({
Name: 'AutomountManager', Name: 'AutomountManager',
_init: function() { _init: function() {
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
this._volumeQueue = []; this._volumeQueue = [];
this._session = new GnomeSession.SessionManager(); this._session = new GnomeSession.SessionManager();
this._session.connectSignal('InhibitorAdded', this._session.connectSignal('InhibitorAdded',
@@ -43,7 +43,6 @@ const AutomountManager = new Lang.Class({
this._driveEjectButtonId = this._volumeMonitor.connect('drive-eject-button', Lang.bind(this, this._onDriveEjectButton)); this._driveEjectButtonId = this._volumeMonitor.connect('drive-eject-button', Lang.bind(this, this._onDriveEjectButton));
this._mountAllId = Mainloop.idle_add(Lang.bind(this, this._startupMountAll)); this._mountAllId = Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll');
}, },
disable: function() { disable: function() {
@@ -235,11 +234,10 @@ const AutomountManager = new Lang.Class({
}, },
_allowAutorunExpire: function(volume) { _allowAutorunExpire: function(volume) {
let id = Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() { Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() {
volume.allowAutorun = false; volume.allowAutorun = false;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
} }
}); });
const Component = AutomountManager; const Component = AutomountManager;

View File

@@ -96,7 +96,7 @@ const ContentTypeDiscoverer = new Lang.Class({
_init: function(callback) { _init: function(callback) {
this._callback = callback; this._callback = callback;
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
}, },
guessContentTypes: function(mount) { guessContentTypes: function(mount) {
@@ -441,7 +441,7 @@ const AutorunTransientDispatcher = new Lang.Class({
_init: function(manager) { _init: function(manager) {
this._manager = manager; this._manager = manager;
this._sources = []; this._sources = [];
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA }); this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
}, },
_getAutorunSettingForType: function(contentType) { _getAutorunSettingForType: function(contentType) {

View File

@@ -77,7 +77,6 @@ const NetworkSecretDialog = new Lang.Class({
layout_manager: layout }); layout_manager: layout });
layout.hookup_style(secretTable); layout.hookup_style(secretTable);
let rtl = secretTable.get_text_direction() == Clutter.TextDirection.RTL;
let initialFocusSet = false; let initialFocusSet = false;
let pos = 0; let pos = 0;
for (let i = 0; i < this._content.secrets.length; i++) { for (let i = 0; i < this._content.secrets.length; i++) {
@@ -117,15 +116,10 @@ const NetworkSecretDialog = new Lang.Class({
} else } else
secret.valid = true; secret.valid = true;
if (rtl) { layout.pack(label, 0, pos);
layout.pack(secret.entry, 0, pos);
layout.pack(label, 1, pos);
} else {
layout.pack(label, 0, pos);
layout.pack(secret.entry, 1, pos);
}
layout.child_set(label, { x_expand: false, y_fill: false, layout.child_set(label, { x_expand: false, y_fill: false,
x_align: Clutter.TableAlignment.START }); x_align: Clutter.TableAlignment.START });
layout.pack(secret.entry, 1, pos);
pos++; pos++;
if (secret.password) if (secret.password)
@@ -516,12 +510,10 @@ const VPNRequestHandler = new Lang.Class({
_showNewStyleDialog: function() { _showNewStyleDialog: function() {
let keyfile = new GLib.KeyFile(); let keyfile = new GLib.KeyFile();
let data;
let contentOverride; let contentOverride;
try { try {
data = this._dataStdout.peek_buffer(); let data = this._dataStdout.peek_buffer();
keyfile.load_from_data(data.toString(), data.length, keyfile.load_from_data(data.toString(), data.length,
GLib.KeyFileFlags.NONE); GLib.KeyFileFlags.NONE);
@@ -554,16 +546,13 @@ const VPNRequestHandler = new Lang.Class({
} }
} }
} catch(e) { } catch(e) {
// No output is a valid case it means "both secrets are stored" logError(e, 'error while reading VPN plugin output keyfile');
if (data.length > 0) {
logError(e, 'error while reading VPN plugin output keyfile');
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR); this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
return; return;
}
} }
if (contentOverride && contentOverride.secrets.length) { if (contentOverride.secrets.length) {
// Only show the dialog if we actually have something to ask // Only show the dialog if we actually have something to ask
this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], contentOverride); this._shellDialog = new NetworkSecretDialog(this._agent, this._requestId, this._connection, 'vpn', [], contentOverride);
this._shellDialog.open(global.get_current_time()); this._shellDialog.open(global.get_current_time());

View File

@@ -681,7 +681,6 @@ const ChatSource = new Lang.Class({
Mainloop.source_remove(this._notifyTimeoutId); Mainloop.source_remove(this._notifyTimeoutId);
this._notifyTimeoutId = Mainloop.timeout_add(500, this._notifyTimeoutId = Mainloop.timeout_add(500,
Lang.bind(this, this._notifyTimeout)); Lang.bind(this, this._notifyTimeout));
GLib.Source.set_name_by_id(this._notifyTimeoutId, '[gnome-shell] this._notifyTimeout');
}, },
_notifyTimeout: function() { _notifyTimeout: function() {
@@ -783,6 +782,7 @@ const ChatNotification = new Lang.Class({
this._createScrollArea(); this._createScrollArea();
this._lastGroup = null; this._lastGroup = null;
this._lastGroupActor = null;
// Keep track of the bottom position for the current adjustment and // Keep track of the bottom position for the current adjustment and
// force a scroll to the bottom if things change while we were at the // force a scroll to the bottom if things change while we were at the
@@ -924,16 +924,14 @@ const ChatNotification = new Lang.Class({
realMessage: group != 'meta' }); realMessage: group != 'meta' });
if (!props.noTimestamp) { if (!props.noTimestamp) {
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME) { if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME)
this.appendTimestamp(); this.appendTimestamp();
} else { else
// Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME // Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME
// from the timestamp of the message. // from the timestamp of the message.
this._timestampTimeoutId = Mainloop.timeout_add_seconds( this._timestampTimeoutId = Mainloop.timeout_add_seconds(
SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp), SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp),
Lang.bind(this, this.appendTimestamp)); Lang.bind(this, this.appendTimestamp));
GLib.Source.set_name_by_id(this._timestampTimeoutId, '[gnome-shell] this.appendTimestamp');
}
} }
this._filterMessages(); this._filterMessages();
@@ -946,76 +944,80 @@ const ChatNotification = new Lang.Class({
let format; let format;
let desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); let desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
let clockFormat = desktopSettings.get_string(CLOCK_FORMAT_KEY); let clockFormat = desktopSettings.get_string(CLOCK_FORMAT_KEY);
let hasAmPm = date.toLocaleFormat('%p') != '';
if (clockFormat == '24h' || !hasAmPm) { switch (clockFormat) {
// Show only the time if date is on today case '24h':
if(daysAgo < 1){ // Show only the time if date is on today
/* Translators: Time in 24h format */ if(daysAgo < 1){
format = _("%H\u2236%M"); /* Translators: Time in 24h format */
} format = _("%H\u2236%M");
// Show the word "Yesterday" and time if date is on yesterday }
else if(daysAgo <2){ // Show the word "Yesterday" and time if date is on yesterday
/* Translators: this is the word "Yesterday" followed by a else if(daysAgo <2){
time string in 24h format. i.e. "Yesterday, 14:30" */ /* Translators: this is the word "Yesterday" followed by a
// xgettext:no-c-format time string in 24h format. i.e. "Yesterday, 14:30" */
format = _("Yesterday, %H\u2236%M"); // xgettext:no-c-format
} format = _("Yesterday, %H\u2236%M");
// Show a week day and time if date is in the last week }
else if (daysAgo < 7) { // Show a week day and time if date is in the last week
/* Translators: this is the week day name followed by a time else if (daysAgo < 7) {
string in 24h format. i.e. "Monday, 14:30" */ /* Translators: this is the week day name followed by a time
// xgettext:no-c-format string in 24h format. i.e. "Monday, 14:30" */
format = _("%A, %H\u2236%M"); // xgettext:no-c-format
format = _("%A, %H\u2236%M");
} else if (date.getYear() == now.getYear()) { } else if (date.getYear() == now.getYear()) {
/* Translators: this is the month name and day number /* Translators: this is the month name and day number
followed by a time string in 24h format. followed by a time string in 24h format.
i.e. "May 25, 14:30" */ i.e. "May 25, 14:30" */
// xgettext:no-c-format // xgettext:no-c-format
format = _("%B %d, %H\u2236%M"); format = _("%B %d, %H\u2236%M");
} else { } else {
/* Translators: this is the month name, day number, year /* Translators: this is the month name, day number, year
number followed by a time string in 24h format. number followed by a time string in 24h format.
i.e. "May 25 2012, 14:30" */ i.e. "May 25 2012, 14:30" */
// xgettext:no-c-format // xgettext:no-c-format
format = _("%B %d %Y, %H\u2236%M"); format = _("%B %d %Y, %H\u2236%M");
} }
} else { break;
// Show only the time if date is on today default:
if(daysAgo < 1){ /* explicit fall-through */
/* Translators: Time in 24h format */ case '12h':
format = _("%l\u2236%M %p"); // Show only the time if date is on today
} if(daysAgo < 1){
// Show the word "Yesterday" and time if date is on yesterday /* Translators: Time in 24h format */
else if(daysAgo <2){ format = _("%l\u2236%M %p");
/* Translators: this is the word "Yesterday" followed by a }
time string in 12h format. i.e. "Yesterday, 2:30 pm" */ // Show the word "Yesterday" and time if date is on yesterday
// xgettext:no-c-format else if(daysAgo <2){
format = _("Yesterday, %l\u2236%M %p"); /* Translators: this is the word "Yesterday" followed by a
} time string in 12h format. i.e. "Yesterday, 2:30 pm" */
// Show a week day and time if date is in the last week // xgettext:no-c-format
else if (daysAgo < 7) { format = _("Yesterday, %l\u2236%M %p");
/* Translators: this is the week day name followed by a time }
string in 12h format. i.e. "Monday, 2:30 pm" */ // Show a week day and time if date is in the last week
// xgettext:no-c-format else if (daysAgo < 7) {
format = _("%A, %l\u2236%M %p"); /* Translators: this is the week day name followed by a time
string in 12h format. i.e. "Monday, 2:30 pm" */
// xgettext:no-c-format
format = _("%A, %l\u2236%M %p");
} else if (date.getYear() == now.getYear()) { } else if (date.getYear() == now.getYear()) {
/* Translators: this is the month name and day number /* Translators: this is the month name and day number
followed by a time string in 12h format. followed by a time string in 12h format.
i.e. "May 25, 2:30 pm" */ i.e. "May 25, 2:30 pm" */
// xgettext:no-c-format // xgettext:no-c-format
format = _("%B %d, %l\u2236%M %p"); format = _("%B %d, %l\u2236%M %p");
} else { } else {
/* Translators: this is the month name, day number, year /* Translators: this is the month name, day number, year
number followed by a time string in 12h format. number followed by a time string in 12h format.
i.e. "May 25 2012, 2:30 pm"*/ i.e. "May 25 2012, 2:30 pm"*/
// xgettext:no-c-format // xgettext:no-c-format
format = _("%B %d %Y, %l\u2236%M %p"); format = _("%B %d %Y, %l\u2236%M %p");
} }
break;
} }
return date.toLocaleFormat(format); return date.toLocaleFormat(format);
}, },
@@ -1098,7 +1100,6 @@ const ChatNotification = new Lang.Class({
this._composingTimeoutId = Mainloop.timeout_add_seconds( this._composingTimeoutId = Mainloop.timeout_add_seconds(
COMPOSING_STOP_TIMEOUT, COMPOSING_STOP_TIMEOUT,
Lang.bind(this, this._composingStopTimeout)); Lang.bind(this, this._composingStopTimeout));
GLib.Source.set_name_by_id(this._composingTimeoutId, '[gnome-shell] this._composingStopTimeout');
} else { } else {
this.source.setChatState(Tp.ChannelChatState.ACTIVE); this.source.setChatState(Tp.ChannelChatState.ACTIVE);
} }
@@ -1269,8 +1270,7 @@ const SubscriptionRequestNotification = new Lang.Class({
if (file) { if (file) {
let uri = file.get_uri(); let uri = file.get_uri();
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size);
iconBox.child = textureCache.load_uri_async(uri, iconBox._size, iconBox._size, scaleFactor);
} }
else { else {
iconBox.child = new St.Icon({ icon_name: 'avatar-default', iconBox.child = new St.Icon({ icon_name: 'avatar-default',
@@ -1421,12 +1421,7 @@ const AccountNotification = new Lang.Class({
if (status == Tp.ConnectionStatus.CONNECTED) { if (status == Tp.ConnectionStatus.CONNECTED) {
this.destroy(); this.destroy();
} else if (status == Tp.ConnectionStatus.DISCONNECTED) { } else if (status == Tp.ConnectionStatus.DISCONNECTED) {
let connectionError = account.connection_error; this.update(this.title, this._getMessage(account.connection_error));
if (connectionError == Tp.error_get_dbus_name(Tp.Error.CANCELLED))
this.destroy();
else
this.update(this.title, this._getMessage(connectionError));
} }
})); }));
}, },

View File

@@ -87,7 +87,7 @@ const CtrlAltTabManager = new Lang.Class({
if (Main.sessionMode.hasWindows && !Main.overview.visible) { if (Main.sessionMode.hasWindows && !Main.overview.visible) {
let screen = global.screen; let screen = global.screen;
let display = screen.get_display(); let display = screen.get_display();
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen.get_active_workspace ()); let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let windowTracker = Shell.WindowTracker.get_default(); let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default(); let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) { for (let i = 0; i < windows.length; i++) {
@@ -165,10 +165,6 @@ const CtrlAltTabPopup = new Lang.Class({
this._select(this._previous()); this._select(this._previous());
else if (keysym == Clutter.Right) else if (keysym == Clutter.Right)
this._select(this._next()); this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
return Clutter.EVENT_STOP;
}, },
_finish : function(time) { _finish : function(time) {

View File

@@ -582,7 +582,6 @@ const Dash = new Lang.Class({
this._showLabelTimeoutId = 0; this._showLabelTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel');
if (this._resetHoverTimeoutId > 0) { if (this._resetHoverTimeoutId > 0) {
Mainloop.source_remove(this._resetHoverTimeoutId); Mainloop.source_remove(this._resetHoverTimeoutId);
this._resetHoverTimeoutId = 0; this._resetHoverTimeoutId = 0;
@@ -600,7 +599,6 @@ const Dash = new Lang.Class({
this._resetHoverTimeoutId = 0; this._resetHoverTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing');
} }
} }
}, },

View File

@@ -18,7 +18,8 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Calendar = imports.ui.calendar; const Calendar = imports.ui.calendar;
function _onVertSepRepaint(area) { function _onVertSepRepaint (area)
{
let cr = area.get_context(); let cr = area.get_context();
let themeNode = area.get_theme_node(); let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size(); let [width, height] = area.get_surface_size();
@@ -32,7 +33,7 @@ function _onVertSepRepaint(area) {
cr.setLineWidth(stippleWidth); cr.setLineWidth(stippleWidth);
cr.stroke(); cr.stroke();
cr.$dispose(); cr.$dispose();
} };
const DateMenuButton = new Lang.Class({ const DateMenuButton = new Lang.Class({
Name: 'DateMenuButton', Name: 'DateMenuButton',
@@ -62,11 +63,8 @@ const DateMenuButton = new Lang.Class({
hbox.add(vbox); hbox.add(vbox);
// Date // Date
// Having the ability to go to the current date if the user is already
// on the current date can be confusing. So don't make the button reactive
// until the selected date changes.
this._date = new St.Button({ style_class: 'datemenu-date-label', this._date = new St.Button({ style_class: 'datemenu-date-label',
reactive: false can_focus: true,
}); });
this._date.connect('clicked', this._date.connect('clicked',
Lang.bind(this, function() { Lang.bind(this, function() {
@@ -84,9 +82,6 @@ const DateMenuButton = new Lang.Class({
// and the calender makes those dates unclickable when instantiated with // and the calender makes those dates unclickable when instantiated with
// a null event source // a null event source
this._eventList.setDate(date); this._eventList.setDate(date);
// Make the button reactive only if the selected date is not the current date.
this._date.can_focus = this._date.reactive = !this._isToday(date)
})); }));
vbox.add(this._calendar.actor); vbox.add(this._calendar.actor);
@@ -137,13 +132,6 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated(); this._sessionUpdated();
}, },
_isToday: function(date) {
let now = new Date();
return now.getYear() == date.getYear() &&
now.getMonth() == date.getMonth() &&
now.getDay() == date.getDay();
},
_appInstalledChanged: function() { _appInstalledChanged: function() {
this._calendarApp = undefined; this._calendarApp = undefined;
this._updateEventsVisibility(); this._updateEventsVisibility();

View File

@@ -395,7 +395,6 @@ const _Draggable = new Lang.Class({
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));
GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover');
}, },
_updateDragPosition : function (event) { _updateDragPosition : function (event) {

View File

@@ -551,7 +551,6 @@ const EndSessionDialog = new Lang.Class({
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm');
}, },
_stopTimer: function() { _stopTimer: function() {

View File

@@ -5,8 +5,6 @@ imports.gi.versions.Gio = '2.0';
imports.gi.versions.Gdk = '3.0'; imports.gi.versions.Gdk = '3.0';
imports.gi.versions.GdkPixbuf = '2.0'; imports.gi.versions.GdkPixbuf = '2.0';
imports.gi.versions.Gtk = '3.0'; imports.gi.versions.Gtk = '3.0';
imports.gi.versions.TelepathyGLib = '0.12';
imports.gi.versions.TelepathyLogger = '0.2';
const Clutter = imports.gi.Clutter;; const Clutter = imports.gi.Clutter;;
const Gettext = imports.gettext; const Gettext = imports.gettext;
@@ -47,11 +45,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
layoutClass.prototype.hookup_style = function(container) { layoutClass.prototype.hookup_style = function(container) {
container.connect('style-changed', Lang.bind(this, function() { container.connect('style-changed', Lang.bind(this, function() {
let node = container.get_theme_node(); let node = container.get_theme_node();
for (let prop in styleProps) { for (let prop in styleProps)
let [found, length] = node.lookup_length(styleProps[prop], false); this[prop] = node.get_length(styleProps[prop]);
if (found)
this[prop] = length;
}
})); }));
}; };
layoutClass.prototype.child_set = function(actor, props) { layoutClass.prototype.child_set = function(actor, props) {

View File

@@ -32,9 +32,11 @@ const FocusCaretTracker = new Lang.Class({
Name: 'FocusCaretTracker', Name: 'FocusCaretTracker',
_init: function() { _init: function() {
Atspi.init();
Atspi.set_timeout(250, 250);
this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged)); this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
this._atspiInited = false;
this._focusListenerRegistered = false; this._focusListenerRegistered = false;
this._caretListenerRegistered = false; this._caretListenerRegistered = false;
}, },
@@ -46,20 +48,12 @@ const FocusCaretTracker = new Lang.Class({
this.emit('caret-moved', event); this.emit('caret-moved', event);
}, },
_initAtspi: function() {
if (!this._atspiInited) {
Atspi.init();
Atspi.set_timeout(250, 250);
this._atspiInited = true;
}
},
registerFocusListener: function() { registerFocusListener: function() {
if (this._focusListenerRegistered) if (this._focusListenerRegistered)
return; return;
this._initAtspi(); // Ignore the return value, we get an exception if they fail
// And they should never fail
this._atspiListener.register(STATECHANGED + ':focused'); this._atspiListener.register(STATECHANGED + ':focused');
this._atspiListener.register(STATECHANGED + ':selected'); this._atspiListener.register(STATECHANGED + ':selected');
this._focusListenerRegistered = true; this._focusListenerRegistered = true;
@@ -69,8 +63,6 @@ const FocusCaretTracker = new Lang.Class({
if (this._caretListenerRegistered) if (this._caretListenerRegistered)
return; return;
this._initAtspi();
this._atspiListener.register(CARETMOVED); this._atspiListener.register(CARETMOVED);
this._caretListenerRegistered = true; this._caretListenerRegistered = true;
}, },

View File

@@ -155,7 +155,7 @@ const CandidatePopup = new Lang.Class({
panelService.connect('set-cursor-location', panelService.connect('set-cursor-location',
Lang.bind(this, function(ps, x, y, w, h) { Lang.bind(this, function(ps, x, y, w, h) {
Main.layoutManager.setDummyCursorGeometry(x, y, w, h); Main.layoutManager.setDummyCursorPosition(x, y);
if (this._boxPointer.actor.visible) if (this._boxPointer.actor.visible)
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0); this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
})); }));

View File

@@ -214,20 +214,6 @@ const IconGrid = new Lang.Class({
this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth)); this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight)); this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this._grid.connect('allocate', Lang.bind(this, this._allocate)); this._grid.connect('allocate', Lang.bind(this, this._allocate));
this._grid.connect('actor-added', Lang.bind(this, this._childAdded));
this._grid.connect('actor-removed', Lang.bind(this, this._childRemoved));
},
_keyFocusIn: function(actor) {
this.emit('key-focus-in', actor);
},
_childAdded: function(grid, child) {
child._iconGridKeyFocusInId = child.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
},
_childRemoved: function(grid, child) {
child.disconnect(child._iconGridKeyFocusInId);
}, },
_getPreferredWidth: function (grid, forHeight, alloc) { _getPreferredWidth: function (grid, forHeight, alloc) {
@@ -522,6 +508,11 @@ const IconGrid = new Lang.Class({
this._fixedHItemSize = Math.max(this._hItemSize - neededSpacePerItem, MIN_ICON_SIZE); this._fixedHItemSize = Math.max(this._hItemSize - neededSpacePerItem, MIN_ICON_SIZE);
this._fixedVItemSize = Math.max(this._vItemSize - neededSpacePerItem, MIN_ICON_SIZE); this._fixedVItemSize = Math.max(this._vItemSize - neededSpacePerItem, MIN_ICON_SIZE);
if (this._fixedHItemSize < MIN_ICON_SIZE)
this._fixedHItemSize = MIN_ICON_SIZE;
if (this._fixedVItemSize < MIN_ICON_SIZE)
this._fixedVItemSize = MIN_ICON_SIZE;
this._updateSpacingForSize(availWidth, availHeight); this._updateSpacingForSize(availWidth, availHeight);
} }
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize); let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
@@ -530,13 +521,12 @@ const IconGrid = new Lang.Class({
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up // Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
_updateChildrenScale: function(scale) { _updateChildrenScale: function(scale) {
let newIconSize = Math.floor(ICON_SIZE * scale);
for (let i in this._items) { for (let i in this._items) {
let newIconSize = Math.floor(ICON_SIZE * scale);
this._items[i].icon.setIconSize(newIconSize); this._items[i].icon.setIconSize(newIconSize);
} }
} }
}); });
Signals.addSignalMethods(IconGrid.prototype);
const PaginatedIconGrid = new Lang.Class({ const PaginatedIconGrid = new Lang.Class({
Name: 'PaginatedIconGrid', Name: 'PaginatedIconGrid',
@@ -640,10 +630,6 @@ const PaginatedIconGrid = new Lang.Class({
return this._nPages; return this._nPages;
}, },
getPageHeight: function() {
return this._availableHeightPerPageForItems();
},
getPageY: function(pageNumber) { getPageY: function(pageNumber) {
if (!this._nPages) if (!this._nPages)
return 0; return 0;

View File

@@ -161,9 +161,9 @@ const Keyboard = new Lang.Class({
this._timestamp = global.display.get_current_time_roundtrip(); this._timestamp = global.display.get_current_time_roundtrip();
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA }); this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged)); this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA }); this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA });
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged)); this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
this._settingsChanged(); this._settingsChanged();
@@ -266,14 +266,12 @@ const Keyboard = new Lang.Class({
return; return;
} }
if (!this._showIdleId) { if (!this._showIdleId)
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE, this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() { Lang.bind(this, function() {
this.Show(time); this.Show(time);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.Show');
}
}, },
_createLayersForGroup: function (gname) { _createLayersForGroup: function (gname) {
@@ -502,7 +500,6 @@ const Keyboard = new Lang.Class({
this._show(monitor); this._show(monitor);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
}, },
_show: function(monitor) { _show: function(monitor) {
@@ -529,7 +526,6 @@ const Keyboard = new Lang.Class({
this._hide(); this._hide();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
}, },
_hide: function() { _hide: function() {

View File

@@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const Lang = imports.lang; const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
@@ -212,10 +213,6 @@ const LayoutManager = new Lang.Class({
this.addChrome(this.trayBox); this.addChrome(this.trayBox);
this._setupTrayPressure(); this._setupTrayPressure();
this.modalDialogGroup = new St.Widget({ name: 'modalDialogGroup',
layout_manager: new Clutter.BinLayout() });
this.uiGroup.add_actor(this.modalDialogGroup);
this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox', this.keyboardBox = new St.BoxLayout({ name: 'keyboardBox',
reactive: true, reactive: true,
track_hover: true }); track_hover: true });
@@ -223,7 +220,7 @@ const LayoutManager = new Lang.Class({
this._keyboardHeightNotifyId = 0; this._keyboardHeightNotifyId = 0;
// A dummy actor that tracks the mouse or text cursor, based on the // A dummy actor that tracks the mouse or text cursor, based on the
// position and size set in setDummyCursorGeometry. // position set in setDummyCursorPosition.
this.dummyCursor = new St.Widget({ width: 0, height: 0 }); this.dummyCursor = new St.Widget({ width: 0, height: 0 });
this.uiGroup.add_actor(this.dummyCursor); this.uiGroup.add_actor(this.dummyCursor);
@@ -603,7 +600,7 @@ const LayoutManager = new Lang.Class({
this._updateBackgrounds(); this._updateBackgrounds();
// We need to force an update of the regions now before we scale // We need to force an update of the regions now before we scale
// the UI group to get the correct allocation for the struts. // the UI group to get the coorect allocation for the struts.
this._updateRegions(); this._updateRegions();
this.trayBox.hide(); this.trayBox.hide();
@@ -628,11 +625,10 @@ const LayoutManager = new Lang.Class({
// until the event loop is uncontended and idle. // until the event loop is uncontended and idle.
// This helps to prevent us from running the animation // This helps to prevent us from running the animation
// when the system is bogged down // when the system is bogged down
let id = GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() { GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() {
this._startupAnimation(); this._startupAnimation();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._startupAnimation');
}, },
_startupAnimation: function() { _startupAnimation: function() {
@@ -729,7 +725,7 @@ const LayoutManager = new Lang.Class({
this._updateRegions(); this._updateRegions();
}, },
// setDummyCursorGeometry: // setDummyCursorPosition:
// //
// The cursor dummy is a standard widget commonly used for popup // The cursor dummy is a standard widget commonly used for popup
// menus and box pointers to track, as the box pointer API only // menus and box pointers to track, as the box pointer API only
@@ -738,10 +734,9 @@ const LayoutManager = new Lang.Class({
// is what you should use. Given that the menu should not track // is what you should use. Given that the menu should not track
// the actual mouse pointer as it moves, you need to call this // the actual mouse pointer as it moves, you need to call this
// function before you show the menu to ensure it is at the right // function before you show the menu to ensure it is at the right
// position and has the right size. // position.
setDummyCursorGeometry: function(x, y, w, h) { setDummyCursorPosition: function(x, y) {
this.dummyCursor.set_position(Math.round(x), Math.round(y)); this.dummyCursor.set_position(Math.round(x), Math.round(y));
this.dummyCursor.set_size(Math.round(w), Math.round(h));
}, },
// addChrome: // addChrome:
@@ -912,8 +907,8 @@ const LayoutManager = new Lang.Class({
return; return;
if (!this._updateRegionIdle) if (!this._updateRegionIdle)
this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
Lang.bind(this, this._updateRegions)); Meta.PRIORITY_BEFORE_REDRAW);
}, },
_getWindowActorsForWorkspace: function(workspace) { _getWindowActorsForWorkspace: function(workspace) {
@@ -944,7 +939,7 @@ const LayoutManager = new Lang.Class({
let rects = [], struts = [], i; let rects = [], struts = [], i;
if (this._updateRegionIdle) { if (this._updateRegionIdle) {
Meta.later_remove(this._updateRegionIdle); Mainloop.source_remove(this._updateRegionIdle);
delete this._updateRegionIdle; delete this._updateRegionIdle;
} }
@@ -1017,6 +1012,23 @@ const LayoutManager = new Lang.Class({
else else
continue; continue;
// Ensure that the strut rects goes all the way to the screen edge,
// as this really what mutter expects.
switch (side) {
case Meta.Side.TOP:
y1 = 0;
break;
case Meta.Side.BOTTOM:
y2 = global.screen_height;
break;
case Meta.Side.LEFT:
x1 = 0;
break;
case Meta.Side.RIGHT:
x2 = global.screen_width;
break;
}
let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1}); let strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1});
let strut = new Meta.Strut({ rect: strutRect, side: side }); let strut = new Meta.Strut({ rect: strutRect, side: side });
struts.push(strut); struts.push(strut);

View File

@@ -11,60 +11,30 @@ const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const DEFAULT_FADE_FACTOR = 0.4; const DEFAULT_FADE_FACTOR = 0.4;
const VIGNETTE_BRIGHTNESS = 0.8;
const VIGNETTE_SHARPNESS = 0.7;
const VIGNETTE_DECLARATIONS = '\ const GLSL_DIM_EFFECT_DECLARATIONS = '\
uniform float brightness;\n\ float compute_dim_factor (const vec2 coords) {\
uniform float vignette_sharpness;\n'; vec2 dist = coords - vec2(0.5, 0.5); \
float elipse_radius = 0.5; \
const VIGNETTE_CODE = '\ /* interpolate darkening value, based on distance from screen center */ \
cogl_color_out.a = cogl_color_in.a;\n\ float val = min(length(dist), elipse_radius); \
cogl_color_out.rgb = vec3(0.0, 0.0, 0.0);\n\ return mix(0.3, 1.0, val / elipse_radius) * 0.4; \
vec2 position = cogl_tex_coord_in[0].xy - 0.5;\n\ }';
float t = length(2.0 * position);\n\ const GLSL_DIM_EFFECT_CODE = '\
t = clamp(t, 0.0, 1.0);\n\ float a = compute_dim_factor (cogl_tex_coord0_in.xy);\
float pixel_brightness = mix(1.0, 1.0 - vignette_sharpness, t);\n\ cogl_color_out = vec4(0, 0, 0, cogl_color_in.a * a);'
cogl_color_out.a = cogl_color_out.a * (1 - pixel_brightness * brightness);'; ;
const RadialShaderQuad = new Lang.Class({ const RadialShaderQuad = new Lang.Class({
Name: 'RadialShaderQuad', Name: 'RadialShaderQuad',
Extends: Shell.GLSLQuad, Extends: Shell.GLSLQuad,
_init: function(params) {
this.parent(params);
this._brightnessLocation = this.get_uniform_location('brightness');
this._sharpnessLocation = this.get_uniform_location('vignette_sharpness');
this.brightness = 1.0;
this.vignetteSharpness = 0.0;
},
vfunc_build_pipeline: function() { vfunc_build_pipeline: function() {
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT,
VIGNETTE_DECLARATIONS, VIGNETTE_CODE, true); GLSL_DIM_EFFECT_DECLARATIONS,
GLSL_DIM_EFFECT_CODE,
true);
}, },
get brightness() {
return this._brightness;
},
set brightness(v) {
this._brightness = v;
this.set_uniform_float(this._brightnessLocation,
1, [this._brightness]);
},
get vignetteSharpness() {
return this._sharpness;
},
set vignetteSharpness(v) {
this._sharpness = v;
this.set_uniform_float(this._sharpnessLocation,
1, [this._sharpness]);
}
}); });
/** /**
@@ -105,7 +75,6 @@ const Lightbox = new Lang.Class({
this._container = container; this._container = container;
this._children = container.get_children(); this._children = container.get_children();
this._fadeFactor = params.fadeFactor; this._fadeFactor = params.fadeFactor;
this._radialEffect = params.radialEffect;
if (params.radialEffect) if (params.radialEffect)
this.actor = new RadialShaderQuad({ x: 0, this.actor = new RadialShaderQuad({ x: 0,
y: 0, y: 0,
@@ -113,7 +82,6 @@ const Lightbox = new Lang.Class({
else else
this.actor = new St.Bin({ x: 0, this.actor = new St.Bin({ x: 0,
y: 0, y: 0,
opacity: 0,
style_class: 'lightbox', style_class: 'lightbox',
reactive: params.inhibitEvents }); reactive: params.inhibitEvents });
@@ -165,18 +133,9 @@ const Lightbox = new Lang.Class({
fadeInTime = fadeInTime || 0; fadeInTime = fadeInTime || 0;
Tweener.removeTweens(this.actor); Tweener.removeTweens(this.actor);
if (this._radialEffect) { if (fadeInTime != 0) {
Tweener.addTween(this.actor, this.shown = false;
{ brightness: VIGNETTE_BRIGHTNESS, this.actor.opacity = 0;
vignetteSharpness: VIGNETTE_SHARPNESS,
time: fadeInTime,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.shown = true;
this.emit('shown');
})
});
} else {
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 255 * this._fadeFactor, { opacity: 255 * this._fadeFactor,
time: fadeInTime, time: fadeInTime,
@@ -186,8 +145,11 @@ const Lightbox = new Lang.Class({
this.emit('shown'); this.emit('shown');
}) })
}); });
} else {
this.actor.opacity = 255 * this._fadeFactor;
this.shown = true;
this.emit('shown');
} }
this.actor.show(); this.actor.show();
}, },
@@ -196,18 +158,7 @@ const Lightbox = new Lang.Class({
this.shown = false; this.shown = false;
Tweener.removeTweens(this.actor); Tweener.removeTweens(this.actor);
if (this._radialEffect) { if (fadeOutTime != 0) {
Tweener.addTween(this.actor,
{ brightness: 1.0,
vignetteSharpness: 0.0,
opacity: 0,
time: fadeOutTime,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.actor.hide();
})
});
} else {
Tweener.addTween(this.actor, Tweener.addTween(this.actor,
{ opacity: 0, { opacity: 0,
time: fadeOutTime, time: fadeOutTime,
@@ -216,6 +167,8 @@ const Lightbox = new Lang.Class({
this.actor.hide(); this.actor.hide();
}) })
}); });
} else {
this.actor.hide();
} }
}, },

View File

@@ -797,7 +797,7 @@ const LookingGlass = new Lang.Class({
reactive: true }); reactive: true });
this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent)); this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent));
this._interfaceSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' }); this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
this._interfaceSettings.connect('changed::monospace-font-name', this._interfaceSettings.connect('changed::monospace-font-name',
Lang.bind(this, this._updateFont)); Lang.bind(this, this._updateFont));
this._updateFont(); this._updateFont();
@@ -843,10 +843,9 @@ const LookingGlass = new Lang.Class({
System.gc(); System.gc();
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () { this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-full'; gcIcon.icon_name = 'gnome-fs-trash-full';
this._timeoutId = 0; Mainloop.source_remove(this._timeoutId);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] gcIcon.icon_name = \'gnome-fs-trash-full\'');
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
})); }));

View File

@@ -441,8 +441,8 @@ const Magnifier = new Lang.Class({
}, },
_settingsInit: function(zoomRegion) { _settingsInit: function(zoomRegion) {
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA }); this._appSettings = new Gio.Settings({ schema: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA }); this._settings = new Gio.Settings({ schema: MAGNIFIER_SCHEMA });
if (zoomRegion) { if (zoomRegion) {
// Mag factor is accurate to two decimal places. // Mag factor is accurate to two decimal places.

View File

@@ -43,7 +43,6 @@ const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard'; const A11Y_SCHEMA = 'org.gnome.desktop.a11y.keyboard';
const STICKY_KEYS_ENABLE = 'stickykeys-enable'; const STICKY_KEYS_ENABLE = 'stickykeys-enable';
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
let componentManager = null; let componentManager = null;
let panel = null; let panel = null;
@@ -56,7 +55,7 @@ let screenShield = null;
let notificationDaemon = null; let notificationDaemon = null;
let windowAttentionHandler = null; let windowAttentionHandler = null;
let ctrlAltTabManager = null; let ctrlAltTabManager = null;
let osdWindowManager = null; let osdWindow = null;
let sessionMode = null; let sessionMode = null;
let shellDBusService = null; let shellDBusService = null;
let shellMountOpDBusService = null; let shellMountOpDBusService = null;
@@ -74,6 +73,7 @@ let _startDate;
let _defaultCssStylesheet = null; let _defaultCssStylesheet = null;
let _cssStylesheet = null; let _cssStylesheet = null;
let _a11ySettings = null; let _a11ySettings = null;
let dynamicWorkspacesSchema = null;
function _sessionUpdated() { function _sessionUpdated() {
_loadDefaultStylesheet(); _loadDefaultStylesheet();
@@ -103,6 +103,9 @@ function start() {
global.logError = window.log; global.logError = window.log;
global.log = window.log; global.log = window.log;
if (!Meta.is_wayland_compositor)
Meta.is_wayland_compositor = function () { return false; };
// Chain up async errors reported from C // Chain up async errors reported from C
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); }); global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
@@ -110,6 +113,7 @@ function start() {
sessionMode = new SessionMode.SessionMode(); sessionMode = new SessionMode.SessionMode();
sessionMode.connect('updated', _sessionUpdated); sessionMode.connect('updated', _sessionUpdated);
_initializePrefs();
_initializeUI(); _initializeUI();
shellDBusService = new ShellDBus.GnomeShell(); shellDBusService = new ShellDBus.GnomeShell();
@@ -118,6 +122,17 @@ function start() {
_sessionUpdated(); _sessionUpdated();
} }
function _initializePrefs() {
let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
for (let i = 0; i < keys.length; i++)
Meta.prefs_override_preference_schema(keys[i], sessionMode.overridesSchema);
if (keys.indexOf('dynamic-workspaces') > -1)
dynamicWorkspacesSchema = sessionMode.overridesSchema;
else
dynamicWorkspacesSchema = 'org.gnome.mutter';
}
function _initializeUI() { function _initializeUI() {
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will // Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem // also initialize ShellAppSystem first. ShellAppSystem
@@ -143,7 +158,7 @@ function _initializeUI() {
screencastService = new Screencast.ScreencastService(); screencastService = new Screencast.ScreencastService();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager(); ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
osdWindowManager = new OsdWindow.OsdWindowManager(); osdWindow = new OsdWindow.OsdWindow();
overview = new Overview.Overview(); overview = new Overview.Overview();
wm = new WindowManager.WindowManager(); wm = new WindowManager.WindowManager();
magnifier = new Magnifier.Magnifier(); magnifier = new Magnifier.Magnifier();
@@ -160,7 +175,7 @@ function _initializeUI() {
layoutManager.init(); layoutManager.init();
overview.init(); overview.init();
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); _a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
global.display.connect('overlay-key', Lang.bind(overview, function () { global.display.connect('overlay-key', Lang.bind(overview, function () {
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE)) if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
@@ -176,6 +191,8 @@ function _initializeUI() {
_startDate = new Date(); _startDate = new Date();
log('GNOME Shell started at ' + _startDate);
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE"); let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
if (perfModuleName) { if (perfModuleName) {
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT"); let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
@@ -186,6 +203,10 @@ function _initializeUI() {
ExtensionDownloader.init(); ExtensionDownloader.init();
ExtensionSystem.init(); ExtensionSystem.init();
layoutManager.connect('startup-prepared', function() {
Meta.activate_session();
});
if (sessionMode.isGreeter && screenShield) { if (sessionMode.isGreeter && screenShield) {
layoutManager.connect('startup-prepared', function() { layoutManager.connect('startup-prepared', function() {
screenShield.showDialog(); screenShield.showDialog();
@@ -199,17 +220,6 @@ function _initializeUI() {
if (screenShield) { if (screenShield) {
screenShield.lockIfWasLocked(); screenShield.lockIfWasLocked();
} }
if (LoginManager.haveSystemd() &&
sessionMode.currentMode != 'gdm' &&
sessionMode.currentMode != 'initial-setup') {
// Do not import globally to not depend
// on systemd on non-systemd systems.
let GSystem = imports.gi.GSystem;
GSystem.log_structured_print('GNOME Shell started at ' + _startDate,
['MESSAGE_ID=' + GNOMESHELL_STARTED_MESSAGE_ID]);
} else {
log('GNOME Shell started at ' + _startDate);
}
}); });
} }
@@ -605,6 +615,5 @@ function queueDeferredWork(workId) {
_deferredTimeoutId = 0; _deferredTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork');
} }
} }

View File

@@ -111,6 +111,7 @@ const FocusGrabber = new Lang.Class({
if (this._focused) if (this._focused)
return; return;
this._prevFocusedWindow = global.display.focus_window;
this._prevKeyFocusActor = global.stage.get_key_focus(); this._prevKeyFocusActor = global.stage.get_key_focus();
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged)); this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
@@ -315,7 +316,7 @@ const NotificationGenericPolicy = new Lang.Class({
this.id = 'generic'; this.id = 'generic';
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' }); this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed)); this._masterSettings.connect('changed', Lang.bind(this, this._changed));
}, },
@@ -365,8 +366,8 @@ const NotificationApplicationPolicy = new Lang.Class({
this.id = id; this.id = id;
this._canonicalId = this._canonicalizeId(id); this._canonicalId = this._canonicalizeId(id);
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' }); this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application', this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' }); path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed)); this._masterSettings.connect('changed', Lang.bind(this, this._changed));
@@ -503,6 +504,7 @@ const Notification = new Lang.Class({
this.bannerBodyMarkup = false; this.bannerBodyMarkup = false;
this._bannerBodyAdded = false; this._bannerBodyAdded = false;
this._titleFitsInBannerMode = true; this._titleFitsInBannerMode = true;
this._titleDirection = Clutter.TextDirection.DEFAULT;
this._spacing = 0; this._spacing = 0;
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC; this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
this._imageBin = null; this._imageBin = null;
@@ -641,11 +643,10 @@ const Notification = new Lang.Class({
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : ''; title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>'); this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
let titleDirection;
if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL) if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL)
titleDirection = Clutter.TextDirection.RTL; this._titleDirection = Clutter.TextDirection.RTL;
else else
titleDirection = Clutter.TextDirection.LTR; this._titleDirection = Clutter.TextDirection.LTR;
// Let the title's text direction control the overall direction // Let the title's text direction control the overall direction
// of the notification - in case where different scripts are used // of the notification - in case where different scripts are used
@@ -653,7 +654,7 @@ const Notification = new Lang.Class({
// arguably for action buttons as well. Labels other than the title // arguably for action buttons as well. Labels other than the title
// will be allocated at the available width, so that their alignment // will be allocated at the available width, so that their alignment
// is done correctly automatically. // is done correctly automatically.
this._table.set_text_direction(titleDirection); this._table.set_text_direction(this._titleDirection);
// Unless the notification has custom content, we save this.bannerBodyText // Unless the notification has custom content, we save this.bannerBodyText
// to add it to the content of the notification if the notification is // to add it to the content of the notification if the notification is
@@ -1900,14 +1901,14 @@ const MessageTray = new Lang.Class({
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated)); Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
Main.wm.addKeybinding('toggle-message-tray', Main.wm.addKeybinding('toggle-message-tray',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY | Shell.KeyBindingMode.MESSAGE_TRAY |
Shell.KeyBindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this.toggleAndNavigate)); Lang.bind(this, this.toggleAndNavigate));
Main.wm.addKeybinding('focus-active-notification', Main.wm.addKeybinding('focus-active-notification',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY | Shell.KeyBindingMode.MESSAGE_TRAY |
@@ -1986,7 +1987,6 @@ const MessageTray = new Lang.Class({
this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME, this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME,
Lang.bind(this, this._trayDwellTimeout)); Lang.bind(this, this._trayDwellTimeout));
GLib.Source.set_name_by_id(this._trayDwellTimeoutId, '[gnome-shell] this._trayDwellTimeout');
} }
this._trayDwelling = true; this._trayDwelling = true;
} else { } else {
@@ -2027,18 +2027,13 @@ const MessageTray = new Lang.Class({
_onNotificationKeyRelease: function(actor, event) { _onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) { if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification(); this._closeNotification();
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
_expireNotification: function() {
this._notificationExpired = true;
this._updateState();
},
_closeNotification: function() { _closeNotification: function() {
if (this._notificationState == State.SHOWN) { if (this._notificationState == State.SHOWN) {
this._closeButton.hide(); this._closeButton.hide();
@@ -2267,16 +2262,6 @@ const MessageTray = new Lang.Class({
this._grabHelper.addActor(corner.actor); this._grabHelper.addActor(corner.actor);
}, },
_resetNotificationLeftTimeout: function() {
this._useLongerNotificationLeftTimeout = false;
if (this._notificationLeftTimeoutId) {
Mainloop.source_remove(this._notificationLeftTimeoutId);
this._notificationLeftTimeoutId = 0;
this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1;
}
},
_onNotificationHoverChanged: function() { _onNotificationHoverChanged: function() {
if (this._notificationWidget.hover == this._notificationHovered) if (this._notificationWidget.hover == this._notificationHovered)
return; return;
@@ -2286,7 +2271,14 @@ const MessageTray = new Lang.Class({
// No dwell inside notifications at the bottom of the screen // No dwell inside notifications at the bottom of the screen
this._cancelTrayDwell(); this._cancelTrayDwell();
this._resetNotificationLeftTimeout(); this._useLongerNotificationLeftTimeout = false;
if (this._notificationLeftTimeoutId) {
Mainloop.source_remove(this._notificationLeftTimeoutId);
this._notificationLeftTimeoutId = 0;
this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1;
return;
}
if (this._showNotificationMouseX >= 0) { if (this._showNotificationMouseX >= 0) {
let actorAtShowNotificationPosition = let actorAtShowNotificationPosition =
@@ -2303,7 +2295,6 @@ const MessageTray = new Lang.Class({
return; return;
} }
} }
this._pointerInNotification = true; this._pointerInNotification = true;
this._updateState(); this._updateState();
} else { } else {
@@ -2320,7 +2311,6 @@ const MessageTray = new Lang.Class({
// That gives the user more time to mouse away from the notification and mouse back in in order to expand it. // That gives the user more time to mouse away from the notification and mouse back in in order to expand it.
let timeout = this._useLongerNotificationLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000; let timeout = this._useLongerNotificationLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onNotificationLeftTimeout)); this._notificationLeftTimeoutId = Mainloop.timeout_add(timeout, Lang.bind(this, this._onNotificationLeftTimeout));
GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
} }
}, },
@@ -2356,7 +2346,6 @@ const MessageTray = new Lang.Class({
this._notificationLeftMouseX = -1; this._notificationLeftMouseX = -1;
this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000, this._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
Lang.bind(this, this._onNotificationLeftTimeout)); Lang.bind(this, this._onNotificationLeftTimeout));
GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
} else { } else {
this._notificationLeftTimeoutId = 0; this._notificationLeftTimeoutId = 0;
this._useLongerNotificationLeftTimeout = false; this._useLongerNotificationLeftTimeout = false;
@@ -2409,7 +2398,7 @@ const MessageTray = new Lang.Class({
this._notificationTimeoutId == 0 && this._notificationTimeoutId == 0 &&
this._notification.urgency != Urgency.CRITICAL && this._notification.urgency != Urgency.CRITICAL &&
!this._notification.focused && !this._notification.focused &&
!this._pointerInNotification) || this._notificationExpired; !this._pointerInNotification);
let mustClose = (this._notificationRemoved || !hasNotifications || expired || this._traySummoned); let mustClose = (this._notificationRemoved || !hasNotifications || expired || this._traySummoned);
if (mustClose) { if (mustClose) {
@@ -2470,10 +2459,6 @@ const MessageTray = new Lang.Class({
this._hideDesktopClone(); this._hideDesktopClone();
this._updatingState = false; this._updatingState = false;
// Clean transient variables that are used to communicate actions
// to updateState()
this._notificationExpired = false;
}, },
_tween: function(actor, statevar, value, params) { _tween: function(actor, statevar, value, params) {
@@ -2630,8 +2615,6 @@ const MessageTray = new Lang.Class({
// the mouse is moving towards it or within it. // the mouse is moving towards it or within it.
this._lastSeenMouseX = x; this._lastSeenMouseX = x;
this._lastSeenMouseY = y; this._lastSeenMouseY = y;
this._resetNotificationLeftTimeout();
}, },
_updateShowingNotification: function() { _updateShowingNotification: function() {
@@ -2676,12 +2659,10 @@ const MessageTray = new Lang.Class({
Mainloop.source_remove(this._notificationTimeoutId); Mainloop.source_remove(this._notificationTimeoutId);
this._notificationTimeoutId = 0; this._notificationTimeoutId = 0;
} }
if (timeout > 0) { if (timeout > 0)
this._notificationTimeoutId = this._notificationTimeoutId =
Mainloop.timeout_add(timeout, Mainloop.timeout_add(timeout,
Lang.bind(this, this._notificationTimeout)); Lang.bind(this, this._notificationTimeout));
GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] this._notificationTimeout');
}
}, },
_notificationTimeout: function() { _notificationTimeout: function() {
@@ -2724,7 +2705,13 @@ const MessageTray = new Lang.Class({
this._notificationUnfocusedId = 0; this._notificationUnfocusedId = 0;
} }
this._resetNotificationLeftTimeout(); this._useLongerNotificationLeftTimeout = false;
if (this._notificationLeftTimeoutId) {
Mainloop.source_remove(this._notificationLeftTimeoutId);
this._notificationLeftTimeoutId = 0;
this._notificationLeftMouseX = -1;
this._notificationLeftMouseY = -1;
}
if (animate) { if (animate) {
this._tween(this._notificationWidget, '_notificationState', State.HIDDEN, this._tween(this._notificationWidget, '_notificationState', State.HIDDEN,
@@ -2794,12 +2781,7 @@ const MessageTray = new Lang.Class({
{ y: expandedY, { y: expandedY,
opacity: 255, opacity: 255,
time: ANIMATION_TIME, time: ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad'
// HACK: Drive the state machine here better,
// instead of overwriting tweens
onComplete: Lang.bind(this, function() {
this._notificationState = State.SHOWN;
}),
}); });
} }
}, },

View File

@@ -41,6 +41,7 @@ const ModalDialog = new Lang.Class({
_init: function(params) { _init: function(params) {
params = Params.parse(params, { shellReactive: false, params = Params.parse(params, { shellReactive: false,
styleClass: null, styleClass: null,
parentActor: Main.uiGroup,
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL, keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
shouldFadeIn: true, shouldFadeIn: true,
destroyOnClose: true }); destroyOnClose: true });
@@ -56,7 +57,7 @@ const ModalDialog = new Lang.Class({
x: 0, x: 0,
y: 0, y: 0,
accessible_role: Atk.Role.DIALOG }); accessible_role: Atk.Role.DIALOG });
Main.layoutManager.modalDialogGroup.add_actor(this._group); params.parentActor.add_actor(this._group);
let constraint = new Clutter.BindConstraint({ source: global.stage, let constraint = new Clutter.BindConstraint({ source: global.stage,
coordinate: Clutter.BindCoordinate.ALL }); coordinate: Clutter.BindCoordinate.ALL });

View File

@@ -244,12 +244,11 @@ const FdoNotificationDaemon = new Lang.Class({
// 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 = this._nextNotificationId++;
let idle_id = Mainloop.idle_add(Lang.bind(this, Mainloop.idle_add(Lang.bind(this,
function () { function () {
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED); this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(idle_id, '[gnome-shell] this._emitNotificationClosed');
return invocation.return_value(GLib.Variant.new('(u)', [id])); return invocation.return_value(GLib.Variant.new('(u)', [id]));
} }

View File

@@ -73,17 +73,14 @@ const LevelBar = new Lang.Class({
const OsdWindow = new Lang.Class({ const OsdWindow = new Lang.Class({
Name: 'OsdWindow', Name: 'OsdWindow',
_init: function(monitorIndex) { _init: function() {
this._popupSize = 0; this._popupSize = 0;
this.actor = new St.Widget({ x_expand: true, this.actor = new St.Widget({ x_expand: true,
y_expand: true, y_expand: true,
x_align: Clutter.ActorAlign.CENTER, x_align: Clutter.ActorAlign.CENTER,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
this._currentMonitor = undefined;
this._monitorIndex = monitorIndex; this.setMonitor (-1);
let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
this.actor.add_constraint(constraint);
this._box = new St.BoxLayout({ style_class: 'osd-window', this._box = new St.BoxLayout({ style_class: 'osd-window',
vertical: true }); vertical: true });
this.actor.add_actor(this._box); this.actor.add_actor(this._box);
@@ -112,6 +109,7 @@ const OsdWindow = new Lang.Class({
Main.layoutManager.connect('monitors-changed', Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._monitorsChanged)); Lang.bind(this, this._monitorsChanged));
this._monitorsChanged(); this._monitorsChanged();
Main.uiGroup.add_child(this.actor); Main.uiGroup.add_child(this.actor);
}, },
@@ -127,7 +125,7 @@ const OsdWindow = new Lang.Class({
setLevel: function(level) { setLevel: function(level) {
this._level.actor.visible = (level != undefined); this._level.actor.visible = (level != undefined);
if (level != undefined) { if (level) {
if (this.actor.visible) if (this.actor.visible)
Tweener.addTween(this._level, Tweener.addTween(this._level,
{ level: level, { level: level,
@@ -158,7 +156,6 @@ const OsdWindow = new Lang.Class({
Mainloop.source_remove(this._hideTimeoutId); Mainloop.source_remove(this._hideTimeoutId);
this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT, this._hideTimeoutId = Mainloop.timeout_add(HIDE_TIMEOUT,
Lang.bind(this, this._hide)); Lang.bind(this, this._hide));
GLib.Source.set_name_by_id(this._hideTimeoutId, '[gnome-shell] this._hide');
}, },
cancel: function() { cancel: function() {
@@ -191,9 +188,12 @@ const OsdWindow = new Lang.Class({
_monitorsChanged: function() { _monitorsChanged: function() {
/* assume 110x110 on a 640x480 display and scale from there */ /* assume 110x110 on a 640x480 display and scale from there */
let monitor = Main.layoutManager.monitors[this._monitorIndex]; let monitor;
if (!monitor)
return; // we are about to be removed if (this._currentMonitor >= 0)
monitor = Main.layoutManager.monitors[this._currentMonitor];
else
monitor = Main.layoutManager.primaryMonitor;
let scalew = monitor.width / 640.0; let scalew = monitor.width / 640.0;
let scaleh = monitor.height / 480.0; let scaleh = monitor.height / 480.0;
@@ -222,56 +222,23 @@ const OsdWindow = new Lang.Class({
// but the theme takes measures in unscaled dimensions // but the theme takes measures in unscaled dimensions
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight) / scaleFactor); this._box.style = 'min-height: %dpx;'.format(Math.max(minWidth, minHeight) / scaleFactor);
} },
});
setMonitor: function(index) {
const OsdWindowManager = new Lang.Class({ let constraint;
Name: 'OsdWindowManager',
if (index < 0)
_init: function() { index = -1;
this._osdWindows = []; if (this._currentMonitor == index)
Main.layoutManager.connect('monitors-changed', return;
Lang.bind(this, this._monitorsChanged));
this._monitorsChanged(); if (index < 0)
}, constraint = new Layout.MonitorConstraint({ primary: true });
else
_monitorsChanged: function() { constraint = new Layout.MonitorConstraint({ index: index });
for (let i = 0; i < Main.layoutManager.monitors.length; i++) {
if (this._osdWindows[i] == undefined) this.actor.clear_constraints();
this._osdWindows[i] = new OsdWindow(i); this.actor.add_constraint(constraint);
} this._currentMonitor = index;
for (let i = Main.layoutManager.monitors.length; i < this._osdWindows.length; i++) {
this._osdWindows[i].actor.destroy();
this._osdWindows[i] = null;
}
this._osdWindows.length = Main.layoutManager.monitors.length;
},
_showOsdWindow: function(monitorIndex, icon, label, level) {
this._osdWindows[monitorIndex].setIcon(icon);
this._osdWindows[monitorIndex].setLabel(label);
this._osdWindows[monitorIndex].setLevel(level);
this._osdWindows[monitorIndex].show();
},
show: function(monitorIndex, icon, label, level) {
if (monitorIndex != -1) {
for (let i = 0; i < this._osdWindows.length; i++) {
if (i == monitorIndex)
this._showOsdWindow(i, icon, label, level);
else
this._osdWindows[i].cancel();
}
} else {
for (let i = 0; i < this._osdWindows.length; i++)
this._showOsdWindow(i, icon, label, level);
}
},
hideAll: function() {
for (let i = 0; i < this._osdWindows.length; i++)
this._osdWindows[i].cancel();
} }
}); });

View File

@@ -14,7 +14,6 @@ const Gdk = imports.gi.Gdk;
const Background = imports.ui.background; const Background = imports.ui.background;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
const LayoutManager = imports.ui.layout; const LayoutManager = imports.ui.layout;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main; const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray; const MessageTray = imports.ui.messageTray;
const OverviewControls = imports.ui.overviewControls; const OverviewControls = imports.ui.overviewControls;
@@ -197,7 +196,11 @@ const Overview = new Lang.Class({
Tweener.addTween(background, Tweener.addTween(background,
{ brightness: 1.0, { brightness: 1.0,
vignetteSharpness: 0.0, time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
Tweener.addTween(background,
{ vignetteSharpness: 0.0,
time: SHADE_ANIMATION_TIME, time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@@ -210,8 +213,12 @@ const Overview = new Lang.Class({
let background = backgrounds[i]._delegate; let background = backgrounds[i]._delegate;
Tweener.addTween(background, Tweener.addTween(background,
{ brightness: Lightbox.VIGNETTE_BRIGHTNESS, { brightness: 0.8,
vignetteSharpness: Lightbox.VIGNETTE_SHARPNESS, time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
Tweener.addTween(background,
{ vignetteSharpness: 0.7,
time: SHADE_ANIMATION_TIME, time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@@ -365,7 +372,6 @@ const Overview = new Lang.Class({
this._lastHoveredWindow = null; this._lastHoveredWindow = null;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._windowSwitchTimeoutId, '[gnome-shell] Main.activateWindow');
} }
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;

View File

@@ -259,18 +259,13 @@ const ThumbnailsSlider = new Lang.Class({
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)); this.actor.connect('notify::hover', Lang.bind(this, this._updateSlide));
global.window_manager.connect('switch-workspace', 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 any non-active workspace // actually used, e.g. there are windows on more than one
let alwaysZoomOut = this.actor.hover || let alwaysZoomOut = this.actor.hover || this._inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2;
this._inDrag ||
!Meta.prefs_get_dynamic_workspaces() ||
global.screen.n_workspaces > 2 ||
global.screen.get_active_workspace_index() != 0;
if (!alwaysZoomOut) { if (!alwaysZoomOut) {
let monitors = Main.layoutManager.monitors; let monitors = Main.layoutManager.monitors;

View File

@@ -595,7 +595,6 @@ const ActivitiesButton = new Lang.Class({
Mainloop.source_remove(this._xdndTimeOut); Mainloop.source_remove(this._xdndTimeOut);
this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT, this._xdndTimeOut = Mainloop.timeout_add(BUTTON_DND_ACTIVATION_TIMEOUT,
Lang.bind(this, this._xdndToggleOverview, actor)); Lang.bind(this, this._xdndToggleOverview, actor));
GLib.Source.set_name_by_id(this._xdndTimeOut, '[gnome-shell] this._xdndToggleOverview');
return DND.DragMotionResult.CONTINUE; return DND.DragMotionResult.CONTINUE;
}, },

View File

@@ -41,7 +41,8 @@ const ButtonBox = new Lang.Class({
}, },
_getPreferredWidth: function(actor, forHeight, alloc) { _getPreferredWidth: function(actor, forHeight, alloc) {
let child = actor.get_first_child(); let children = actor.get_children();
let child = children.length > 0 ? children[0] : null;
if (child) { if (child) {
[alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1); [alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1);
@@ -54,7 +55,8 @@ const ButtonBox = new Lang.Class({
}, },
_getPreferredHeight: function(actor, forWidth, alloc) { _getPreferredHeight: function(actor, forWidth, alloc) {
let child = actor.get_first_child(); let children = actor.get_children();
let child = children.length > 0 ? children[0] : null;
if (child) { if (child) {
[alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1); [alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1);
@@ -64,11 +66,13 @@ const ButtonBox = new Lang.Class({
}, },
_allocate: function(actor, box, flags) { _allocate: function(actor, box, flags) {
let child = actor.get_first_child(); let children = actor.get_children();
if (!child) if (children.length == 0)
return; return;
let child = children[0];
let [minWidth, natWidth] = child.get_preferred_width(-1); let [minWidth, natWidth] = child.get_preferred_width(-1);
let [minHeight, natHeight] = child.get_preferred_height(-1);
let availWidth = box.x2 - box.x1; let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1; let availHeight = box.y2 - box.y1;

View File

@@ -107,7 +107,6 @@ const PointerWatcher = new Lang.Class({
this._timeoutId = Mainloop.timeout_add(minInterval, this._timeoutId = Mainloop.timeout_add(minInterval,
Lang.bind(this, this._onTimeout)); Lang.bind(this, this._onTimeout));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
}, },
_onTimeout: function() { _onTimeout: function() {

View File

@@ -46,28 +46,33 @@ function isPopupMenuItemVisible(child) {
* @side Side to which the arrow points. * @side Side to which the arrow points.
*/ */
function arrowIcon(side) { function arrowIcon(side) {
let iconName; let rotation;
switch (side) { switch (side) {
case St.Side.TOP: case St.Side.TOP:
iconName = 'pan-up-symbolic'; rotation = 180;
break; break;
case St.Side.RIGHT: case St.Side.RIGHT:
iconName = 'pan-end-symbolic'; rotation = - 90;
break; break;
case St.Side.BOTTOM: case St.Side.BOTTOM:
iconName = 'pan-down-symbolic'; rotation = 0;
break; break;
case St.Side.LEFT: case St.Side.LEFT:
iconName = 'pan-start-symbolic'; rotation = 90;
break; break;
} }
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(global.datadir +
'/theme/menu-arrow-symbolic.svg') });
let arrow = new St.Icon({ style_class: 'popup-menu-arrow', let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
icon_name: iconName, gicon: gicon,
accessible_role: Atk.Role.ARROW, accessible_role: Atk.Role.ARROW,
y_expand: true, y_expand: true,
y_align: Clutter.ActorAlign.CENTER }); y_align: Clutter.ActorAlign.CENTER });
arrow.rotation_angle_z = rotation;
return arrow; return arrow;
} }
@@ -246,16 +251,8 @@ const PopupSeparatorMenuItem = new Lang.Class({
this.actor.add(this.label); this.actor.add(this.label);
this.actor.label_actor = this.label; this.actor.label_actor = this.label;
this.label.connect('notify::text',
Lang.bind(this, this._syncVisibility));
this._syncVisibility();
this._separator = new Separator.HorizontalSeparator({ style_class: 'popup-separator-menu-item' }); this._separator = new Separator.HorizontalSeparator({ style_class: 'popup-separator-menu-item' });
this.actor.add(this._separator.actor, { expand: true }); this.actor.add(this._separator.actor, { expand: true });
},
_syncVisibility: function() {
this.label.visible = this.label.text != '';
} }
}); });

View File

@@ -117,7 +117,7 @@ function loadRemoteSearchProviders(callback) {
} }
} }
let searchSettings = new Gio.Settings({ schema_id: Search.SEARCH_PROVIDERS_SCHEMA }); let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
if (searchSettings.get_boolean('disable-external')) { if (searchSettings.get_boolean('disable-external')) {
callback([]); callback([]);
return; return;

View File

@@ -38,8 +38,8 @@ const RunDialog = new Lang.Class({
this.parent({ styleClass: 'run-dialog', this.parent({ styleClass: 'run-dialog',
destroyOnClose: false }); destroyOnClose: false });
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA }); this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
global.settings.connect('changed::development-tools', Lang.bind(this, function () { global.settings.connect('changed::development-tools', Lang.bind(this, function () {
this._enableInternalCommands = global.settings.get_boolean('development-tools'); this._enableInternalCommands = global.settings.get_boolean('development-tools');
})); }));

View File

@@ -301,7 +301,7 @@ const NotificationsBox = new Lang.Class({
}); });
this._updateVisibility(); this._updateVisibility();
this.emit('wake-up-screen'); Shell.util_wake_up_screen();
} }
}, },
@@ -327,7 +327,7 @@ const NotificationsBox = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
if (obj.sourceBox.visible) if (obj.sourceBox.visible)
this.emit('wake-up-screen'); Shell.util_wake_up_screen();
}, },
_visibleChanged: function(source, obj) { _visibleChanged: function(source, obj) {
@@ -342,7 +342,7 @@ const NotificationsBox = new Lang.Class({
this._updateVisibility(); this._updateVisibility();
if (obj.sourceBox.visible) if (obj.sourceBox.visible)
this.emit('wake-up-screen'); Shell.util_wake_up_screen();
}, },
_detailedChanged: function(source, obj) { _detailedChanged: function(source, obj) {
@@ -380,7 +380,6 @@ const NotificationsBox = new Lang.Class({
this._sources.delete(source); this._sources.delete(source);
}, },
}); });
Signals.addSignalMethods(NotificationsBox.prototype);
const Arrow = new Lang.Class({ const Arrow = new Lang.Class({
Name: 'Arrow', Name: 'Arrow',
@@ -537,7 +536,7 @@ const ScreenShield = new Lang.Class({
this._smartcardManager = SmartcardManager.getSmartcardManager(); this._smartcardManager = SmartcardManager.getSmartcardManager();
this._smartcardManager.connect('smartcard-inserted', this._smartcardManager.connect('smartcard-inserted',
Lang.bind(this, function(manager, token) { Lang.bind(this, function(token) {
if (this._isLocked && token.UsedToLogin) if (this._isLocked && token.UsedToLogin)
this._liftShield(true, 0); this._liftShield(true, 0);
})); }));
@@ -563,7 +562,7 @@ const ScreenShield = new Lang.Class({
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); })); this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
})); }));
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA }); this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._isModal = false; this._isModal = false;
this._hasLockScreen = false; this._hasLockScreen = false;
@@ -729,7 +728,7 @@ const ScreenShield = new Lang.Class({
} else { } else {
this._inhibitSuspend(); this._inhibitSuspend();
this._wakeUpScreen(); this._onUserBecameActive();
} }
}, },
@@ -850,7 +849,6 @@ const ScreenShield = new Lang.Class({
this.lock(false); this.lock(false);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._lockTimeoutId, '[gnome-shell] this.lock');
} }
this._activateFade(this._longLightbox, STANDARD_FADE_TIME); this._activateFade(this._longLightbox, STANDARD_FADE_TIME);
@@ -1042,7 +1040,6 @@ const ScreenShield = new Lang.Class({
if (!this._arrowAnimationId) { if (!this._arrowAnimationId) {
this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows)); this._arrowAnimationId = Mainloop.timeout_add(6000, Lang.bind(this, this._animateArrows));
GLib.Source.set_name_by_id(this._arrowAnimationId, '[gnome-shell] this._animateArrows');
this._animateArrows(); this._animateArrows();
} }
@@ -1110,11 +1107,10 @@ const ScreenShield = new Lang.Class({
if (params.fadeToBlack && params.animateFade) { if (params.fadeToBlack && params.animateFade) {
// Take a beat // Take a beat
let id = Mainloop.timeout_add(1000 * MANUAL_FADE_TIME, Lang.bind(this, function() { Mainloop.timeout_add(1000 * MANUAL_FADE_TIME, Lang.bind(this, function() {
this._activateFade(this._shortLightbox, MANUAL_FADE_TIME); this._activateFade(this._shortLightbox, MANUAL_FADE_TIME);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._activateFade');
} else { } else {
if (params.fadeToBlack) if (params.fadeToBlack)
this._activateFade(this._shortLightbox, 0); this._activateFade(this._shortLightbox, 0);
@@ -1155,7 +1151,6 @@ const ScreenShield = new Lang.Class({
this._lockScreenContents.add_actor(this._lockScreenContentsBox); this._lockScreenContents.add_actor(this._lockScreenContentsBox);
this._notificationsBox = new NotificationsBox(); this._notificationsBox = new NotificationsBox();
this._wakeUpScreenId = this._notificationsBox.connect('wake-up-screen', Lang.bind(this, this._wakeUpScreen));
this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true, this._lockScreenContentsBox.add(this._notificationsBox.actor, { x_fill: true,
y_fill: true, y_fill: true,
expand: true }); expand: true });
@@ -1163,17 +1158,11 @@ const ScreenShield = new Lang.Class({
this._hasLockScreen = true; this._hasLockScreen = true;
}, },
_wakeUpScreen: function() {
this._onUserBecameActive();
this.emit('wake-up-screen');
},
_clearLockScreen: function() { _clearLockScreen: function() {
this._clock.destroy(); this._clock.destroy();
this._clock = null; this._clock = null;
if (this._notificationsBox) { if (this._notificationsBox) {
this._notificationsBox.disconnect(this._wakeUpScreenId);
this._notificationsBox.destroy(); this._notificationsBox.destroy();
this._notificationsBox = null; this._notificationsBox = null;
} }

View File

@@ -11,7 +11,6 @@ const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const St = imports.gi.St; const St = imports.gi.St;
const GrabHelper = imports.ui.grabHelper;
const Lightbox = imports.ui.lightbox; 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;
@@ -68,13 +67,6 @@ const ScreenshotService = new Lang.Class({
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null); Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
}, },
_checkArea: function(x, y, width, height) {
return x >= 0 && y >= 0 &&
width > 0 && height > 0 &&
x + width <= global.screen_width &&
y + height <= global.screen_height;
},
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) { _onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
if (flash && result) { if (flash && result) {
let flashspot = new Flashspot(area); let flashspot = new Flashspot(area);
@@ -85,31 +77,13 @@ const ScreenshotService = new Lang.Class({
invocation.return_value(retval); invocation.return_value(retval);
}, },
_scaleArea: function(x, y, width, height) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
x *= scaleFactor;
y *= scaleFactor;
width *= scaleFactor;
height *= scaleFactor;
return [x, y, width, height];
},
_unscaleArea: function(x, y, width, height) {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
x /= scaleFactor;
y /= scaleFactor;
width /= scaleFactor;
height /= scaleFactor;
return [x, y, width, height];
},
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;
[x, y, width, height] = this._scaleArea(x, y, width, height); if (x < 0 || y < 0 ||
if (!this._checkArea(x, y, width, height)) { width <= 0 || height <= 0 ||
invocation.return_error_literal(Gio.IOErrorEnum, x + width > global.screen_width || y + height > global.screen_height) {
Gio.IOErrorEnum.CANCELLED, invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
"Invalid params"); "Invalid params");
return; return;
} }
let screenshot = new Shell.Screenshot(); let screenshot = new Shell.Screenshot();
@@ -140,9 +114,9 @@ const ScreenshotService = new Lang.Class({
selectArea.connect('finished', Lang.bind(this, selectArea.connect('finished', Lang.bind(this,
function(selectArea, areaRectangle) { function(selectArea, areaRectangle) {
if (areaRectangle) { if (areaRectangle) {
let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y, let retval = GLib.Variant.new('(iiii)',
areaRectangle.width, areaRectangle.height); [areaRectangle.x, areaRectangle.y,
let retval = GLib.Variant.new('(iiii)', retRectangle); areaRectangle.width, areaRectangle.height]);
invocation.return_value(retval); invocation.return_value(retval);
} else { } else {
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED, invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
@@ -151,18 +125,9 @@ const ScreenshotService = new Lang.Class({
})); }));
}, },
FlashAreaAsync: function(params, invocation) { FlashArea: function(x, y, width, height) {
let [x, y, width, height] = params;
[x, y, width, height] = this._scaleArea(x, y, width, height);
if (!this._checkArea(x, y, width, height)) {
invocation.return_error_literal(Gio.IOErrorEnum,
Gio.IOErrorEnum.CANCELLED,
"Invalid params");
return;
}
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height}); let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
flashspot.fire(); flashspot.fire();
invocation.return_value(null);
} }
}); });
@@ -174,7 +139,6 @@ const SelectArea = new Lang.Class({
this._startY = -1; this._startY = -1;
this._lastX = 0; this._lastX = 0;
this._lastY = 0; this._lastY = 0;
this._result = null;
this._initRubberbandColors(); this._initRubberbandColors();
@@ -184,12 +148,12 @@ const SelectArea = new Lang.Class({
y: 0 }); y: 0 });
Main.uiGroup.add_actor(this._group); Main.uiGroup.add_actor(this._group);
this._grabHelper = new GrabHelper.GrabHelper(this._group);
this._group.connect('button-press-event', this._group.connect('button-press-event',
Lang.bind(this, this._onButtonPress)); Lang.bind(this, this._onButtonPress));
this._group.connect('button-release-event', this._group.connect('button-release-event',
Lang.bind(this, this._onButtonRelease)); Lang.bind(this, this._onButtonRelease));
this._group.connect('key-press-event',
Lang.bind(this, this._onKeyPress));
this._group.connect('motion-event', this._group.connect('motion-event',
Lang.bind(this, this._onMotionEvent)); Lang.bind(this, this._onMotionEvent));
@@ -205,12 +169,10 @@ const SelectArea = new Lang.Class({
}, },
show: function() { show: function() {
if (!this._grabHelper.grab({ actor: this._group, if (!Main.pushModal(this._group) || this._group.visible)
onUngrab: Lang.bind(this, this._onUngrab) }))
return; return;
global.screen.set_cursor(Meta.Cursor.CROSSHAIR); global.screen.set_cursor(Meta.Cursor.CROSSHAIR);
Main.uiGroup.set_child_above_sibling(this._group, null);
this._group.visible = true; this._group.visible = true;
}, },
@@ -240,6 +202,13 @@ const SelectArea = new Lang.Class({
height: Math.abs(this._startY - this._lastY) }; height: Math.abs(this._startY - this._lastY) };
}, },
_onKeyPress: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape)
this._destroy(null, false);
return Clutter.EVENT_PROPAGATE;
},
_onMotionEvent: function(actor, event) { _onMotionEvent: function(actor, event) {
if (this._startX == -1 || this._startY == -1) if (this._startX == -1 || this._startY == -1)
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@@ -261,28 +230,24 @@ const SelectArea = new Lang.Class({
}, },
_onButtonRelease: function(actor, event) { _onButtonRelease: function(actor, event) {
this._result = this._getGeometry(); this._destroy(this._getGeometry(), true);
Tweener.addTween(this._group,
{ opacity: 0,
time: 0.2,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
this._grabHelper.ungrab();
})
});
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
_onUngrab: function() { _destroy: function(geometry, fade) {
global.screen.set_cursor(Meta.Cursor.DEFAULT); Tweener.addTween(this._group,
this.emit('finished', this._result); { opacity: 0,
time: fade ? 0.2 : 0,
transition: 'easeOutQuad',
onComplete: Lang.bind(this,
function() {
Main.popModal(this._group);
this._group.destroy();
global.screen.set_cursor(Meta.Cursor.DEFAULT);
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this.emit('finished', geometry);
function() { })
this._group.destroy(); });
return GLib.SOURCE_REMOVE;
}));
} }
}); });
Signals.addSignalMethods(SelectArea.prototype); Signals.addSignalMethods(SelectArea.prototype);

View File

@@ -39,12 +39,11 @@ const Main = imports.ui.main;
function sleep(milliseconds) { function sleep(milliseconds) {
let cb; let cb;
let id = Mainloop.timeout_add(milliseconds, function() { Mainloop.timeout_add(milliseconds, function() {
if (cb) if (cb)
cb(); cb();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
}); });
GLib.Source.set_name_by_id(id, '[gnome-shell] sleep');
return function(callback) { return function(callback) {
cb = callback; cb = callback;

View File

@@ -31,7 +31,7 @@ const SearchSystem = new Lang.Class({
this._registerProvider(new AppDisplay.AppSearchProvider()); this._registerProvider(new AppDisplay.AppSearchProvider());
this._searchSettings = new Gio.Settings({ schema_id: SEARCH_PROVIDERS_SCHEMA }); this._searchSettings = new Gio.Settings({ schema: SEARCH_PROVIDERS_SCHEMA });
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders)); 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::disable-external', Lang.bind(this, this._reloadRemoteProviders));
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders)); this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
@@ -68,9 +68,6 @@ const SearchSystem = new Lang.Class({
_unregisterProvider: function (provider) { _unregisterProvider: function (provider) {
let index = this._providers.indexOf(provider); let index = this._providers.indexOf(provider);
this._providers.splice(index, 1); this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
}, },
getProviders: function() { getProviders: function() {
@@ -318,8 +315,6 @@ const SearchResultsBase = new Lang.Class({
}, },
clear: function() { clear: function() {
for (let resultId in this._resultDisplays)
this._resultDisplays[resultId].actor.destroy();
this._resultDisplays = {}; this._resultDisplays = {};
this._clearResultDisplay(); this._clearResultDisplay();
this.actor.hide(); this.actor.hide();
@@ -343,22 +338,12 @@ const SearchResultsBase = new Lang.Class({
})); }));
if (metasNeeded.length === 0) { if (metasNeeded.length === 0) {
callback(true); callback();
} else { } else {
this._cancellable.cancel(); this._cancellable.cancel();
this._cancellable.reset(); this._cancellable.reset();
this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) { this.provider.getResultMetas(metasNeeded, Lang.bind(this, function(metas) {
if (metas.length == 0) {
callback(false);
return;
}
if (metas.length != metasNeeded.length) {
log('Wrong number of result metas returned by search provider');
callback(false);
return;
}
metasNeeded.forEach(Lang.bind(this, function(resultId, i) { metasNeeded.forEach(Lang.bind(this, function(resultId, i) {
let meta = metas[i]; let meta = metas[i];
let display = this._createResultDisplay(meta); let display = this._createResultDisplay(meta);
@@ -366,7 +351,7 @@ const SearchResultsBase = new Lang.Class({
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn)); display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
this._resultDisplays[resultId] = display; this._resultDisplays[resultId] = display;
})); }));
callback(true); callback();
}), this._cancellable); }), this._cancellable);
} }
}, },
@@ -383,10 +368,8 @@ const SearchResultsBase = new Lang.Class({
let results = this.provider.filterResults(providerResults, maxResults); let results = this.provider.filterResults(providerResults, maxResults);
let hasMoreResults = results.length < providerResults.length; let hasMoreResults = results.length < providerResults.length;
this._ensureResultActors(results, Lang.bind(this, function(successful) { this._ensureResultActors(results, Lang.bind(this, function() {
this._clearResultDisplay(); this._clearResultDisplay();
if (!successful)
return;
// To avoid CSS transitions causing flickering when // To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the // the first search result stays the same, we hide the
@@ -632,11 +615,8 @@ const SearchResults = new Lang.Class({
if (newDefaultResult != this._defaultResult) { if (newDefaultResult != this._defaultResult) {
if (this._defaultResult) if (this._defaultResult)
this._defaultResult.setSelected(false); this._defaultResult.setSelected(false);
if (newDefaultResult) { if (newDefaultResult)
newDefaultResult.setSelected(this._highlightDefault); newDefaultResult.setSelected(this._highlightDefault);
if (this._highlightDefault)
Util.ensureActorVisibleInScrollView(this._scrollView, newDefaultResult.actor);
}
this._defaultResult = newDefaultResult; this._defaultResult = newDefaultResult;
} }
@@ -673,11 +653,8 @@ const SearchResults = new Lang.Class({
highlightDefault: function(highlight) { highlightDefault: function(highlight) {
this._highlightDefault = highlight; this._highlightDefault = highlight;
if (this._defaultResult) { if (this._defaultResult)
this._defaultResult.setSelected(highlight); this._defaultResult.setSelected(highlight);
if (highlight)
Util.ensureActorVisibleInScrollView(this._scrollView, this._defaultResult.actor);
}
}, },
navigateFocus: function(direction) { navigateFocus: function(direction) {

View File

@@ -18,6 +18,7 @@ const _modes = {
'restrictive': { 'restrictive': {
parentMode: null, parentMode: null,
stylesheetName: 'gnome-shell.css', stylesheetName: 'gnome-shell.css',
overridesSchema: 'org.gnome.shell.overrides',
hasOverview: false, hasOverview: false,
showCalendarEvents: false, showCalendarEvents: false,
allowSettings: false, allowSettings: false,
@@ -139,14 +140,13 @@ function _loadModes() {
function listModes() { function listModes() {
_loadModes(); _loadModes();
let id = Mainloop.idle_add(function() { Mainloop.idle_add(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)
print(names[i]); print(names[i]);
Mainloop.quit('listModes'); Mainloop.quit('listModes');
}); });
GLib.Source.set_name_by_id(id, '[gnome-shell] listModes');
Mainloop.run('listModes'); Mainloop.run('listModes');
} }

View File

@@ -69,7 +69,6 @@ const ScreenSaverIface = '<node> \
<signal name="ActiveChanged"> \ <signal name="ActiveChanged"> \
<arg name="new_value" type="b" /> \ <arg name="new_value" type="b" /> \
</signal> \ </signal> \
<signal name="WakeUpScreen" /> \
</interface> \ </interface> \
</node>'; </node>';
@@ -141,7 +140,12 @@ const GnomeShell = new Lang.Class({
if (params['icon']) if (params['icon'])
icon = Gio.Icon.new_for_string(params['icon']); icon = Gio.Icon.new_for_string(params['icon']);
Main.osdWindowManager.show(monitorIndex, icon, params['label'], params['level']); Main.osdWindow.setIcon(icon);
Main.osdWindow.setMonitor (monitorIndex);
Main.osdWindow.setLabel(params['label']);
Main.osdWindow.setLevel(params['level']);
Main.osdWindow.show();
}, },
FocusApp: function(id) { FocusApp: function(id) {
@@ -403,9 +407,6 @@ const ScreenSaverDBus = new Lang.Class({
screenShield.connect('active-changed', Lang.bind(this, function(shield) { screenShield.connect('active-changed', Lang.bind(this, function(shield) {
this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active])); this._dbusImpl.emit_signal('ActiveChanged', GLib.Variant.new('(b)', [shield.active]));
})); }));
screenShield.connect('wake-up-screen', Lang.bind(this, function(shield) {
this._dbusImpl.emit_signal('WakeUpScreen', null);
}));
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this); this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(ScreenSaverIface, this);
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver'); this._dbusImpl.export(Gio.DBus.session, '/org/gnome/ScreenSaver');

View File

@@ -48,7 +48,7 @@ const ATIndicator = new Lang.Class({
this.actor.add_child(this._hbox); this.actor.add_child(this._hbox);
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA }); this._a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, Lang.bind(this, this._queueSyncMenuVisibility)); this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, Lang.bind(this, this._queueSyncMenuVisibility));
let highContrast = this._buildHCItem(); let highContrast = this._buildHCItem();
@@ -103,7 +103,6 @@ const ATIndicator = new Lang.Class({
return; return;
this._syncMenuVisbilityIdle = Mainloop.idle_add(Lang.bind(this, this._syncMenuVisibility)); this._syncMenuVisbilityIdle = Mainloop.idle_add(Lang.bind(this, this._syncMenuVisibility));
GLib.Source.set_name_by_id(this._syncMenuVisbilityIdle, '[gnome-shell] this._syncMenuVisibility');
}, },
_buildItemExtended: function(string, initial_value, writable, on_set) { _buildItemExtended: function(string, initial_value, writable, on_set) {
@@ -118,7 +117,7 @@ const ATIndicator = new Lang.Class({
}, },
_buildItem: function(string, schema, key) { _buildItem: function(string, schema, key) {
let settings = new Gio.Settings({ schema_id: schema }); let settings = new Gio.Settings({ schema: schema });
let widget = this._buildItemExtended(string, let widget = this._buildItemExtended(string,
settings.get_boolean(key), settings.get_boolean(key),
settings.is_writable(key), settings.is_writable(key),
@@ -134,8 +133,8 @@ const ATIndicator = new Lang.Class({
}, },
_buildHCItem: function() { _buildHCItem: function() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
let wmSettings = new Gio.Settings({ schema_id: WM_SCHEMA }); let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME); let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME); let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let wmTheme = wmSettings.get_string(KEY_WM_THEME); let wmTheme = wmSettings.get_string(KEY_WM_THEME);
@@ -186,7 +185,7 @@ const ATIndicator = new Lang.Class({
}, },
_buildFontItem: function() { _buildFontItem: function() {
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA }); let settings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR); let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
let initial_setting = (factor > 1.0); let initial_setting = (factor > 1.0);

View File

@@ -17,7 +17,6 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
const RfkillManagerInterface = '<node> \ const RfkillManagerInterface = '<node> \
<interface name="org.gnome.SettingsDaemon.Rfkill"> \ <interface name="org.gnome.SettingsDaemon.Rfkill"> \
<property name="BluetoothAirplaneMode" type="b" access="readwrite" /> \ <property name="BluetoothAirplaneMode" type="b" access="readwrite" /> \
<property name="BluetoothHasAirplaneMode" type="b" access="read" /> \
</interface> \ </interface> \
</node>'; </node>';
@@ -59,7 +58,6 @@ const Indicator = new Lang.Class({
this._model.connect('row-changed', Lang.bind(this, this._sync)); this._model.connect('row-changed', Lang.bind(this, this._sync));
this._model.connect('row-deleted', Lang.bind(this, this._sync)); this._model.connect('row-deleted', Lang.bind(this, this._sync));
this._model.connect('row-inserted', Lang.bind(this, this._sync)); this._model.connect('row-inserted', Lang.bind(this, this._sync));
Main.sessionMode.connect('updated', Lang.bind(this, this._sync));
this._sync(); this._sync();
}, },
@@ -94,11 +92,9 @@ const Indicator = new Lang.Class({
_sync: function() { _sync: function() {
let nDevices = this._getNConnectedDevices(); let nDevices = this._getNConnectedDevices();
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
this._indicator.visible = nDevices > 0; this._indicator.visible = nDevices > 0;
this._item.actor.visible = this._proxy.BluetoothHasAirplaneMode && !this._proxy.BluetoothAirplaneMode; this._item.actor.visible = !this._proxy.BluetoothAirplaneMode;
if (nDevices > 0) if (nDevices > 0)
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", nDevices).format(nDevices);

View File

@@ -292,10 +292,6 @@ const InputSourcePopup = new Lang.Class({
this._select(this._previous()); this._select(this._previous());
else if (keysym == Clutter.Right) else if (keysym == Clutter.Right)
this._select(this._next()); this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
return Clutter.EVENT_STOP;
}, },
_finish : function() { _finish : function() {
@@ -365,18 +361,18 @@ const InputSourceIndicator = new Lang.Class({
this._mruSources = []; this._mruSources = [];
this._keybindingAction = this._keybindingAction =
Main.wm.addKeybinding('switch-input-source', Main.wm.addKeybinding('switch-input-source',
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES, Meta.KeyBindingFlags.REVERSES,
Shell.KeyBindingMode.ALL, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward = this._keybindingActionBackward =
Main.wm.addKeybinding('switch-input-source-backward', Main.wm.addKeybinding('switch-input-source-backward',
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }), new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
Meta.KeyBindingFlags.REVERSES | Meta.KeyBindingFlags.REVERSES |
Meta.KeyBindingFlags.IS_REVERSED, Meta.KeyBindingFlags.REVERSED,
Shell.KeyBindingMode.ALL, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource)); Lang.bind(this, this._switchInputSource));
this._settings = new Gio.Settings({ schema_id: DESKTOP_INPUT_SOURCES_SCHEMA }); this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged)); this._settings.connect('changed::' + KEY_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged)); this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));

View File

@@ -4,10 +4,9 @@ const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio; const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const Main = imports.ui.main; const Shell = imports.gi.Shell;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Shell = imports.gi.Shell;
const LOCATION_SCHEMA = 'org.gnome.shell.location'; const LOCATION_SCHEMA = 'org.gnome.shell.location';
const MAX_ACCURACY_LEVEL = 'max-accuracy-level'; const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
@@ -43,7 +42,7 @@ const Indicator = new Lang.Class({
_init: function() { _init: function() {
this.parent(); this.parent();
this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA }); this._settings = new Gio.Settings({ schema: LOCATION_SCHEMA });
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL, this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
Lang.bind(this, this._onMaxAccuracyLevelChanged)); Lang.bind(this, this._onMaxAccuracyLevelChanged));
@@ -56,8 +55,8 @@ const Indicator = new Lang.Class({
this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this); this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this);
this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent'); this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent');
this._item.status.text = _("Enabled"); this._item.status.text = _("On");
this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction)); this._onOffAction = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, this._onOnOffAction));
this.menu.addMenuItem(this._item); this.menu.addMenuItem(this._item);
@@ -66,8 +65,6 @@ const Indicator = new Lang.Class({
0, 0,
Lang.bind(this, this._connectToGeoclue), Lang.bind(this, this._connectToGeoclue),
Lang.bind(this, this._onGeoclueVanished)); Lang.bind(this, this._onGeoclueVanished));
Main.sessionMode.connect('updated', Lang.bind(this, this._onSessionUpdated));
this._onSessionUpdated();
this._onMaxAccuracyLevelChanged(); this._onMaxAccuracyLevelChanged();
this._connectToGeoclue(); this._connectToGeoclue();
}, },
@@ -97,7 +94,6 @@ const Indicator = new Lang.Class({
} }
this._indicator.visible = this._proxy.InUse; this._indicator.visible = this._proxy.InUse;
this._updateMenuLabels();
}, },
_connectToGeoclue: function() { _connectToGeoclue: function() {
@@ -123,7 +119,7 @@ const Indicator = new Lang.Class({
this._propertiesChangedId = this._proxy.connect('g-properties-changed', this._propertiesChangedId = this._proxy.connect('g-properties-changed',
Lang.bind(this, this._onGeocluePropsChanged)); Lang.bind(this, this._onGeocluePropsChanged));
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel; this._updateMenu();
this._syncIndicator(); this._syncIndicator();
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered)); this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
@@ -154,23 +150,14 @@ const Indicator = new Lang.Class({
this._settings.set_enum(MAX_ACCURACY_LEVEL, 0); this._settings.set_enum(MAX_ACCURACY_LEVEL, 0);
}, },
_onSessionUpdated: function() {
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
},
_updateMenuLabels: function() {
if (this._getMaxAccuracyLevel() == 0) {
this._item.status.text = _("Disabled");
this._onOffAction.label.text = _("Enable");
} else {
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
this._onOffAction.label.text = _("Disable");
}
},
_onMaxAccuracyLevelChanged: function() { _onMaxAccuracyLevelChanged: function() {
this._updateMenuLabels(); if (this._getMaxAccuracyLevel() == 0) {
this._item.status.text = _("Off");
this._onOffAction.label.text = _("Turn On");
} else {
this._item.status.text = _("On");
this._onOffAction.label.text = _("Turn Off");
}
// Gotta ensure geoclue is up and we are registered as agent to it // Gotta ensure geoclue is up and we are registered as agent to it
// before we emit the notify for this property change. // before we emit the notify for this property change.
@@ -187,16 +174,17 @@ const Indicator = new Lang.Class({
this._agent.emit_property_changed('MaxAccuracyLevel', variant); this._agent.emit_property_changed('MaxAccuracyLevel', variant);
}, },
_updateMenu: function() {
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
this.menu.actor.visible = (this._availableAccuracyLevel != 0);
},
_onGeocluePropsChanged: function(proxy, properties) { _onGeocluePropsChanged: function(proxy, properties) {
let unpacked = properties.deep_unpack(); let unpacked = properties.deep_unpack();
if ("InUse" in unpacked) if ("InUse" in unpacked)
this._syncIndicator(); this._syncIndicator();
if ("AvailableAccuracyLevel" in unpacked) { if ("AvailableAccuracyLevel" in unpacked)
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel; this._updateMenu();
if (this._getMaxAccuracyLevel() != 0)
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
}
} }
}); });

View File

@@ -293,13 +293,8 @@ const NMConnectionSection = new Lang.Class({
}, },
removeConnection: function(connection) { removeConnection: function(connection) {
let uuid = connection.get_uuid(); this._connectionItems.get(connection.get_uuid()).destroy();
let item = this._connectionItems.get(uuid); this._connectionItems.delete(connection.get_uuid());
if (item == undefined)
return;
item.destroy();
this._connectionItems.delete(uuid);
let pos = this._connections.indexOf(connection); let pos = this._connections.indexOf(connection);
this._connections.splice(pos, 1); this._connections.splice(pos, 1);
@@ -423,18 +418,18 @@ const NMConnectionDevice = new Lang.Class({
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) */
return _("Unmanaged"); return _("unmanaged");
case NetworkManager.DeviceState.DEACTIVATING: case NetworkManager.DeviceState.DEACTIVATING:
return _("Disconnecting"); return _("disconnecting...");
case NetworkManager.DeviceState.PREPARE: case NetworkManager.DeviceState.PREPARE:
case NetworkManager.DeviceState.CONFIG: case NetworkManager.DeviceState.CONFIG:
case NetworkManager.DeviceState.IP_CONFIG: case NetworkManager.DeviceState.IP_CONFIG:
case NetworkManager.DeviceState.IP_CHECK: case NetworkManager.DeviceState.IP_CHECK:
case NetworkManager.DeviceState.SECONDARIES: case NetworkManager.DeviceState.SECONDARIES:
return _("Connecting"); return _("connecting...");
case NetworkManager.DeviceState.NEED_AUTH: case NetworkManager.DeviceState.NEED_AUTH:
/* 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 */
return _("Authentication required"); return _("authentication required");
case NetworkManager.DeviceState.UNAVAILABLE: case NetworkManager.DeviceState.UNAVAILABLE:
// This state is actually a compound of various states (generically unavailable, // This state is actually a compound of various states (generically unavailable,
// firmware missing), that are exposed by different properties (whose state may // firmware missing), that are exposed by different properties (whose state may
@@ -442,13 +437,13 @@ const NMConnectionDevice = new Lang.Class({
if (this._device.firmware_missing) { if (this._device.firmware_missing) {
/* 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 */
return _("Firmware missing"); return _("firmware missing");
} }
/* 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 */
return _("Unavailable"); return _("unavailable");
case NetworkManager.DeviceState.FAILED: case NetworkManager.DeviceState.FAILED:
return _("Connection failed"); return _("connection failed");
default: default:
log('Device state invalid, is %d'.format(this._device.state)); log('Device state invalid, is %d'.format(this._device.state));
return 'invalid'; return 'invalid';
@@ -1170,10 +1165,6 @@ const NMDeviceWireless = new Lang.Class({
this._client.disconnect(this._wirelessHwEnabledChangedId); this._client.disconnect(this._wirelessHwEnabledChangedId);
this._wirelessHwEnabledChangedId = 0; this._wirelessHwEnabledChangedId = 0;
} }
if (this._dialog) {
this._dialog.destroy();
this._dialog = null;
}
this.item.destroy(); this.item.destroy();
}, },
@@ -1866,7 +1857,8 @@ 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.visible = false; 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

@@ -4,7 +4,6 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
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;
@@ -84,18 +83,10 @@ const Indicator = new Lang.Class({
this._item.icon.icon_name = 'airplane-mode-symbolic'; this._item.icon.icon_name = 'airplane-mode-symbolic';
this._item.status.text = _("On"); this._item.status.text = _("On");
this._offItem = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() { this._offItem = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, function() {
this._manager.airplaneMode = false; this._proxy.AirplaneMode = false;
})); }));
this._item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop'); this._item.menu.addSettingsAction(_("Network Settings"), 'gnome-network-panel.desktop');
this.menu.addMenuItem(this._item); this.menu.addMenuItem(this._item);
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
this._sessionUpdated();
},
_sessionUpdated: function() {
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
}, },
_sync: function() { _sync: function() {

View File

@@ -56,10 +56,7 @@ const AltSwitcher = new Lang.Class({
} }
if (this.actor.get_child() != childToShow) { if (this.actor.get_child() != childToShow) {
let hasFocus = this.actor.contains(global.stage.get_key_focus());
this.actor.set_child(childToShow); this.actor.set_child(childToShow);
if (hasFocus)
childToShow.grab_key_focus();
// The actors might respond to hover, so // The actors might respond to hover, so
// sync the pointer to make sure they update. // sync the pointer to make sure they update.
@@ -95,11 +92,11 @@ const Indicator = new Lang.Class({
_init: function() { _init: function() {
this.parent(); this.parent();
this._screenSaverSettings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA }); this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA }); this._loginScreenSettings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA }); this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
this._privacySettings = new Gio.Settings({ schema_id: PRIVACY_SCHEMA }); this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' }); this._orientationSettings = new Gio.Settings({ schema: 'org.gnome.settings-daemon.peripherals.touchscreen' });
this._session = new GnomeSession.SessionManager(); this._session = new GnomeSession.SessionManager();
this._loginManager = LoginManager.getLoginManager(); this._loginManager = LoginManager.getLoginManager();

View File

@@ -161,12 +161,11 @@ const SwitcherPopup = new Lang.Class({
// disturbed by the popup briefly flashing. // disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT, this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () { Lang.bind(this, function () {
Main.osdWindowManager.hideAll(); Main.osdWindow.cancel();
this.actor.opacity = 255; this.actor.opacity = 255;
this._initialDelayTimeoutId = 0; this._initialDelayTimeoutId = 0;
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(this._initialDelayTimeoutId, '[gnome-shell] Main.osdWindow.cancel');
return true; return true;
}, },
@@ -190,11 +189,10 @@ const SwitcherPopup = new Lang.Class({
this._disableHover(); this._disableHover();
if (this._keyPressHandler(keysym, backwards, action) != Clutter.EVENT_PROPAGATE)
return Clutter.EVENT_STOP;
if (keysym == Clutter.Escape) if (keysym == Clutter.Escape)
this.destroy(); this.destroy();
else
this._keyPressHandler(keysym, backwards, action);
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
}, },
@@ -252,7 +250,6 @@ const SwitcherPopup = new Lang.Class({
Mainloop.source_remove(this._motionTimeoutId); Mainloop.source_remove(this._motionTimeoutId);
this._motionTimeoutId = Mainloop.timeout_add(DISABLE_HOVER_TIMEOUT, Lang.bind(this, this._mouseTimedOut)); this._motionTimeoutId = Mainloop.timeout_add(DISABLE_HOVER_TIMEOUT, Lang.bind(this, this._mouseTimedOut));
GLib.Source.set_name_by_id(this._motionTimeoutId, '[gnome-shell] this._mouseTimedOut');
}, },
_mouseTimedOut: function() { _mouseTimedOut: function() {

View File

@@ -53,8 +53,8 @@ const UnlockDialog = new Lang.Class({
this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY); this._authPrompt = new AuthPrompt.AuthPrompt(new Gdm.Client(), AuthPrompt.AuthPromptMode.UNLOCK_ONLY);
this._authPrompt.connect('failed', Lang.bind(this, this._fail)); this._authPrompt.connect('failed', Lang.bind(this, this._fail));
this._authPrompt.connect('cancelled', Lang.bind(this, this._fail));
this._authPrompt.connect('reset', Lang.bind(this, this._onReset)); this._authPrompt.connect('reset', Lang.bind(this, this._onReset));
this._authPrompt.connect('needs-username', Lang.bind(this, this._onNeedsUserName));
this._authPrompt.setPasswordChar('\u25cf'); this._authPrompt.setPasswordChar('\u25cf');
this._authPrompt.nextButton.label = _("Unlock"); this._authPrompt.nextButton.label = _("Unlock");
@@ -62,7 +62,7 @@ const UnlockDialog = new Lang.Class({
this.allowCancel = false; this.allowCancel = false;
let screenSaverSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.screensaver' }); let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
if (screenSaverSettings.get_boolean('user-switch-enabled')) { if (screenSaverSettings.get_boolean('user-switch-enabled')) {
let otherUserLabel = new St.Label({ text: _("Log in as another user"), let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' }); style_class: 'login-dialog-not-listed-label' });
@@ -101,6 +101,10 @@ const UnlockDialog = new Lang.Class({
}, },
_onReset: function(authPrompt, beginRequest) { _onReset: function(authPrompt, beginRequest) {
this._authPrompt.begin();
},
_onNeedsUserName: function() {
let userName; let userName;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) { if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
this._authPrompt.setUser(this._user); this._authPrompt.setUser(this._user);
@@ -109,7 +113,7 @@ const UnlockDialog = new Lang.Class({
userName = null; userName = null;
} }
this._authPrompt.begin({ userName: userName }); this._authPrompt.gotUserName(userName);
}, },
_escape: function() { _escape: function() {

View File

@@ -132,14 +132,14 @@ const ViewSelector = new Lang.Class({
})); }));
Main.wm.addKeybinding('toggle-application-view', Main.wm.addKeybinding('toggle-application-view',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._toggleAppsPage)); Lang.bind(this, this._toggleAppsPage));
Main.wm.addKeybinding('toggle-overview', Main.wm.addKeybinding('toggle-overview',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
@@ -282,13 +282,13 @@ const ViewSelector = new Lang.Class({
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} else if (this._shouldTriggerSearch(symbol)) { } else if (this._shouldTriggerSearch(symbol)) {
this.startSearch(event); this.startSearch(event);
} else if (!this._searchActive && !global.stage.key_focus) { } else if (!this._searchActive) {
if (symbol == Clutter.Tab || symbol == Clutter.Down) { if (symbol == Clutter.Tab || symbol == Clutter.Down) {
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false); this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
return Clutter.EVENT_STOP; return true;
} else if (symbol == Clutter.ISO_Left_Tab) { } else if (symbol == Clutter.ISO_Left_Tab) {
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false); this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
return Clutter.EVENT_STOP; return true;
} }
} }
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
@@ -383,11 +383,9 @@ const ViewSelector = new Lang.Class({
this._iconClickedId = this._entry.connect('secondary-icon-clicked', this._iconClickedId = this._entry.connect('secondary-icon-clicked',
Lang.bind(this, this.reset)); Lang.bind(this, this.reset));
if (this._searchTimeoutId == 0) { if (this._searchTimeoutId == 0)
this._searchTimeoutId = Mainloop.timeout_add(150, this._searchTimeoutId = Mainloop.timeout_add(150,
Lang.bind(this, this._doSearch)); Lang.bind(this, this._doSearch));
GLib.Source.set_name_by_id(this._searchTimeoutId, '[gnome-shell] this._doSearch');
}
} else { } else {
if (this._iconClickedId > 0) { if (this._iconClickedId > 0) {
this._entry.disconnect(this._iconClickedId); this._entry.disconnect(this._iconClickedId);

View File

@@ -15,7 +15,6 @@ const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
const Main = imports.ui.main; const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog; const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings'; const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
const WINDOW_ANIMATION_TIME = 0.25; const WINDOW_ANIMATION_TIME = 0.25;
@@ -83,7 +82,6 @@ const DisplayChangeDialog = new Lang.Class({
{ expand: false, x_fill: false, x_align: St.Align.END }); { expand: false, x_fill: false, x_align: St.Align.END });
this._timeoutId = Mainloop.timeout_add(ONE_SECOND, Lang.bind(this, this._tick)); this._timeoutId = Mainloop.timeout_add(ONE_SECOND, Lang.bind(this, this._tick));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._tick');
}, },
close: function(timestamp) { close: function(timestamp) {
@@ -199,19 +197,12 @@ const WorkspaceTracker = new Lang.Class({
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor)); global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked)); global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
this._workspaceSettings = this._getWorkspaceSettings(); this._workspaceSettings = new Gio.Settings({ schema: Main.dynamicWorkspacesSchema });
this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces)); this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
this._nWorkspacesChanged(); this._nWorkspacesChanged();
}, },
_getWorkspaceSettings: function() {
let settings = global.get_overrides_settings();
if (settings.list_keys().indexOf('dynamic-workspaces') > -1)
return settings;
return new Gio.Settings({ schema_id: 'org.gnome.mutter' });
},
_checkWorkspaces: function() { _checkWorkspaces: function() {
let i; let i;
let emptyWorkspaces = []; let emptyWorkspaces = [];
@@ -280,20 +271,18 @@ const WorkspaceTracker = new Lang.Class({
this._queueCheckWorkspaces(); this._queueCheckWorkspaces();
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(workspace._keepAliveId, '[gnome-shell] this._queueCheckWorkspaces');
}, },
_windowRemoved: function(workspace, window) { _windowRemoved: function(workspace, window) {
workspace._lastRemovedWindow = window; workspace._lastRemovedWindow = window;
this._queueCheckWorkspaces(); this._queueCheckWorkspaces();
let id = Mainloop.timeout_add(LAST_WINDOW_GRACE_TIME, Lang.bind(this, function() { Mainloop.timeout_add(LAST_WINDOW_GRACE_TIME, Lang.bind(this, function() {
if (workspace._lastRemovedWindow == window) { if (workspace._lastRemovedWindow == window) {
workspace._lastRemovedWindow = null; workspace._lastRemovedWindow = null;
this._queueCheckWorkspaces(); this._queueCheckWorkspaces();
} }
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces');
}, },
_windowLeftMonitor: function(metaScreen, monitorIndex, metaWin) { _windowLeftMonitor: function(metaScreen, monitorIndex, metaWin) {
@@ -471,6 +460,8 @@ const WindowManager = new Lang.Class({
this._dimmedWindows = []; this._dimmedWindows = [];
this._animationBlockCount = 0;
this._allowedKeybindings = {}; this._allowedKeybindings = {};
this._switchData = null; this._switchData = null;
@@ -486,7 +477,6 @@ const WindowManager = new Lang.Class({
this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace)); this._shellwm.connect('switch-workspace', Lang.bind(this, this._switchWorkspace));
this._shellwm.connect('show-tile-preview', Lang.bind(this, this._showTilePreview)); this._shellwm.connect('show-tile-preview', Lang.bind(this, this._showTilePreview));
this._shellwm.connect('hide-tile-preview', Lang.bind(this, this._hideTilePreview)); this._shellwm.connect('hide-tile-preview', Lang.bind(this, this._hideTilePreview));
this._shellwm.connect('show-window-menu', Lang.bind(this, this._showWindowMenu));
this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow)); this._shellwm.connect('minimize', Lang.bind(this, this._minimizeWindow));
this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow)); this._shellwm.connect('maximize', Lang.bind(this, this._maximizeWindow));
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow)); this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
@@ -514,10 +504,6 @@ const WindowManager = new Lang.Class({
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-to-workspace-last',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-left', this.setCustomKeybindingHandler('move-to-workspace-left',
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW, Shell.KeyBindingMode.OVERVIEW,
@@ -618,9 +604,6 @@ const WindowManager = new Lang.Class({
this.setCustomKeybindingHandler('move-to-workspace-12', this.setCustomKeybindingHandler('move-to-workspace-12',
Shell.KeyBindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher)); Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-last',
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-applications', this.setCustomKeybindingHandler('switch-applications',
Shell.KeyBindingMode.NORMAL, Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher)); Lang.bind(this, this._startAppSwitcher));
@@ -655,13 +638,13 @@ const WindowManager = new Lang.Class({
Lang.bind(this, this._startA11ySwitcher)); Lang.bind(this, this._startA11ySwitcher));
this.addKeybinding('pause-resume-tweens', this.addKeybinding('pause-resume-tweens',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL, Shell.KeyBindingMode.ALL,
Lang.bind(this, this._toggleTweens)); Lang.bind(this, this._toggleTweens));
this.addKeybinding('open-application-menu', this.addKeybinding('open-application-menu',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }), new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE, Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL | Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.TOPBAR_POPUP, Shell.KeyBindingMode.TOPBAR_POPUP,
@@ -676,8 +659,6 @@ const WindowManager = new Lang.Class({
this._dimWindow(this._dimmedWindows[i]); this._dimWindow(this._dimmedWindows[i]);
})); }));
this._windowMenuManager = new WindowMenu.WindowMenuManager();
if (Main.sessionMode.hasWorkspaces) if (Main.sessionMode.hasWorkspaces)
this._workspaceTracker = new WorkspaceTracker(this); this._workspaceTracker = new WorkspaceTracker(this);
@@ -713,8 +694,16 @@ const WindowManager = new Lang.Class({
this._allowedKeybindings[name] = modes; this._allowedKeybindings[name] = modes;
}, },
blockAnimations: function() {
this._animationBlockCount++;
},
unblockAnimations: function() {
this._animationBlockCount = Math.max(0, this._animationBlockCount - 1);
},
_shouldAnimate: function() { _shouldAnimate: function() {
return !Main.overview.visible; return !(Main.overview.visible || this._animationBlockCount > 0);
}, },
_shouldAnimateActor: function(actor) { _shouldAnimateActor: function(actor) {
@@ -1160,10 +1149,6 @@ const WindowManager = new Lang.Class({
this._tilePreview.hide(); this._tilePreview.hide();
}, },
_showWindowMenu: function(shellwm, window, menu, rect) {
this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
},
_startAppSwitcher : function(display, screen, window, binding) { _startAppSwitcher : function(display, screen, window, binding) {
/* prevent a corner case where both popups show up at once */ /* prevent a corner case where both popups show up at once */
if (this._workspaceSwitcherPopup != null) if (this._workspaceSwitcherPopup != null)
@@ -1220,10 +1205,7 @@ const WindowManager = new Lang.Class({
let newWs; let newWs;
let direction; let direction;
if (target == 'last') { if (isNaN(target)) {
direction = Meta.MotionDirection.DOWN;
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) {
direction = Meta.MotionDirection[target.toUpperCase()]; direction = Meta.MotionDirection[target.toUpperCase()];
newWs = screen.get_active_workspace().get_neighbor(direction); newWs = screen.get_active_workspace().get_neighbor(direction);
} else if (target > 0) { } else if (target > 0) {

View File

@@ -1,185 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const St = imports.gi.St;
const Shell = imports.gi.Shell;
const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const RemoteMenu = imports.ui.remoteMenu;
const WindowMenu = new Lang.Class({
Name: 'WindowMenu',
Extends: PopupMenu.PopupMenu,
_init: function(window, sourceActor) {
this.parent(sourceActor, 0, St.Side.TOP);
this.actor.add_style_class_name('window-menu');
Main.layoutManager.uiGroup.add_actor(this.actor);
this.actor.hide();
this._buildMenu(window);
},
_buildMenu: function(window) {
let type = window.get_window_type();
let item;
item = this.addAction(_("Minimize"), Lang.bind(this, function(event) {
window.minimize();
}));
if (!window.can_minimize())
item.setSensitive(false);
if (window.get_maximized()) {
item = this.addAction(_("Unmaximize"), Lang.bind(this, function() {
window.unmaximize(Meta.MaximizeFlags.BOTH);
}));
} else {
item = this.addAction(_("Maximize"), Lang.bind(this, function() {
window.maximize(Meta.MaximizeFlags.BOTH);
}));
}
if (!window.can_maximize())
item.setSensitive(false);
item = this.addAction(_("Move"), Lang.bind(this, function(event) {
window.begin_grab_op(Meta.GrabOp.KEYBOARD_MOVING, true, event.get_time());
}));
if (!window.allows_move())
item.setSensitive(false);
item = this.addAction(_("Resize"), Lang.bind(this, function(event) {
window.begin_grab_op(Meta.GrabOp.KEYBOARD_RESIZING_UNKNOWN, true, event.get_time());
}));
if (!window.allows_resize())
item.setSensitive(false);
if (!window.titlebar_is_onscreen() && type != Meta.WindowType.DOCK && type != Meta.WindowType.DESKTOP) {
this.addAction(_("Move Titlebar Onscreen"), Lang.bind(this, function(event) {
window.shove_titlebar_onscreen();
}));
}
item = this.addAction(_("Always on Top"), Lang.bind(this, function() {
if (window.is_above())
window.unmake_above();
else
window.make_above();
}));
if (window.is_above())
item.setOrnament(PopupMenu.Ornament.DOT);
if (window.get_maximized() ||
type == Meta.WindowType.DOCK ||
type == Meta.WindowType.DESKTOP ||
type == Meta.WindowType.SPLASHSCREEN)
item.setSensitive(false);
if (Main.sessionMode.hasWorkspaces &&
(!Meta.prefs_get_workspaces_only_on_primary() ||
window.is_on_primary_monitor())) {
let isSticky = window.is_on_all_workspaces();
item = this.addAction(_("Always on Visible Workspace"), Lang.bind(this, function() {
if (isSticky)
window.unstick();
else
window.stick();
}));
if (isSticky)
item.setOrnament(PopupMenu.Ornament.DOT);
if (window.is_always_on_all_workspaces())
item.setSensitive(false);
let nWorkspaces = global.screen.n_workspaces;
if (!isSticky) {
let workspace = window.get_workspace();
let idx = workspace.index();
if (idx > 0) {
this.addAction(_("Move to Workspace Up"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.UP));
}));
}
if (idx < nWorkspaces) {
this.addAction(_("Move to Workspace Down"), Lang.bind(this, function(event) {
window.change_workspace(workspace.get_neighbor(Meta.MotionDirection.DOWN));
}));
}
}
}
this.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
item = this.addAction(_("Close"), Lang.bind(this, function(event) {
window.delete(event.get_time());
}));
if (!window.can_close())
item.setSensitive(false);
}
});
const AppMenu = new Lang.Class({
Name: 'AppMenu',
Extends: RemoteMenu.RemoteMenu,
_init: function(window, sourceActor) {
let app = Shell.WindowTracker.get_default().get_window_app(window);
this.parent(sourceActor, app.menu, app.action_group);
this.actor.add_style_class_name('fallback-app-menu');
let variant = window.get_gtk_theme_variant();
if (variant)
this.actor.add_style_class_name(variant);
Main.layoutManager.uiGroup.add_actor(this.actor);
this.actor.hide();
}
});
const WindowMenuManager = new Lang.Class({
Name: 'WindowMenuManager',
_init: function() {
this._manager = new PopupMenu.PopupMenuManager({ actor: Main.layoutManager.dummyCursor });
this._sourceActor = new St.Widget({ reactive: true, visible: false });
this._sourceActor.connect('button-press-event', Lang.bind(this,
function() {
this._manager.activeMenu.toggle();
}));
Main.uiGroup.add_actor(this._sourceActor);
},
showWindowMenuForWindow: function(window, type, rect) {
let menuType = (type == Meta.WindowMenuType.WM) ? WindowMenu : AppMenu;
let menu = new menuType(window, this._sourceActor);
this._manager.addMenu(menu);
menu.connect('activate', function() {
window.check_alive(global.get_current_time());
});
this._sourceActor.set_size(rect.width, rect.height);
this._sourceActor.set_position(rect.x, rect.y);
this._sourceActor.show();
menu.open(BoxPointer.PopupAnimation.NONE);
menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
menu.connect('open-state-changed', Lang.bind(this, function(menu_, isOpen) {
if (isOpen)
return;
this._sourceActor.hide();
menu.destroy();
}));
}
});

View File

@@ -8,8 +8,6 @@ const Meta = imports.gi.Meta;
const Pango = imports.gi.Pango; const Pango = imports.gi.Pango;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const St = imports.gi.St; const St = imports.gi.St;
const Atk = imports.gi.Atk;
const Signals = imports.signals; const Signals = imports.signals;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
@@ -67,7 +65,7 @@ const WindowCloneLayout = new Lang.Class({
// paradoxically is the smaller rectangle, containing the positions // paradoxically is the smaller rectangle, containing the positions
// of the visible frame. The input rect contains everything, // of the visible frame. The input rect contains everything,
// including the invisible border padding. // including the invisible border padding.
let inputRect = window.get_buffer_rect(); let inputRect = window.get_input_rect();
let box = new Clutter.ActorBox(); let box = new Clutter.ActorBox();
@@ -123,7 +121,6 @@ const WindowClone = new Lang.Class({
// the hierarchy that is sized to only the visible portion. // the hierarchy that is sized to only the visible portion.
this.actor = new St.Widget({ reactive: true, this.actor = new St.Widget({ reactive: true,
can_focus: true, can_focus: true,
accessible_role: Atk.Role.PUSH_BUTTON,
layout_manager: new WindowCloneLayout() }); layout_manager: new WindowCloneLayout() });
this.actor.add_child(this._windowClone); this.actor.add_child(this._windowClone);
@@ -200,10 +197,6 @@ const WindowClone = new Lang.Class({
this.emit('size-changed'); this.emit('size-changed');
}, },
hasAttachedDialogs: function() {
return this.actor.get_n_children() > 1;
},
_doAddAttachedDialog: function(metaWin, realWin) { _doAddAttachedDialog: function(metaWin, realWin) {
let clone = new Clutter.Clone({ source: realWin }); let clone = new Clutter.Clone({ source: realWin });
clone._updateId = metaWin.connect('size-changed', Lang.bind(this, function() { clone._updateId = metaWin.connect('size-changed', Lang.bind(this, function() {
@@ -431,7 +424,6 @@ const WindowOverlay = new Lang.Class({
text: metaWindow.title }); text: metaWindow.title });
title.clutter_text.ellipsize = Pango.EllipsizeMode.END; title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
title._spacing = 0; title._spacing = 0;
windowClone.actor.label_actor = title;
this._updateCaptionId = metaWindow.connect('notify::title', this._updateCaptionId = metaWindow.connect('notify::title',
Lang.bind(this, function(w) { Lang.bind(this, function(w) {
@@ -586,8 +578,7 @@ const WindowOverlay = new Lang.Class({
}, },
_windowCanClose: function() { _windowCanClose: function() {
return this._windowClone.metaWindow.can_close() && return this._windowClone.metaWindow.can_close();
!this._windowClone.hasAttachedDialogs();
}, },
_onWindowAdded: function(workspace, win) { _onWindowAdded: function(workspace, win) {
@@ -599,12 +590,11 @@ const WindowOverlay = new Lang.Class({
// use an idle handler to avoid mapping problems - // use an idle handler to avoid mapping problems -
// see comment in Workspace._windowAdded // see comment in Workspace._windowAdded
let id = Mainloop.idle_add(Lang.bind(this, Mainloop.idle_add(Lang.bind(this,
function() { function() {
this._windowClone.emit('selected'); this._windowClone.emit('selected');
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._windowClone.emit');
} }
}, },
@@ -675,10 +665,8 @@ const WindowOverlay = new Lang.Class({
}, },
_onLeave: function() { _onLeave: function() {
if (this._idleToggleCloseId == 0) { if (this._idleToggleCloseId == 0)
this._idleToggleCloseId = Mainloop.timeout_add(750, Lang.bind(this, this._idleToggleCloseButton)); this._idleToggleCloseId = Mainloop.timeout_add(750, Lang.bind(this, this._idleToggleCloseButton));
GLib.Source.set_name_by_id(this._idleToggleCloseId, '[gnome-shell] this._idleToggleCloseButton');
}
return Clutter.EVENT_PROPAGATE; return Clutter.EVENT_PROPAGATE;
}, },
@@ -1426,7 +1414,6 @@ const Workspace = new Lang.Class({
this._currentLayout = null; this._currentLayout = null;
this._repositionWindowsId = Mainloop.timeout_add(750, this._repositionWindowsId = Mainloop.timeout_add(750,
Lang.bind(this, this._delayedWindowRepositioning)); Lang.bind(this, this._delayedWindowRepositioning));
GLib.Source.set_name_by_id(this._repositionWindowsId, '[gnome-shell] this._delayedWindowRepositioning');
}, },
_doAddWindow : function(metaWin) { _doAddWindow : function(metaWin) {
@@ -1438,15 +1425,14 @@ const Workspace = new Lang.Class({
if (!win) { if (!win) {
// Newly-created windows are added to a workspace before // Newly-created windows are added to a workspace before
// the compositor finds out about them... // the compositor finds out about them...
let id = Mainloop.idle_add(Lang.bind(this, Mainloop.idle_add(Lang.bind(this,
function () { function () {
if (this.actor && if (this.actor &&
metaWin.get_compositor_private() && metaWin.get_compositor_private() &&
metaWin.get_workspace() == this.metaWorkspace) metaWin.get_workspace() == this.metaWorkspace)
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow');
return; return;
} }

View File

@@ -52,7 +52,6 @@ const WorkspaceSwitcherPopup = new Lang.Class({
this._globalSignals.push(global.screen.connect('workspace-removed', Lang.bind(this, this._redisplay))); this._globalSignals.push(global.screen.connect('workspace-removed', Lang.bind(this, this._redisplay)));
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout)); this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
}, },
_getPreferredHeight : function (actor, forWidth, alloc) { _getPreferredHeight : function (actor, forWidth, alloc) {
@@ -146,7 +145,6 @@ const WorkspaceSwitcherPopup = new Lang.Class({
if (this._timeoutId != 0) if (this._timeoutId != 0)
Mainloop.source_remove(this._timeoutId); Mainloop.source_remove(this._timeoutId);
this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout)); this._timeoutId = Mainloop.timeout_add(DISPLAY_TIMEOUT, Lang.bind(this, this._onTimeout));
GLib.Source.set_name_by_id(this._timeoutId, '[gnome-shell] this._onTimeout');
this._show(); this._show();
}, },

View File

@@ -386,15 +386,14 @@ const WorkspaceThumbnail = new Lang.Class({
if (!win) { if (!win) {
// Newly-created windows are added to a workspace before // Newly-created windows are added to a workspace before
// the compositor finds out about them... // the compositor finds out about them...
let id = Mainloop.idle_add(Lang.bind(this, Mainloop.idle_add(Lang.bind(this,
function () { function () {
if (!this._removed && if (!this._removed &&
metaWin.get_compositor_private() && metaWin.get_compositor_private() &&
metaWin.get_workspace() == this.metaWorkspace) metaWin.get_workspace() == this.metaWorkspace)
this._doAddWindow(metaWin); this._doAddWindow(metaWin);
return GLib.SOURCE_REMOVE; return GLib.SOURCE_REMOVE;
})); }));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow');
return; return;
} }
@@ -665,7 +664,7 @@ const ThumbnailsBox = new Lang.Class({
Main.overview.connect('window-drag-cancelled', Main.overview.connect('window-drag-cancelled',
Lang.bind(this, this._onDragCancelled)); Lang.bind(this, this._onDragCancelled));
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
this._settings.connect('changed::dynamic-workspaces', this._settings.connect('changed::dynamic-workspaces',
Lang.bind(this, this._updateSwitcherVisibility)); Lang.bind(this, this._updateSwitcherVisibility));
}, },
@@ -826,14 +825,10 @@ const ThumbnailsBox = new Lang.Class({
window.change_workspace_by_index(window.get_workspace().index() + 1, true); window.change_workspace_by_index(window.get_workspace().index() + 1, true);
}); });
if (isWindow) { if (isWindow)
// ... and bam, a workspace, good as new. // ... and bam, a workspace, good as new.
// Move the window to our monitor first if necessary.
let thumbMonitor = this._thumbnails[newWorkspaceIndex].monitorIndex;
if (source.metaWindow.get_monitor() != thumbMonitor)
source.metaWindow.move_to_monitor(thumbMonitor);
source.metaWindow.change_workspace_by_index(newWorkspaceIndex, true); source.metaWindow.change_workspace_by_index(newWorkspaceIndex, true);
} else if (source.shellWorkspaceLaunch) { else if (source.shellWorkspaceLaunch) {
source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex, source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex,
timestamp: time }); timestamp: time });
// This new workspace will be automatically removed if the application fails // This new workspace will be automatically removed if the application fails
@@ -907,10 +902,7 @@ const ThumbnailsBox = new Lang.Class({
}, },
_workspacesChanged: function() { _workspacesChanged: function() {
let validThumbnails = this._thumbnails.filter(function(t) { let oldNumWorkspaces = this._thumbnails.length;
return t.state <= ThumbnailState.NORMAL;
});
let oldNumWorkspaces = validThumbnails.length;
let newNumWorkspaces = global.screen.n_workspaces; let newNumWorkspaces = global.screen.n_workspaces;
let active = global.screen.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();

View File

@@ -94,7 +94,7 @@ const WorkspacesView = new Lang.Class({
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._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
let activeWorkspaceIndex = global.screen.get_active_workspace_index(); let activeWorkspaceIndex = global.screen.get_active_workspace_index();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@@ -429,7 +429,7 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews = []; this._workspacesViews = [];
this._primaryScrollAdjustment = null; this._primaryScrollAdjustment = null;
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA }); this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
this._settings.connect('changed::workspaces-only-on-primary', this._settings.connect('changed::workspaces-only-on-primary',
Lang.bind(this, Lang.bind(this,
this._workspacesOnlyOnPrimaryChanged)); this._workspacesOnlyOnPrimaryChanged));

View File

@@ -33,7 +33,6 @@ id
it it
ja ja
kk kk
km
kn kn
ko ko
ku ku

View File

@@ -55,7 +55,6 @@ js/ui/unlockDialog.js
js/ui/viewSelector.js js/ui/viewSelector.js
js/ui/windowAttentionHandler.js js/ui/windowAttentionHandler.js
js/ui/windowManager.js js/ui/windowManager.js
js/ui/windowMenu.js
src/calendar-server/evolution-calendar.desktop.in.in src/calendar-server/evolution-calendar.desktop.in.in
# Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it. # Please do not remove this file from POTFILES.in. Run "git submodule init && git submodule update" to get it.
src/gvc/gvc-mixer-control.c src/gvc/gvc-mixer-control.c

642
po/an.po

File diff suppressed because it is too large Load Diff

258
po/ar.po
View File

@@ -2,15 +2,15 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010, 2011, 2012, 2013, 2014. # Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010, 2011, 2012, 2013, 2014.
# Muhammed Abd-ulaziz Abd-ullah <thenubianmuha_idrecy@yahoo.co.uk>, 2012. # Muhammed Abd-ulaziz Abd-ullah <thenubianmuha_idrecy@yahoo.co.uk>, 2012.
# Abderrahim Kitouni <a.kitouni@gmail.com>, 2012, 2014. # Abderrahim Kitouni <a.kitouni@gmail.com>, 2012.
# Ibrahim Saed <ibraheem5000@gmail.com>, 2012. # Ibrahim Saed <ibraheem5000@gmail.com>, 2012.
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-03-26 01:34+0200\n" "POT-Creation-Date: 2014-02-28 22:55+0200\n"
"PO-Revision-Date: 2014-03-21 11:05+0100\n" "PO-Revision-Date: 2014-02-28 23:08+0200\n"
"Last-Translator: Abderrahim Kitouni <a.kitouni@gmail.com>\n" "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n" "Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n" "Language: ar\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Virtaal 0.7.1\n" "X-Generator: Virtaal 1.0.0-beta1\n"
"&& n%100<=10 ? 3: n%100>=11 ? 4 : 5;\n" "&& n%100<=10 ? 3: n%100>=11 ? 4 : 5;\n"
"X-Project-Style: gnome\n" "X-Project-Style: gnome\n"
@@ -210,7 +210,7 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed " "Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', " "to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS " "'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what GeoClue will " "receiver). Please keep in mind that this only controls what Geoclue will "
"allow applications to see and they can find user's location on their own " "allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)." "using network resources (albeit with street-level accuracy at best)."
msgstr "" msgstr ""
@@ -277,7 +277,7 @@ msgstr "اختر امتدادا لضبطه من القائمة أعلاه."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429 #: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878 #: ../js/ui/status/network.js:883
msgid "Cancel" msgid "Cancel"
msgstr "ألغِ" msgstr "ألغِ"
@@ -295,25 +295,25 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "ادخل" msgstr "ادخل"
#: ../js/gdm/loginDialog.js:271 #: ../js/gdm/loginDialog.js:270
msgid "Choose Session" msgid "Choose Session"
msgstr "أغلق الجلسة" msgstr "أغلق الجلسة"
#: ../js/gdm/loginDialog.js:431 #: ../js/gdm/loginDialog.js:430
msgid "Not listed?" msgid "Not listed?"
msgstr "غير مدرج؟" msgstr "غير مدرج؟"
#: ../js/gdm/loginDialog.js:611 #: ../js/gdm/loginDialog.js:598
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(مثلا مستخدم أو %s)" msgstr "(مثلا مستخدم أو %s)"
#: ../js/gdm/loginDialog.js:616 ../js/ui/components/networkAgent.js:262 #: ../js/gdm/loginDialog.js:603 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280 #: ../js/ui/components/networkAgent.js:280
msgid "Username: " msgid "Username: "
msgstr "اسم المستخدم: " msgstr "اسم المستخدم: "
#: ../js/gdm/loginDialog.js:917 #: ../js/gdm/loginDialog.js:868
msgid "Login Window" msgid "Login Window"
msgstr "نافذة الولوج" msgstr "نافذة الولوج"
@@ -350,15 +350,15 @@ msgstr "شائعة"
msgid "All" msgid "All"
msgstr "الكل" msgstr "الكل"
#: ../js/ui/appDisplay.js:1555 #: ../js/ui/appDisplay.js:1552
msgid "New Window" msgid "New Window"
msgstr "نافذة جديدة" msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:1577 ../js/ui/dash.js:285 #: ../js/ui/appDisplay.js:1574 ../js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة" msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:1583 #: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة" msgstr "أضِف إلى المفضّلة"
@@ -501,44 +501,44 @@ msgstr "السبت"
msgid "calendar:MY" msgid "calendar:MY"
msgstr "" msgstr ""
#: ../js/ui/calendar.js:450 #: ../js/ui/calendar.js:446
msgid "Previous month" msgid "Previous month"
msgstr "الشهر السابق" msgstr "الشهر السابق"
#: ../js/ui/calendar.js:460 #: ../js/ui/calendar.js:456
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:772 #: ../js/ui/calendar.js:762
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:790 #: ../js/ui/calendar.js:780
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:793 #: ../js/ui/calendar.js:783
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A %d %B %Y" msgstr "%A %d %B %Y"
#: ../js/ui/calendar.js:804 #: ../js/ui/calendar.js:794
msgid "Today" msgid "Today"
msgstr "اليوم" msgstr "اليوم"
#: ../js/ui/calendar.js:808 #: ../js/ui/calendar.js:798
msgid "Tomorrow" msgid "Tomorrow"
msgstr "غدا" msgstr "غدا"
#: ../js/ui/calendar.js:819 #: ../js/ui/calendar.js:809
msgid "This week" msgid "This week"
msgstr "هذا الأسبوع" msgstr "هذا الأسبوع"
#: ../js/ui/calendar.js:827 #: ../js/ui/calendar.js:817
msgid "Next week" msgid "Next week"
msgstr "الأسبوع القادم" msgstr "الأسبوع القادم"
@@ -571,8 +571,8 @@ msgstr "كلمة السرّ:"
msgid "Type again:" msgid "Type again:"
msgstr "أدخلها ثانية:" msgstr "أدخلها ثانية:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881 #: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect" msgid "Connect"
msgstr "اتصل" msgstr "اتصل"
@@ -697,7 +697,7 @@ msgstr "%H:%M"
#. time string in 24h format. i.e. "Yesterday, 14:30" */ #. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:962 #: ../js/ui/components/telepathyClient.js:962
msgid "Yesterday, %H%M" msgid "Yesterday, %H%M"
msgstr "بالأمس، %H%M" msgstr "بالأمس، %H:%M"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */ #. string in 24h format. i.e. "Monday, 14:30" */
@@ -717,7 +717,7 @@ msgstr "%d %B، %H:%M"
#. i.e. "May 25 2012, 14:30" */ #. i.e. "May 25 2012, 14:30" */
#: ../js/ui/components/telepathyClient.js:982 #: ../js/ui/components/telepathyClient.js:982
msgid "%B %d %Y, %H%M" msgid "%B %d %Y, %H%M"
msgstr "%d %B، %H:%M" msgstr "%d %B %Y، %H:%M"
#. Translators: Time in 24h format */ #. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:991 #: ../js/ui/components/telepathyClient.js:991
@@ -728,27 +728,27 @@ msgstr "%l:%M %p"
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */ #. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:998 #: ../js/ui/components/telepathyClient.js:998
msgid "Yesterday, %l%M %p" msgid "Yesterday, %l%M %p"
msgstr "بالأمس، %l%M %p" msgstr "بالأمس، %l:%M %p"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */ #. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1005 #: ../js/ui/components/telepathyClient.js:1005
msgid "%A, %l%M %p" msgid "%A, %l%M %p"
msgstr "%l:%M %p" msgstr "%A، %l:%M %p"
#. Translators: this is the month name and day number #. Translators: this is the month name and day number
#. followed by a time string in 12h format. #. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */ #. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1012 #: ../js/ui/components/telepathyClient.js:1012
msgid "%B %d, %l%M %p" msgid "%B %d, %l%M %p"
msgstr "%d %B، %H:%M" msgstr "%d %B، %l:%M %p"
#. Translators: this is the month name, day number, year #. Translators: this is the month name, day number, year
#. number followed by a time string in 12h format. #. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/ #. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1018 #: ../js/ui/components/telepathyClient.js:1018
msgid "%B %d %Y, %l%M %p" msgid "%B %d %Y, %l%M %p"
msgstr "%d %B %Y، %l%M %p" msgstr "%d %B %Y، %l:%M %p"
#. 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. */
@@ -931,7 +931,7 @@ msgstr "تعذّر الاتصال مع %s"
msgid "View account" msgid "View account"
msgstr "أظهر الحساب" msgstr "أظهر الحساب"
#: ../js/ui/components/telepathyClient.js:1439 #: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason" msgid "Unknown reason"
msgstr "السبب غير معروف" msgstr "السبب غير معروف"
@@ -947,22 +947,22 @@ msgstr "أظهر التطبيقات"
msgid "Dash" msgid "Dash"
msgstr "الشريط" msgstr "الشريط"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "افتح التقويم" msgstr "افتح التقويم"
#: ../js/ui/dateMenu.js:95 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "افتح الساعات" msgstr "افتح الساعات"
#: ../js/ui/dateMenu.js:102 #: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "إعدادات الوقت و التّاريخ" msgstr "إعدادات الوقت و التّاريخ"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */ #. */
#: ../js/ui/dateMenu.js:192 #: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %e %B، %Y" msgstr "%A %e %B، %Y"
@@ -978,6 +978,7 @@ msgid "Log Out"
msgstr "خروج" msgstr "خروج"
#: ../js/ui/endSessionDialog.js:69 #: ../js/ui/endSessionDialog.js:69
#, 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] "سيُخرج %s تلقائيا الآن." msgstr[0] "سيُخرج %s تلقائيا الآن."
@@ -988,6 +989,7 @@ msgstr[4] "سيُخرج %s تلقائيا بعد %d ثانية."
msgstr[5] "سيُخرج %s تلقائيا بعد %d ثانية." msgstr[5] "سيُخرج %s تلقائيا بعد %d ثانية."
#: ../js/ui/endSessionDialog.js:74 #: ../js/ui/endSessionDialog.js:74
#, 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] "ستُخرج تلقائيا الآن." msgstr[0] "ستُخرج تلقائيا الآن."
@@ -1013,6 +1015,7 @@ msgid "Install Updates & Power Off"
msgstr "ثبّت التحديثات ثم أطفئ" msgstr "ثبّت التحديثات ثم أطفئ"
#: ../js/ui/endSessionDialog.js:89 #: ../js/ui/endSessionDialog.js:89
#, 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] "سيُطفأ النظام تلقائيا الآن." msgstr[0] "سيُطفأ النظام تلقائيا الآن."
@@ -1043,6 +1046,7 @@ msgid "Restart"
msgstr "إعادة التشغيل" msgstr "إعادة التشغيل"
#: ../js/ui/endSessionDialog.js:107 #: ../js/ui/endSessionDialog.js:107
#, 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] "سيُعاد تشغيل النظام تلقائيا الآن." msgstr[0] "سيُعاد تشغيل النظام تلقائيا الآن."
@@ -1058,6 +1062,7 @@ msgid "Restart & Install Updates"
msgstr "أعد التشغيل و ثبّت التحديثات" msgstr "أعد التشغيل و ثبّت التحديثات"
#: ../js/ui/endSessionDialog.js:123 #: ../js/ui/endSessionDialog.js:123
#, 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."
@@ -1120,25 +1125,25 @@ msgstr "هل تريد تنزيل و تثبيت ”%s“ من extensions.gnome.o
msgid "Keyboard" msgid "Keyboard"
msgstr "لوحة المفاتيح" msgstr "لوحة المفاتيح"
#: ../js/ui/lookingGlass.js:643 #: ../js/ui/lookingGlass.js:641
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:697 #: ../js/ui/lookingGlass.js:695
#, javascript-format #, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "لم يصدر %s أي خطأ." msgstr "لم يصدر %s أي خطأ."
#: ../js/ui/lookingGlass.js:703 #: ../js/ui/lookingGlass.js:701
msgid "Hide Errors" msgid "Hide Errors"
msgstr "أخفِ الأخطاء" msgstr "أخفِ الأخطاء"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 #: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors" msgid "Show Errors"
msgstr "اظهر الأخطاء" msgstr "اظهر الأخطاء"
#: ../js/ui/lookingGlass.js:716 #: ../js/ui/lookingGlass.js:714
msgid "Enabled" msgid "Enabled"
msgstr "مفعّل" msgstr "مفعّل"
@@ -1146,28 +1151,28 @@ msgstr "مفعّل"
#. because it's disabled by rfkill (airplane mode) */ #. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/network.js:555 #: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../src/gvc/gvc-mixer-control.c:1830 #: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "معطّل" msgstr "معطّل"
#: ../js/ui/lookingGlass.js:721 #: ../js/ui/lookingGlass.js:719
msgid "Error" msgid "Error"
msgstr "خطأ" msgstr "خطأ"
#: ../js/ui/lookingGlass.js:723 #: ../js/ui/lookingGlass.js:721
msgid "Out of date" msgid "Out of date"
msgstr "قديم" msgstr "قديم"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:723
msgid "Downloading" msgid "Downloading"
msgstr "ينزّل" msgstr "ينزّل"
#: ../js/ui/lookingGlass.js:749 #: ../js/ui/lookingGlass.js:747
msgid "View Source" msgid "View Source"
msgstr "اعرض المصدر" msgstr "اعرض المصدر"
#: ../js/ui/lookingGlass.js:758 #: ../js/ui/lookingGlass.js:756
msgid "Web Page" msgid "Web Page"
msgstr "صفحة الوب" msgstr "صفحة الوب"
@@ -1203,7 +1208,7 @@ msgstr "لا رسائل"
msgid "Message Tray" msgid "Message Tray"
msgstr "لوحة الرسائل" msgstr "لوحة الرسائل"
#: ../js/ui/messageTray.js:2962 #: ../js/ui/messageTray.js:2948
msgid "System Information" msgid "System Information"
msgstr "معلومات النظام" msgstr "معلومات النظام"
@@ -1213,6 +1218,7 @@ msgid "Unknown"
msgstr "غير معروف" msgstr "غير معروف"
#: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151 #: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151
#, javascript-format
msgid "%d new message" msgid "%d new message"
msgid_plural "%d new messages" msgid_plural "%d new messages"
msgstr[0] "لا رسائل جديدة" msgstr[0] "لا رسائل جديدة"
@@ -1222,11 +1228,11 @@ msgstr[3] "%d رسائل جديدة"
msgstr[4] "%d رسالة جديدة" msgstr[4] "%d رسالة جديدة"
msgstr[5] "%d رسالة جديدة" msgstr[5] "%d رسالة جديدة"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:83
msgid "Undo" msgid "Undo"
msgstr "تراجع" msgstr "تراجع"
#: ../js/ui/overview.js:124 #: ../js/ui/overview.js:123
msgid "Overview" msgid "Overview"
msgstr "نظرة عامة" msgstr "نظرة عامة"
@@ -1234,7 +1240,7 @@ msgstr "نظرة عامة"
#. 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:250 #: ../js/ui/overview.js:257
msgid "Type to search…" msgid "Type to search…"
msgstr "اكتب نصا للبحث عنه…" msgstr "اكتب نصا للبحث عنه…"
@@ -1271,6 +1277,7 @@ msgid "%A, %B %d"
msgstr "%A، %d %B" msgstr "%A، %d %B"
#: ../js/ui/screenShield.js:153 #: ../js/ui/screenShield.js:153
#, javascript-format
msgid "%d new notification" msgid "%d new notification"
msgid_plural "%d new notifications" msgid_plural "%d new notifications"
msgstr[0] "لا تنبيهات جديدة" msgstr[0] "لا تنبيهات جديدة"
@@ -1280,27 +1287,27 @@ msgstr[3] "%d تنبيهات جديدة"
msgstr[4] "%d تنبيها جديدا" msgstr[4] "%d تنبيها جديدا"
msgstr[5] "%d تنبيه جديد" msgstr[5] "%d تنبيه جديد"
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342 #: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:342
msgid "Lock" msgid "Lock"
msgstr "أوصِد" msgstr "أوصِد"
#: ../js/ui/screenShield.js:708 #: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "تحتاج جنوم إلى إيصاد الشاشة" msgstr "تحتاج جنوم إلى إيصاد الشاشة"
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309 #: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1301
msgid "Unable to lock" msgid "Unable to lock"
msgstr "تعذّر الإيصاد" msgstr "تعذّر الإيصاد"
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310 #: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1302
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "منع تطبيق الإيصاد" msgstr "منع تطبيق الإيصاد"
#: ../js/ui/search.js:603 #: ../js/ui/search.js:589
msgid "Searching…" msgid "Searching…"
msgstr "يبحث…" msgstr "يبحث…"
#: ../js/ui/search.js:646 #: ../js/ui/search.js:632
msgid "No results." msgid "No results."
msgstr "لا نتائج." msgstr "لا نتائج."
@@ -1372,23 +1379,24 @@ msgstr "تباين عال"
msgid "Large Text" msgid "Large Text"
msgstr "نص كبير" msgstr "نص كبير"
#: ../js/ui/status/bluetooth.js:49 #: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth" msgid "Bluetooth"
msgstr "بلوتوث" msgstr "بلوتوث"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/location.js:60 #: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:167 ../js/ui/status/network.js:151 #: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234 #: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85 #: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105 #: ../js/ui/status/rfkill.js:105
msgid "Turn Off" msgid "Turn Off"
msgstr "أوقف" msgstr "أوقف"
#: ../js/ui/status/bluetooth.js:54 #: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "إعدادات بلوتوث" msgstr "إعدادات بلوتوث"
#: ../js/ui/status/bluetooth.js:104 #: ../js/ui/status/bluetooth.js:100
#, javascript-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
msgstr[0] "لا أجهزة موصّلة" msgstr[0] "لا أجهزة موصّلة"
@@ -1398,7 +1406,7 @@ msgstr[3] "%d أجهزة موصّلة"
msgstr[4] "%d جهازًا موصّلا" msgstr[4] "%d جهازًا موصّلا"
msgstr[5] "%d جهاز موصّل" msgstr[5] "%d جهاز موصّل"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262 #: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
msgid "Not Connected" msgid "Not Connected"
msgstr "غير متّصل" msgstr "غير متّصل"
@@ -1410,21 +1418,21 @@ msgstr "السطوع"
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "أظهر تخطيط لوحة المفاتيح" msgstr "أظهر تخطيط لوحة المفاتيح"
#: ../js/ui/status/location.js:53 #: ../js/ui/status/location.js:52
msgid "Location" msgid "Location"
msgstr "المكان" msgstr "المكان"
#: ../js/ui/status/location.js:59 ../js/ui/status/location.js:166 #: ../js/ui/status/location.js:58 ../js/ui/status/location.js:158
#: ../js/ui/status/rfkill.js:84 #: ../js/ui/status/rfkill.js:84
msgid "On" msgid "On"
msgstr "مفعّل" msgstr "مفعّل"
#: ../js/ui/status/location.js:163 ../js/ui/status/network.js:420 #: ../js/ui/status/location.js:155 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:1260 ../js/ui/status/network.js:1464 #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgid "Off" msgid "Off"
msgstr "مغلق" msgstr "مغلق"
#: ../js/ui/status/location.js:164 ../js/ui/status/network.js:1234 #: ../js/ui/status/location.js:156 ../js/ui/status/network.js:1235
msgid "Turn On" msgid "Turn On"
msgstr "شغّل" msgstr "شغّل"
@@ -1432,138 +1440,134 @@ msgstr "شغّل"
msgid "<unknown>" msgid "<unknown>"
msgstr "<غير معروفة>" msgstr "<غير معروفة>"
#: ../js/ui/status/network.js:422
msgid "Connected"
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:426 #: ../js/ui/status/network.js:431
msgid "unmanaged" msgid "unmanaged"
msgstr "غير مُدار" msgstr "غير مُدار"
#: ../js/ui/status/network.js:428 #: ../js/ui/status/network.js:433
msgid "disconnecting..." msgid "disconnecting..."
msgstr "يقطع الاتّصال..." msgstr "يقطع الاتّصال..."
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362 #: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
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:437 ../js/ui/status/network.js:1365 #: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
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:445 #: ../js/ui/status/network.js:450
msgid "firmware missing" msgid "firmware missing"
msgstr "البرمجية الثابتة (Firmware) غير موجودة" msgstr "البرمجية الثابتة (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:449 #: ../js/ui/status/network.js:454
msgid "unavailable" msgid "unavailable"
msgstr "غير متاح" msgstr "غير متاح"
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367 #: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
msgid "connection failed" msgid "connection failed"
msgstr "فشل الاتصال" msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:472
msgid "Wired Settings" msgid "Wired Settings"
msgstr "إعدادات الاتصال السلكي" msgstr "إعدادات الاتصال السلكي"
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587 #: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "إعدادات شبكة الهاتف المحمول" msgstr "إعدادات شبكة الهاتف المحمول"
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258 #: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
msgid "Hardware Disabled" msgid "Hardware Disabled"
msgstr "العتاد مُعَطَّل" msgstr "العتاد مُعَطَّل"
#: ../js/ui/status/network.js:595 #: ../js/ui/status/network.js:600
msgid "Use as Internet connection" msgid "Use as Internet connection"
msgstr "استخدمه اتّصالًا بالإنترنت" msgstr "استخدمه اتّصالًا بالإنترنت"
#: ../js/ui/status/network.js:776 #: ../js/ui/status/network.js:781
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "وضع الطائرة مُفعّل" msgstr "وضع الطائرة مُفعّل"
#: ../js/ui/status/network.js:777 #: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "الاتصال اللاسلكي مُعطّل في وضع الطائرة." msgstr "الاتصال اللاسلكي مُعطّل في وضع الطائرة."
#: ../js/ui/status/network.js:778 #: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "عطّل وضع الطائرة" msgstr "عطّل وضع الطائرة"
#: ../js/ui/status/network.js:787 #: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "الاتصال اللاسلكي مغلق" msgstr "الاتصال اللاسلكي مغلق"
#: ../js/ui/status/network.js:788 #: ../js/ui/status/network.js:793
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "تحتاج إلى تشغيل الاتصال اللاسلكي للاتصال بالشبكة." msgstr "تحتاج إلى تشغيل الاتصال اللاسلكي للاتصال بالشبكة."
#: ../js/ui/status/network.js:789 #: ../js/ui/status/network.js:794
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "شغّل الاتصال اللاسلكي" msgstr "شغّل الاتصال اللاسلكي"
#: ../js/ui/status/network.js:814 #: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "الشبكات اللاسلكية" msgstr "الشبكات اللاسلكية"
#: ../js/ui/status/network.js:816 #: ../js/ui/status/network.js:821
msgid "Select a network" msgid "Select a network"
msgstr "اختر شبكة" msgstr "اختر شبكة"
#: ../js/ui/status/network.js:845 #: ../js/ui/status/network.js:850
msgid "No Networks" msgid "No Networks"
msgstr "لا شبكات" msgstr "لا شبكات"
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103 #: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "استخدم زر العتاد للإغلاق" msgstr "استخدم زر العتاد للإغلاق"
#: ../js/ui/status/network.js:1136 #: ../js/ui/status/network.js:1141
msgid "Select Network" msgid "Select Network"
msgstr "اختر شبكة" msgstr "اختر شبكة"
#: ../js/ui/status/network.js:1142 #: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "إعدادات الاتصال اللاسلكي" msgstr "إعدادات الاتصال اللاسلكي"
#: ../js/ui/status/network.js:1251 #: ../js/ui/status/network.js:1252
msgid "Hotspot Active" msgid "Hotspot Active"
msgstr "نقطة الاتصال نشطة" msgstr "نقطة الاتصال نشطة"
#: ../js/ui/status/network.js:1254 #: ../js/ui/status/network.js:1255
msgid "Connecting" msgid "Connecting"
msgstr "يتّصل" msgstr "يتّصل"
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88 #: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
msgid "Network Settings" msgid "Network Settings"
msgstr "إعدادات الشّبكة" msgstr "إعدادات الشّبكة"
#: ../js/ui/status/network.js:1435 #: ../js/ui/status/network.js:1436
msgid "VPN Settings" msgid "VPN Settings"
msgstr "إعدادات ش‌خ‌ف (VPN)" msgstr "إعدادات ش‌خ‌ف (VPN)"
#: ../js/ui/status/network.js:1454 #: ../js/ui/status/network.js:1455
msgid "VPN" msgid "VPN"
msgstr "ش‌خ‌ف (VPN)" msgstr "ش‌خ‌ف (VPN)"
#: ../js/ui/status/network.js:1607 #: ../js/ui/status/network.js:1598
msgid "Network Manager" msgid "Network Manager"
msgstr "مدير الشبكة" msgstr "مدير الشبكة"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1637
msgid "Connection failed" msgid "Connection failed"
msgstr "فشل الاتصال" msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:1647 #: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "فشل تفعيل اتصال الشبكة" msgstr "فشل تفعيل اتصال الشبكة"
@@ -1582,12 +1586,12 @@ msgstr "يَحسِب…"
#: ../js/ui/status/power.js:86 #: ../js/ui/status/power.js:86
#, javascript-format #, javascript-format
msgid "%d%02d Remaining (%d%%)" msgid "%d%02d Remaining (%d%%)"
msgstr "بقي %d%02d (%d%%)" msgstr "بقي %d:%02d (%d%%)"
#: ../js/ui/status/power.js:91 #: ../js/ui/status/power.js:91
#, javascript-format #, javascript-format
msgid "%d%02d Until Full (%d%%)" msgid "%d%02d Until Full (%d%%)"
msgstr "بقي على الاكتمال %d%02d (%d%%)" msgstr "بقي على الاكتمال %d:%02d (%d%%)"
#: ../js/ui/status/power.js:119 #: ../js/ui/status/power.js:119
msgid "UPS" msgid "UPS"
@@ -1670,6 +1674,7 @@ msgid "Keep Changes"
msgstr "أبق على التغييرات" msgstr "أبق على التغييرات"
#: ../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] "سيُتراجع عن التغييرات الآن" msgstr[0] "سيُتراجع عن التغييرات الآن"
@@ -1746,35 +1751,6 @@ msgstr "لا يمكن أن تكون كلمة السرّ فارغة"
msgid "Authentication dialog was dismissed by the user" msgid "Authentication dialog was dismissed by the user"
msgstr "أغلق المستخدم مربع الاستيثاق الحِواري" msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ 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 "%H\\u2236%M"
#~ msgstr "%H\\u2236%M"
#~ msgid "%A, %H\\u2236%M"
#~ msgstr "%A، %H\\u2236%M"
#~ msgid "%B %d, %H\\u2236%M"
#~ msgstr "%d %B، %H\\u2236%M"
#~ msgid "%B %d %Y, %H\\u2236%M"
#~ msgstr "%d %B %Y، %H\\u2236%M"
#~ msgid "%l\\u2236%M %p"
#~ msgstr "%H\\u2236%M"
#~ msgid "%A, %l\\u2236%M %p"
#~ msgstr "%A، %l\\u2236%M %p"
#~ msgid "%B %d, %l\\u2236%M %p"
#~ msgstr "%d %B، %l\\u2236%M %p"
#~ 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>"
@@ -1784,6 +1760,14 @@ msgstr "أغلق المستخدم مربع الاستيثاق الحِواري"
#~ 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> "
#~ 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 "Settings Menu" #~ msgid "Settings Menu"
#~ msgstr "قائمة الإعدادات" #~ msgstr "قائمة الإعدادات"

316
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: 2014-04-30 19:59+0000\n" "POT-Creation-Date: 2014-02-22 08:29+0000\n"
"PO-Revision-Date: 2012-10-16 12:05+0300\n" "PO-Revision-Date: 2012-10-16 12:05+0300\n"
"Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n" "Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n" "Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
@@ -107,8 +107,8 @@ msgid ""
msgstr "" msgstr ""
"Абалонка GNOME запусціць толькі тыя пашырэнні, аўтары якіх сцвярджаюць, што " "Абалонка GNOME запусціць толькі тыя пашырэнні, аўтары якіх сцвярджаюць, што "
"яны працуюць з бягучай версіяй абалонкі. Уключэнне гэтай настройкі выключыць " "яны працуюць з бягучай версіяй абалонкі. Уключэнне гэтай настройкі выключыць "
"гэту праверку, і для ўсіх пашырэнняў будзе ажыццёўлена спроба загрузкі " "гэту праверку, і для ўсіх пашырэнняў будзе ажыццёўлена спроба загрузкі незалежна ад "
"незалежна ад сцвярджэнняў іх аўтараў." "сцвярджэнняў іх аўтараў."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
@@ -228,17 +228,10 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed " "Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', " "to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS " "'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what GeoClue will " "receiver). Please keep in mind that this only controls what Geoclue will "
"allow applications to see and they can find user's location on their own " "allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)." "using network resources (albeit with street-level accuracy at best)."
msgstr "" msgstr ""
"Настройка максімальнай дакладнасці вызначэння месцапалажэння, даступнай праграмам. "
"Магчымыя значэнні: \"off\" (выключыць вызначэнне месцапалажэння), \"country\" (краіна), "
"\"city\" (горад), \"neighborhood\" (раён), \"street\" (вуліца) і \"exact\" (дэталёва, "
"звычайна патрабуе GPS-прыёмнік). Увага: гэта настройка вызначае толькі тое, што "
"даступна праграмам з дапамогай службы GeoClue, але яны могуць самастойна вызначаць "
"месцапалажэнне з дапамогай спецыяльных сеціўных рэсурсаў (праўда, максімальная дакладнасць "
"такіх рэсурсаў - назва вуліцы)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode." msgid "The application icon mode."
@@ -295,8 +288,7 @@ msgstr ""
#: ../js/extensionPrefs/main.js:127 #: ../js/extensionPrefs/main.js:127
#, javascript-format #, javascript-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
msgstr "" msgstr "Падчас спробы загрузкі дыялогавага акенца настроек для %s адбылася памылка:"
"Падчас спробы загрузкі дыялогавага акенца настроек для %s адбылася памылка:"
#: ../js/extensionPrefs/main.js:167 #: ../js/extensionPrefs/main.js:167
msgid "Extension" msgid "Extension"
@@ -311,7 +303,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429 #: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878 #: ../js/ui/status/network.js:883
msgid "Cancel" msgid "Cancel"
msgstr "Скасаваць" msgstr "Скасаваць"
@@ -329,25 +321,25 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Увайсці" msgstr "Увайсці"
#: ../js/gdm/loginDialog.js:271 #: ../js/gdm/loginDialog.js:270
msgid "Choose Session" msgid "Choose Session"
msgstr "Выбар сеанса" msgstr "Выбар сеанса"
#: ../js/gdm/loginDialog.js:431 #: ../js/gdm/loginDialog.js:430
msgid "Not listed?" msgid "Not listed?"
msgstr "Няма ў спісе?" msgstr "Няма ў спісе?"
#: ../js/gdm/loginDialog.js:614 #: ../js/gdm/loginDialog.js:598
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(напр., карыстальнік ці %s)" msgstr "(напр., карыстальнік ці %s)"
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262 #: ../js/gdm/loginDialog.js:603 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280 #: ../js/ui/components/networkAgent.js:280
msgid "Username: " msgid "Username: "
msgstr "Імя карыстальніка: " msgstr "Імя карыстальніка: "
#: ../js/gdm/loginDialog.js:920 #: ../js/gdm/loginDialog.js:868
msgid "Login Window" msgid "Login Window"
msgstr "Акно ўваходу" msgstr "Акно ўваходу"
@@ -372,27 +364,27 @@ msgstr "Не ўдалося разабраць загад:"
msgid "Execution of “%s” failed:" msgid "Execution of “%s” failed:"
msgstr "Не ўдалося выканаць \"%s\":" msgstr "Не ўдалося выканаць \"%s\":"
#: ../js/ui/appDisplay.js:636 #: ../js/ui/appDisplay.js:629
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Тут размешчаныя часта ўжываныя праграмы" msgstr "Тут размешчаныя часта ўжываныя праграмы"
#: ../js/ui/appDisplay.js:747 #: ../js/ui/appDisplay.js:740
msgid "Frequent" msgid "Frequent"
msgstr "Часта" msgstr "Часта"
#: ../js/ui/appDisplay.js:754 #: ../js/ui/appDisplay.js:747
msgid "All" msgid "All"
msgstr "Усе" msgstr "Усе"
#: ../js/ui/appDisplay.js:1566 #: ../js/ui/appDisplay.js:1552
msgid "New Window" msgid "New Window"
msgstr "Новае акно" msgstr "Новае акно"
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285 #: ../js/ui/appDisplay.js:1574 ../js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Выдаліць са спіса ўпадабанага" msgstr "Выдаліць са спіса ўпадабанага"
#: ../js/ui/appDisplay.js:1594 #: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Дадаць у спіс упадабанага" msgstr "Дадаць у спіс упадабанага"
@@ -535,44 +527,44 @@ msgstr "Сб"
msgid "calendar:MY" msgid "calendar:MY"
msgstr "calendar:MY" msgstr "calendar:MY"
#: ../js/ui/calendar.js:450 #: ../js/ui/calendar.js:446
msgid "Previous month" msgid "Previous month"
msgstr "Папярэдні месяц" msgstr "Папярэдні месяц"
#: ../js/ui/calendar.js:460 #: ../js/ui/calendar.js:456
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:772 #: ../js/ui/calendar.js:762
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:790 #: ../js/ui/calendar.js:780
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:793 #: ../js/ui/calendar.js:783
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d %B, %Y" msgstr "%A, %d %B, %Y"
#: ../js/ui/calendar.js:804 #: ../js/ui/calendar.js:794
msgid "Today" msgid "Today"
msgstr "Сёння" msgstr "Сёння"
#: ../js/ui/calendar.js:808 #: ../js/ui/calendar.js:798
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Заўтра" msgstr "Заўтра"
#: ../js/ui/calendar.js:819 #: ../js/ui/calendar.js:809
msgid "This week" msgid "This week"
msgstr "На гэтым тыдні" msgstr "На гэтым тыдні"
#: ../js/ui/calendar.js:827 #: ../js/ui/calendar.js:817
msgid "Next week" msgid "Next week"
msgstr "На наступным тыдні" msgstr "На наступным тыдні"
@@ -605,8 +597,8 @@ msgstr "Пароль:"
msgid "Type again:" msgid "Type again:"
msgstr "Паўтарыце пароль:" msgstr "Паўтарыце пароль:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881 #: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect" msgid "Connect"
msgstr "Злучыць" msgstr "Злучыць"
@@ -813,13 +805,13 @@ msgstr "Удзельнік %s запрашае вас далучыцца да %s
#: ../js/ui/components/telepathyClient.js:1164 #: ../js/ui/components/telepathyClient.js:1164
#: ../js/ui/components/telepathyClient.js:1199 #: ../js/ui/components/telepathyClient.js:1199
#: ../js/ui/components/telepathyClient.js:1233 #: ../js/ui/components/telepathyClient.js:1233
#: ../js/ui/components/telepathyClient.js:1291 #: ../js/ui/components/telepathyClient.js:1290
msgid "Decline" msgid "Decline"
msgstr "Адмовіцца" msgstr "Адмовіцца"
#: ../js/ui/components/telepathyClient.js:1170 #: ../js/ui/components/telepathyClient.js:1170
#: ../js/ui/components/telepathyClient.js:1239 #: ../js/ui/components/telepathyClient.js:1239
#: ../js/ui/components/telepathyClient.js:1296 #: ../js/ui/components/telepathyClient.js:1295
msgid "Accept" msgid "Accept"
msgstr "Прыняць" msgstr "Прыняць"
@@ -856,97 +848,97 @@ msgstr "%s пасылае вам %s"
msgid "%s would like permission to see when you are online" msgid "%s would like permission to see when you are online"
msgstr "%s просіць дазволу на прагляд вашага сеткавага стану" msgstr "%s просіць дазволу на прагляд вашага сеткавага стану"
#: ../js/ui/components/telepathyClient.js:1342 #: ../js/ui/components/telepathyClient.js:1341
msgid "Network error" msgid "Network error"
msgstr "Сеткавая памылка" msgstr "Сеткавая памылка"
#: ../js/ui/components/telepathyClient.js:1344 #: ../js/ui/components/telepathyClient.js:1343
msgid "Authentication failed" msgid "Authentication failed"
msgstr "Няўдалая ідэнтыфікацыя" msgstr "Няўдалая ідэнтыфікацыя"
#: ../js/ui/components/telepathyClient.js:1346 #: ../js/ui/components/telepathyClient.js:1345
msgid "Encryption error" msgid "Encryption error"
msgstr "Памылка шыфравання" msgstr "Памылка шыфравання"
#: ../js/ui/components/telepathyClient.js:1348 #: ../js/ui/components/telepathyClient.js:1347
msgid "Certificate not provided" msgid "Certificate not provided"
msgstr "Сертыфікат не пададзены" msgstr "Сертыфікат не пададзены"
#: ../js/ui/components/telepathyClient.js:1350 #: ../js/ui/components/telepathyClient.js:1349
msgid "Certificate untrusted" msgid "Certificate untrusted"
msgstr "Сертыфікат не заслугоўвае даверу" msgstr "Сертыфікат не заслугоўвае даверу"
#: ../js/ui/components/telepathyClient.js:1352 #: ../js/ui/components/telepathyClient.js:1351
msgid "Certificate expired" msgid "Certificate expired"
msgstr "Сертыфікат састарэў" msgstr "Сертыфікат састарэў"
#: ../js/ui/components/telepathyClient.js:1354 #: ../js/ui/components/telepathyClient.js:1353
msgid "Certificate not activated" msgid "Certificate not activated"
msgstr "Сертыфікат не актывізаваны" msgstr "Сертыфікат не актывізаваны"
#: ../js/ui/components/telepathyClient.js:1356 #: ../js/ui/components/telepathyClient.js:1355
msgid "Certificate hostname mismatch" msgid "Certificate hostname mismatch"
msgstr "Назва камп'ютара ў сертыфікаце не адпавядае патрэбнай" msgstr "Назва камп'ютара ў сертыфікаце не адпавядае патрэбнай"
#: ../js/ui/components/telepathyClient.js:1358 #: ../js/ui/components/telepathyClient.js:1357
msgid "Certificate fingerprint mismatch" msgid "Certificate fingerprint mismatch"
msgstr "Адбітак сертыфіката не адпавядае патрэбнаму" msgstr "Адбітак сертыфіката не адпавядае патрэбнаму"
#: ../js/ui/components/telepathyClient.js:1360 #: ../js/ui/components/telepathyClient.js:1359
msgid "Certificate self-signed" msgid "Certificate self-signed"
msgstr "Сертыфікат уласнаручна падпісаны" msgstr "Сертыфікат уласнаручна падпісаны"
#: ../js/ui/components/telepathyClient.js:1362 #: ../js/ui/components/telepathyClient.js:1361
msgid "Status is set to offline" msgid "Status is set to offline"
msgstr "Уключаны рэжым па-за сеткай" msgstr "Уключаны рэжым па-за сеткай"
#: ../js/ui/components/telepathyClient.js:1364 #: ../js/ui/components/telepathyClient.js:1363
msgid "Encryption is not available" msgid "Encryption is not available"
msgstr "Шыфраванне недаступнае" msgstr "Шыфраванне недаступнае"
#: ../js/ui/components/telepathyClient.js:1366 #: ../js/ui/components/telepathyClient.js:1365
msgid "Certificate is invalid" msgid "Certificate is invalid"
msgstr "Хібны сертыфікат" msgstr "Хібны сертыфікат"
#: ../js/ui/components/telepathyClient.js:1368 #: ../js/ui/components/telepathyClient.js:1367
msgid "Connection has been refused" msgid "Connection has been refused"
msgstr "Адмоўлена ў злучэнні" msgstr "Адмоўлена ў злучэнні"
#: ../js/ui/components/telepathyClient.js:1370 #: ../js/ui/components/telepathyClient.js:1369
msgid "Connection can't be established" msgid "Connection can't be established"
msgstr "Не ўдалося ўсталяваць злучэнне" msgstr "Не ўдалося ўсталяваць злучэнне"
#: ../js/ui/components/telepathyClient.js:1372 #: ../js/ui/components/telepathyClient.js:1371
msgid "Connection has been lost" msgid "Connection has been lost"
msgstr "Злучэнне страчана" msgstr "Злучэнне страчана"
#: ../js/ui/components/telepathyClient.js:1374 #: ../js/ui/components/telepathyClient.js:1373
msgid "This account is already connected to the server" msgid "This account is already connected to the server"
msgstr "Гэты конт ужо злучаны з серверам" msgstr "Гэты конт ужо злучаны з серверам"
#: ../js/ui/components/telepathyClient.js:1376 #: ../js/ui/components/telepathyClient.js:1375
msgid "" msgid ""
"Connection has been replaced by a new connection using the same resource" "Connection has been replaced by a new connection using the same resource"
msgstr "Злучэнне заменена новым для таго ж самага рэсурсу" msgstr "Злучэнне заменена новым для таго ж самага рэсурсу"
#: ../js/ui/components/telepathyClient.js:1378 #: ../js/ui/components/telepathyClient.js:1377
msgid "The account already exists on the server" msgid "The account already exists on the server"
msgstr "Такі конт ужо існуе на серверы" msgstr "Такі конт ужо існуе на серверы"
#: ../js/ui/components/telepathyClient.js:1380 #: ../js/ui/components/telepathyClient.js:1379
msgid "Server is currently too busy to handle the connection" msgid "Server is currently too busy to handle the connection"
msgstr "Сервер надта заняты і не можа абслужыць гэта злучэнне" msgstr "Сервер надта заняты і не можа абслужыць гэта злучэнне"
#: ../js/ui/components/telepathyClient.js:1382 #: ../js/ui/components/telepathyClient.js:1381
msgid "Certificate has been revoked" msgid "Certificate has been revoked"
msgstr "Сертыфікат быў адкліканы" msgstr "Сертыфікат быў адкліканы"
#: ../js/ui/components/telepathyClient.js:1384 #: ../js/ui/components/telepathyClient.js:1383
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "Для сертыфіката выкарыстаны слабы або небяспечны алгарытм шыфравання" msgstr "Для сертыфіката выкарыстаны слабы або небяспечны алгарытм шыфравання"
#: ../js/ui/components/telepathyClient.js:1386 #: ../js/ui/components/telepathyClient.js:1385
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"
@@ -954,22 +946,22 @@ msgstr ""
"Даўжыня сертыфіката сервера або глыбіня яго ланцуга перавышае абмежаванне, " "Даўжыня сертыфіката сервера або глыбіня яго ланцуга перавышае абмежаванне, "
"выстаўленае крыптаграфічнай бібліятэкай" "выстаўленае крыптаграфічнай бібліятэкай"
#: ../js/ui/components/telepathyClient.js:1388 #: ../js/ui/components/telepathyClient.js:1387
msgid "Internal error" 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:1398 #: ../js/ui/components/telepathyClient.js:1397
#, javascript-format #, javascript-format
msgid "Unable to connect to %s" msgid "Unable to connect to %s"
msgstr "Не ўдалося злучыцца з %s" msgstr "Не ўдалося злучыцца з %s"
#: ../js/ui/components/telepathyClient.js:1403 #: ../js/ui/components/telepathyClient.js:1402
msgid "View account" msgid "View account"
msgstr "Праглядзець конт" msgstr "Праглядзець конт"
#: ../js/ui/components/telepathyClient.js:1440 #: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Невядомая прычына" msgstr "Невядомая прычына"
@@ -985,22 +977,22 @@ msgstr "Паказаць праграмы"
msgid "Dash" msgid "Dash"
msgstr "Прыборная дошка" msgstr "Прыборная дошка"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Адкрыць каляндар" msgstr "Адкрыць каляндар"
#: ../js/ui/dateMenu.js:95 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Адкрыць гадзіннікі" msgstr "Адкрыць гадзіннікі"
#: ../js/ui/dateMenu.js:102 #: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Настройкі даты і часу" msgstr "Настройкі даты і часу"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */ #. */
#: ../js/ui/dateMenu.js:192 #: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B, %Y" msgstr "%A, %e %B, %Y"
@@ -1116,9 +1108,7 @@ msgstr "Выключыць камп'ютар пасля ўсталявання
#: ../js/ui/endSessionDialog.js:315 #: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates." msgid "Running on battery power: please plug in before installing updates."
msgstr "" msgstr "Камп'ютар сілкуецца ад акумулятара: падлучыце да знешняй крыніцы энергіі перад усталяваннем абновак."
"Камп'ютар сілкуецца ад акумулятара: падлучыце да знешняй крыніцы энергіі "
"перад усталяваннем абновак."
#: ../js/ui/endSessionDialog.js:332 #: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
@@ -1153,26 +1143,25 @@ msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?
msgid "Keyboard" msgid "Keyboard"
msgstr "Клавіятура" msgstr "Клавіятура"
#: ../js/ui/lookingGlass.js:643 #: ../js/ui/lookingGlass.js:641
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:697 #: ../js/ui/lookingGlass.js:695
#, javascript-format #, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "%s не зрабіў ніякіх памылак." msgstr "%s не зрабіў ніякіх памылак."
#: ../js/ui/lookingGlass.js:703 #: ../js/ui/lookingGlass.js:701
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Хаваць памылкі" msgstr "Хаваць памылкі"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 #: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors" msgid "Show Errors"
msgstr "Паказваць памылкі" msgstr "Паказваць памылкі"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59 #: ../js/ui/lookingGlass.js:714
#: ../js/ui/status/location.js:167
msgid "Enabled" msgid "Enabled"
msgstr "Уключана" msgstr "Уключана"
@@ -1180,64 +1169,64 @@ msgstr "Уключана"
#. because it's disabled by rfkill (airplane mode) */ #. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164 #: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830 #: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Выключана" msgstr "Выключана"
#: ../js/ui/lookingGlass.js:721 #: ../js/ui/lookingGlass.js:719
msgid "Error" msgid "Error"
msgstr "Памылка" msgstr "Памылка"
#: ../js/ui/lookingGlass.js:723 #: ../js/ui/lookingGlass.js:721
msgid "Out of date" msgid "Out of date"
msgstr "Састарэла" msgstr "Састарэла"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:723
msgid "Downloading" msgid "Downloading"
msgstr "Сцягванне" msgstr "Сцягванне"
#: ../js/ui/lookingGlass.js:749 #: ../js/ui/lookingGlass.js:747
msgid "View Source" msgid "View Source"
msgstr "Паглядзець выточны код" msgstr "Паглядзець выточны код"
#: ../js/ui/lookingGlass.js:758 #: ../js/ui/lookingGlass.js:756
msgid "Web Page" msgid "Web Page"
msgstr "Сеціўная старонка" msgstr "Сеціўная старонка"
#: ../js/ui/messageTray.js:1326 #: ../js/ui/messageTray.js:1324
msgid "Open" msgid "Open"
msgstr "Адкрыць" msgstr "Адкрыць"
#: ../js/ui/messageTray.js:1333 #: ../js/ui/messageTray.js:1331
msgid "Remove" msgid "Remove"
msgstr "Выдаліць" msgstr "Выдаліць"
#: ../js/ui/messageTray.js:1630 #: ../js/ui/messageTray.js:1628
msgid "Notifications" msgid "Notifications"
msgstr "Апавяшчэнні" msgstr "Апавяшчэнні"
#: ../js/ui/messageTray.js:1637 #: ../js/ui/messageTray.js:1635
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Ачысціць спіс апавяшчэнняў" msgstr "Ачысціць спіс апавяшчэнняў"
#: ../js/ui/messageTray.js:1656 #: ../js/ui/messageTray.js:1654
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Настройкі апавяшчэння" msgstr "Настройкі апавяшчэння"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Меню трэя" msgstr "Меню трэя"
#: ../js/ui/messageTray.js:1926 #: ../js/ui/messageTray.js:1924
msgid "No Messages" msgid "No Messages"
msgstr "Апавяшчэнні адсутнічаюць" msgstr "Апавяшчэнні адсутнічаюць"
#: ../js/ui/messageTray.js:1964 #: ../js/ui/messageTray.js:1962
msgid "Message Tray" msgid "Message Tray"
msgstr "Абшар апавяшчэнняў" msgstr "Абшар апавяшчэнняў"
#: ../js/ui/messageTray.js:2962 #: ../js/ui/messageTray.js:2946
msgid "System Information" msgid "System Information"
msgstr "Сістэмная інфармацыя" msgstr "Сістэмная інфармацыя"
@@ -1254,11 +1243,11 @@ msgstr[0] "%d новае паведамленне"
msgstr[1] "%d новыя паведамленні" msgstr[1] "%d новыя паведамленні"
msgstr[2] "%d новых паведамленняў" msgstr[2] "%d новых паведамленняў"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:83
msgid "Undo" msgid "Undo"
msgstr "Адрабіць" msgstr "Адрабіць"
#: ../js/ui/overview.js:124 #: ../js/ui/overview.js:123
msgid "Overview" msgid "Overview"
msgstr "Агляд" msgstr "Агляд"
@@ -1266,7 +1255,7 @@ msgstr "Агляд"
#. 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:250 #: ../js/ui/overview.js:257
msgid "Type to search…" msgid "Type to search…"
msgstr "Увядзіце тэкст для пошуку..." msgstr "Увядзіце тэкст для пошуку..."
@@ -1310,27 +1299,27 @@ msgstr[0] "%d новае апавяшчэнне"
msgstr[1] "%d новыя апавяшчэнні" msgstr[1] "%d новыя апавяшчэнні"
msgstr[2] "%d новых апавяшчэнняў" msgstr[2] "%d новых апавяшчэнняў"
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342 #: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:342
msgid "Lock" msgid "Lock"
msgstr "Заблакіраваць" msgstr "Заблакіраваць"
#: ../js/ui/screenShield.js:708 #: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "GNOME патрабуе блакіравання экрана" msgstr "GNOME патрабуе блакіравання экрана"
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309 #: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1301
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Не ўдалося заблакіраваць" msgstr "Не ўдалося заблакіраваць"
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310 #: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1302
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Блакіраванне стрымана праграмай" msgstr "Блакіраванне стрымана праграмай"
#: ../js/ui/search.js:603 #: ../js/ui/search.js:589
msgid "Searching…" msgid "Searching…"
msgstr "Пошук..." msgstr "Пошук..."
#: ../js/ui/search.js:649 #: ../js/ui/search.js:632
msgid "No results." msgid "No results."
msgstr "Нічога не знойдзена." msgstr "Нічога не знойдзена."
@@ -1402,22 +1391,23 @@ msgstr "Высокая кантраснасць"
msgid "Large Text" msgid "Large Text"
msgstr "Буйны тэкст" msgstr "Буйны тэкст"
#: ../js/ui/status/bluetooth.js:49 #: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151 #: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234 #: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86 #: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/rfkill.js:114 #: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105
msgid "Turn Off" msgid "Turn Off"
msgstr "Выключыць" msgstr "Выключыць"
#: ../js/ui/status/bluetooth.js:54 #: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Настройкі Bluetooth" msgstr "Настройкі Bluetooth"
#: ../js/ui/status/bluetooth.js:104 #: ../js/ui/status/bluetooth.js:100
#, javascript-format #, javascript-format
msgid "%d Connected Device" msgid "%d Connected Device"
msgid_plural "%d Connected Devices" msgid_plural "%d Connected Devices"
@@ -1425,7 +1415,7 @@ msgstr[0] "%d злучанае прыстасаванне"
msgstr[1] "%d злучаныя прыстасаванні" msgstr[1] "%d злучаныя прыстасаванні"
msgstr[2] "%d злучаных прыстасаванняў" msgstr[2] "%d злучаных прыстасаванняў"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262 #: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
msgid "Not Connected" msgid "Not Connected"
msgstr "Няма злучэння" msgstr "Няма злучэння"
@@ -1437,167 +1427,156 @@ msgstr "Яркасць"
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Паказаць клавіятурную раскладку" msgstr "Паказаць клавіятурную раскладку"
#: ../js/ui/status/location.js:53 #: ../js/ui/status/location.js:52
msgid "Location" msgid "Location"
msgstr "Месцапалажэнне" msgstr "Месцапалажэнне"
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168 #: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
msgid "Disable" #: ../js/ui/status/rfkill.js:84
msgstr "Выключыць" msgid "On"
msgstr "Укл."
#: ../js/ui/status/location.js:165 #: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
msgid "Enable" #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgid "Off"
msgstr "Выключана"
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
msgid "Turn On"
msgstr "Уключыць" msgstr "Уключыць"
#: ../js/ui/status/location.js:167
msgid "In Use"
msgstr "Ужыта"
#: ../js/ui/status/network.js:74 #: ../js/ui/status/network.js:74
msgid "<unknown>" msgid "<unknown>"
msgstr "<невядома>" msgstr "<невядома>"
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
#: ../js/ui/status/network.js:1464
msgid "Off"
msgstr "Выключана"
#: ../js/ui/status/network.js:422
msgid "Connected"
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:426 #: ../js/ui/status/network.js:431
msgid "unmanaged" msgid "unmanaged"
msgstr "непадкантрольна" msgstr "непадкантрольна"
#: ../js/ui/status/network.js:428 #: ../js/ui/status/network.js:433
msgid "disconnecting..." msgid "disconnecting..."
msgstr "адлучэнне..." msgstr "адлучэнне..."
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362 #: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
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:437 ../js/ui/status/network.js:1365 #: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
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:445 #: ../js/ui/status/network.js:450
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:449 #: ../js/ui/status/network.js:454
msgid "unavailable" msgid "unavailable"
msgstr "недаступна" msgstr "недаступна"
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367 #: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
msgid "connection failed" msgid "connection failed"
msgstr "не ўдалося злучыцца" msgstr "не ўдалося злучыцца"
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:472
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Настройкі праваднога злучэння" msgstr "Настройкі праваднога злучэння"
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587 #: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Настройкі мабільнага злучэння" msgstr "Настройкі мабільнага злучэння"
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258 #: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
msgid "Hardware Disabled" msgid "Hardware Disabled"
msgstr "Прыстасаванне выключана" msgstr "Прыстасаванне выключана"
#: ../js/ui/status/network.js:595 #: ../js/ui/status/network.js:600
msgid "Use as Internet connection" msgid "Use as Internet connection"
msgstr "Ужыць для злучэння з Інтэрнэтам" msgstr "Ужыць для злучэння з Інтэрнэтам"
#: ../js/ui/status/network.js:776 #: ../js/ui/status/network.js:781
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Рэжым самалёта ўключаны" msgstr "Рэжым самалёта ўключаны"
#: ../js/ui/status/network.js:777 #: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "У рэжыме самалёта выключаецца Wi-Fi." msgstr "У рэжыме самалёта выключаецца Wi-Fi."
#: ../js/ui/status/network.js:778 #: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Выключыць рэжым самалёта" msgstr "Выключыць рэжым самалёта"
#: ../js/ui/status/network.js:787 #: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Wi-Fi выключаны" msgstr "Wi-Fi выключаны"
#: ../js/ui/status/network.js:788 #: ../js/ui/status/network.js:793
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Каб злучыцца з сеткай, спачатку трэба ўключыць Wi-Fi." msgstr "Каб злучыцца з сеткай, спачатку трэба ўключыць Wi-Fi."
#: ../js/ui/status/network.js:789 #: ../js/ui/status/network.js:794
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Уключыць Wi-Fi" msgstr "Уключыць Wi-Fi"
#: ../js/ui/status/network.js:814 #: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Сеткі Wi-Fi" msgstr "Сеткі Wi-Fi"
#: ../js/ui/status/network.js:816 #: ../js/ui/status/network.js:821
msgid "Select a network" msgid "Select a network"
msgstr "Выберыце сетку" msgstr "Выберыце сетку"
#: ../js/ui/status/network.js:845 #: ../js/ui/status/network.js:850
msgid "No Networks" msgid "No Networks"
msgstr "Няма сетак" msgstr "Няма сетак"
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112 #: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Задзейнічаць апаратны выключальнік" msgstr "Задзейнічаць апаратны выключальнік"
#: ../js/ui/status/network.js:1136 #: ../js/ui/status/network.js:1141
msgid "Select Network" msgid "Select Network"
msgstr "Выбраць сетку" msgstr "Выбраць сетку"
#: ../js/ui/status/network.js:1142 #: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Настройкі Wi-Fi" msgstr "Настройкі Wi-Fi"
#: ../js/ui/status/network.js:1234 #: ../js/ui/status/network.js:1252
msgid "Turn On"
msgstr "Уключыць"
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active" msgid "Hotspot Active"
msgstr "Хотспот уключаны" msgstr "Хотспот уключаны"
#: ../js/ui/status/network.js:1254 #: ../js/ui/status/network.js:1255
msgid "Connecting" msgid "Connecting"
msgstr "Злучэнне" msgstr "Злучэнне"
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89 #: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
msgid "Network Settings" msgid "Network Settings"
msgstr "Сеткавыя настройкі" msgstr "Сеткавыя настройкі"
#: ../js/ui/status/network.js:1435 #: ../js/ui/status/network.js:1436
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Настройкі VPN" msgstr "Настройкі VPN"
#: ../js/ui/status/network.js:1454 #: ../js/ui/status/network.js:1455
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1607 #: ../js/ui/status/network.js:1598
msgid "Network Manager" msgid "Network Manager"
msgstr "Сеткавы кіраўнік" msgstr "Сеткавы кіраўнік"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1637
msgid "Connection failed" msgid "Connection failed"
msgstr "Не ўдалося злучыцца" msgstr "Не ўдалося злучыцца"
#: ../js/ui/status/network.js:1647 #: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Не ўдалося ўключыць сеткавае злучэнне" msgstr "Не ўдалося ўключыць сеткавае злучэнне"
@@ -1631,14 +1610,10 @@ msgstr "UPS"
msgid "Battery" msgid "Battery"
msgstr "Батарэя" msgstr "Батарэя"
#: ../js/ui/status/rfkill.js:83 #: ../js/ui/status/rfkill.js:82
msgid "Airplane Mode" msgid "Airplane Mode"
msgstr "Рэжым самалёта" msgstr "Рэжым самалёта"
#: ../js/ui/status/rfkill.js:85
msgid "On"
msgstr "Укл."
#: ../js/ui/status/system.js:314 #: ../js/ui/status/system.js:314
msgid "Switch User" msgid "Switch User"
msgstr "Перамяніць карыстальніка" msgstr "Перамяніць карыстальніка"
@@ -1775,3 +1750,4 @@ 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 "Карыстальнік праігнараваў дыялогавае акенца ідэнтыфікацыі"

982
po/ca.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

614
po/cs.po

File diff suppressed because it is too large Load Diff

1039
po/da.po

File diff suppressed because it is too large Load Diff

606
po/de.po

File diff suppressed because it is too large Load Diff

341
po/el.po
View File

@@ -7,8 +7,8 @@ msgstr ""
"Project-Id-Version: gnome-shell.po.master\n" "Project-Id-Version: gnome-shell.po.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n" "shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-03-27 21:19+0000\n" "POT-Creation-Date: 2014-02-19 23:39+0000\n"
"PO-Revision-Date: 2014-03-28 08:41+0300\n" "PO-Revision-Date: 2014-02-20 08:18+0300\n"
"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n" "Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
"Language-Team: team@lists.gnome.gr\n" "Language-Team: team@lists.gnome.gr\n"
"Language: el\n" "Language: el\n"
@@ -47,7 +47,7 @@ msgstr "Άνοιγμα του μενού εφαρμογών"
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "Κέλυφος GNOME Shell" msgstr "GNOME Shell"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
#: ../data/gnome-shell-wayland.desktop.in.in.h:2 #: ../data/gnome-shell-wayland.desktop.in.in.h:2
@@ -57,21 +57,21 @@ 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:155 #: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extension Preferences" msgid "GNOME Shell Extension Preferences"
msgstr "Προτιμήσεις επεκτάσεων του κελύφους GNOME Shell" msgstr "Προτιμήσεις επεκτάσεων του GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2 #: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions" msgid "Configure GNOME Shell Extensions"
msgstr "Ρύθμιση επεκτάσεων του κελύφους GNOME Shell" msgstr "Ρύθμιση επεκτάσεων του GNOME Shell"
#: ../data/gnome-shell-wayland.desktop.in.in.h:1 #: ../data/gnome-shell-wayland.desktop.in.in.h:1
msgid "GNOME Shell (wayland compositor)" msgid "GNOME Shell (wayland compositor)"
msgstr "Κέλυφος GNOME Shell (συνθετητής wayland)" msgstr "GNOME Shell (συνθετητής wayland)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2" msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr "" msgstr ""
"Ενεργοποίηση εσωτερικών εργαλείων χρήσιμων για τους προγραμματιστές και τους " "Ενεργοποίηση εσωτερικών εργαλείων χρήσιμων για τους προγραμματιστές και τους "
"δοκιμαστές, με το Alt-F2" "δοκιμαστές με το Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid "" msgid ""
@@ -79,7 +79,7 @@ msgid ""
"dialog." "dialog."
msgstr "" msgstr ""
"Επιτρέπει την πρόσβαση σε εσωτερικά εργαλεία αποσφαλμάτωσης και " "Επιτρέπει την πρόσβαση σε εσωτερικά εργαλεία αποσφαλμάτωσης και "
"παρακολούθησης, με τη χρήση του διαλόγου Alt-F2." "παρακολούθησης με τη χρήση του διαλόγου Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "UUIDs of extensions to enable" msgid "UUIDs of extensions to enable"
@@ -92,10 +92,10 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and " "list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell." "DisableExtension D-Bus methods on org.gnome.Shell."
msgstr "" msgstr ""
"Οι επεκτάσεις του κελύφους GNOME έχουν μια ιδιότητα UUID. Αυτό το κλειδί " "Η επεκτάσεις του κελύφους GNOME έχουν μια ιδιότητα UUID· αυτό το κλειδί "
"εμφανίζει τις επεκτάσεις που πρέπει να φορτωθούν. Οποιαδήποτε επέκταση που " "εμφανίζει τις επεκτάσεις που πρέπει να φορτωθούν. Οποιαδήποτε επέκταση που "
"επιθυμεί να φορτωθεί πρέπει να είναι στον κατάλογο. Μπορείτε ακόμη να " "επιθυμεί να φορτωθεί πρέπει να είναι στον κατάλογο. Μπορείτε ακόμη να "
"χειρισθείτε αυτόν τον κατάλογο με τις μεθόδους διαύλου δεδομένων " "χειριστείτε αυτόν τον κατάλογο με τις μεθόδους διαύλου δεδομένων "
"EnableExtension and DisableExtension στο org.gnome.Shell." "EnableExtension and DisableExtension στο org.gnome.Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
@@ -152,7 +152,7 @@ msgid ""
"Whether to remember password for mounting encrypted or remote filesystems" "Whether to remember password for mounting encrypted or remote filesystems"
msgstr "" msgstr ""
"Εάν θα θυμάται τον κωδικό πρόσβασης για προσάρτηση κρυπτογραφημένων ή " "Εάν θα θυμάται τον κωδικό πρόσβασης για προσάρτηση κρυπτογραφημένων ή "
"απομεμακρυσμένων συστημάτων αρχείων" "απομακρυσμένων συστημάτων αρχείων"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid "" msgid ""
@@ -161,9 +161,9 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default " "'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox." "state of the checkbox."
msgstr "" msgstr ""
"Το κέλυφος θα ζητήσει έναν κωδικό όταν προσαρτάται μια κρυπτογραφημένη " "Το κέλυφος θα ζητήσει έναν κωδικό όταν μια κρυπτογραφημένη συσκευή ή ένα "
"συσκευή ή ένα απομεμακρυσμένο σύστημα αρχείων. Εάν ο κωδικός μπορεί να " "απομακρυσμένο σύστημα αρχείων προσαρτάται. Εάν ο κωδικός μπορεί να "
"αποθηκευθεί για μελλοντική χρήση, θα παρουσιάζεται ένα πλαίσιο ελέγχου 'Να " "αποθηκευτεί για μελλοντική χρήση θα παρουσιάζεται ένα πλαίσιο ελέγχου 'Να "
"μην απαιτείται ο κωδικός πρόσβασης'. Αυτό το κλειδί ορίζει την προεπιλεγμένη " "μην απαιτείται ο κωδικός πρόσβασης'. Αυτό το κλειδί ορίζει την προεπιλεγμένη "
"κατάσταση του πλαισίου ελέγχου." "κατάσταση του πλαισίου ελέγχου."
@@ -174,7 +174,7 @@ msgstr "Εμφάνιση του αριθμού εβδομάδας στο ημε
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr ""
"Αν true, εμφανίζει τον αριθμό εβδομάδας σύμφωνα με το ISO στο ημερολόγιο." "Αν αληθές, εμφανίζει τον αριθμό εβδομάδας σύμφωνα με το ISO στο ημερολόγιο."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu" msgid "Keybinding to open the application menu"
@@ -236,17 +236,17 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed " "Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', " "to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS " "'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what GeoClue will " "receiver). Please keep in mind that this only controls what Geoclue will "
"allow applications to see and they can find user's location on their own " "allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)." "using network resources (albeit with street-level accuracy at best)."
msgstr "" msgstr ""
"Ρυθμίζει το μέγιστο επίπεδο ακρίβειας στην εντόπιση θέσης το οποίο " "Ρυθμίζει το μέγιστο επίπεδο των εφαρμογών ακρίβειας της θέσης που "
"επιτρέπεται να βλέπουν οι εφαρμογές. Οι έγκυρες επιλογές είναι " "επιτρέπεται να δείτε. Οι έγκυρες επιλογές είναι 'όχι' (απενεργοποίηση "
"'όχι' (απενεργοποίηση εντοπισμού θέσης), 'χώρα', 'πόλη', 'γειτονιά', 'οδός' " "εντοπισμού θέσης), 'χώρα', 'πόλη', 'γειτονιά', 'οδός' και 'ακριβώς' (απαιτεί "
"και 'ακριβώς' (τυπικά, απαιτεί δέκτη GPS). Παρακαλούμε να θυμάστε ότι αυτό " "τυπικά δέκτη GPS). Παρακαλούμε να θυμόσαστε ότι αυτό ελέγχει μόνο τι θα "
λέγχει μόνο τι θα επιτρέπει το Geoclue να βλέπουν οι εφαρμογές, ενώ αυτές " πιτρέψει στις εφαρμογές το Geoclue να δείτε και μπορούν να βρουν τη θέση "
"μπορούν να βρουν τη θέση του χρήστη και από μόνες τους, χρησιμοποιώντας " "του χρήστη από μόνες τους χρησιμοποιώντας πόρους δικτύου (αν και με ακρίβεια "
"πόρους δικτύου (αν και, στην καλύτερη περίπτωση, με ακρίβεια επιπέδου οδού)." "επιπέδου οδού στην καλύτερη περίπτωση)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31 #: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode." msgid "The application icon mode."
@@ -258,7 +258,7 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-" "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'." "only' (shows only the application icon) or 'both'."
msgstr "" msgstr ""
"Διαμορφώνει πώς θα εμφανίζονται τα παράθυρα κατά την εναλλαγή των παραθύρων. " "Διαμορφώνει πώς τα παράθυρα θα εμφανίζονται στην εναλλαγή των παραθύρων. "
"Έγκυρες ρυθμίσεις είναι 'thumbnail-only' (εμφανίζει μια μικρογραφία του " "Έγκυρες ρυθμίσεις είναι 'thumbnail-only' (εμφανίζει μια μικρογραφία του "
"παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή " "παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή "
"'both' - και τα δύο." "'both' - και τα δύο."
@@ -271,8 +271,8 @@ msgstr "Προσάρτηση αποκλειστικού διαλόγου στο
msgid "" msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell." "This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr "" msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.mutter όταν " "Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.mutter όταν εκτελείται "
"εκτελείται το GNOME Shell." "το GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35 #: ../data/org.gnome.shell.gschema.xml.in.in.h:35
msgid "Arrangement of buttons on the titlebar" msgid "Arrangement of buttons on the titlebar"
@@ -283,18 +283,18 @@ msgid ""
"This key overrides the key in org.gnome.desktop.wm.preferences when running " "This key overrides the key in org.gnome.desktop.wm.preferences when running "
"GNOME Shell." "GNOME Shell."
msgstr "" msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.desktop.wm." "Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.desktop.wm.preferences "
"preferences όταν εκτελείται το GNOME Shell." "όταν εκτελείται το GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37 #: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Enable edge tiling when dropping windows on screen edges" msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "" msgstr ""
"Ενεργοποίηση της προσάρτησης άκρων, όταν αφήνετε παράθυρα στις άκρες της " "Ενεργοποίηση της προσάρτηση άκρων, όταν αφήνετε παράθυρα στις άκρες της "
"οθόνης" "οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38 #: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Workspaces are managed dynamically" msgid "Workspaces are managed dynamically"
msgstr "Η διαχείριση των χώρων γίνεται δυναμικά" msgstr "Οι χώροι εργασίας διαχειρίζονται δυναμικά"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39 #: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "Workspaces only on primary monitor" msgid "Workspaces only on primary monitor"
@@ -310,8 +310,8 @@ msgstr ""
#, javascript-format #, javascript-format
msgid "There was an error loading the preferences dialog for %s:" msgid "There was an error loading the preferences dialog for %s:"
msgstr "" msgstr ""
"Προέκυψε ένα σφάλμα κατά τη φόρτωση του παραθύρου διαλόγου των προτιμήσεων " "Προέκυψε ένα σφάλμα στη φόρτωση του παραθύρου διαλόγου των προτιμήσεων για "
"για %s:" "%s:"
#: ../js/extensionPrefs/main.js:167 #: ../js/extensionPrefs/main.js:167
msgid "Extension" msgid "Extension"
@@ -326,7 +326,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429 #: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878 #: ../js/ui/status/network.js:883
msgid "Cancel" msgid "Cancel"
msgstr "Ακύρωση" msgstr "Ακύρωση"
@@ -344,25 +344,25 @@ msgctxt "button"
msgid "Sign In" msgid "Sign In"
msgstr "Σύνδεση" msgstr "Σύνδεση"
#: ../js/gdm/loginDialog.js:271 #: ../js/gdm/loginDialog.js:270
msgid "Choose Session" msgid "Choose Session"
msgstr "Επιλογή συνεδρίας" msgstr "Επιλογή συνεδρίας"
#: ../js/gdm/loginDialog.js:431 #: ../js/gdm/loginDialog.js:430
msgid "Not listed?" msgid "Not listed?"
msgstr "Δεν είστε στη λίστα;" msgstr "Δεν είστε στη λίστα;"
#: ../js/gdm/loginDialog.js:611 #: ../js/gdm/loginDialog.js:598
#, javascript-format #, javascript-format
msgid "(e.g., user or %s)" msgid "(e.g., user or %s)"
msgstr "(π.χ., χρήστης ή %s)" msgstr "(π.χ., χρήστης ή %s)"
#: ../js/gdm/loginDialog.js:616 ../js/ui/components/networkAgent.js:262 #: ../js/gdm/loginDialog.js:603 ../js/ui/components/networkAgent.js:262
#: ../js/ui/components/networkAgent.js:280 #: ../js/ui/components/networkAgent.js:280
msgid "Username: " msgid "Username: "
msgstr "Όνομα χρήστη: " msgstr "Όνομα χρήστη: "
#: ../js/gdm/loginDialog.js:917 #: ../js/gdm/loginDialog.js:868
msgid "Login Window" msgid "Login Window"
msgstr "Παράθυρο σύνδεσης" msgstr "Παράθυρο σύνδεσης"
@@ -380,34 +380,34 @@ msgstr "Δε βρέθηκε η εντολή"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:148
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "Δεν ήταν δυνατό να γίνει ανάλυση της εντολής:" msgstr "Δεν ήταν δυνατό να επεξεργαστεί η εντολή:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:156
#, javascript-format #, javascript-format
msgid "Execution of “%s” failed:" msgid "Execution of “%s” failed:"
msgstr "Η εκτέλεση του “%s” απέτυχε:" msgstr "Η εκτέλεση του “%s” απέτυχε:"
#: ../js/ui/appDisplay.js:636 #: ../js/ui/appDisplay.js:629
msgid "Frequently used applications will appear here" msgid "Frequently used applications will appear here"
msgstr "Οι πιο συχνά χρησιμοποιούμενες εφαρμογές θα εμφανιστούν εδώ" msgstr "Οι συχνά χρησιμοποιούμενες εφαρμογές θα εμφανιστούν εδώ"
#: ../js/ui/appDisplay.js:747 #: ../js/ui/appDisplay.js:740
msgid "Frequent" msgid "Frequent"
msgstr "Συχνά" msgstr "Συχνά"
#: ../js/ui/appDisplay.js:754 #: ../js/ui/appDisplay.js:747
msgid "All" msgid "All"
msgstr "Όλα" msgstr "Όλα"
#: ../js/ui/appDisplay.js:1566 #: ../js/ui/appDisplay.js:1552
msgid "New Window" msgid "New Window"
msgstr "Νέο παράθυρο" msgstr "Νέο παράθυρο"
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285 #: ../js/ui/appDisplay.js:1574 ../js/ui/dash.js:285
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Αφαίρεση από τα αγαπημένα" msgstr "Αφαίρεση από τα αγαπημένα"
#: ../js/ui/appDisplay.js:1594 #: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Προσθήκη στα αγαπημένα" msgstr "Προσθήκη στα αγαπημένα"
@@ -550,44 +550,44 @@ msgstr "Σα"
msgid "calendar:MY" msgid "calendar:MY"
msgstr "ημερολόγιο:MY" msgstr "ημερολόγιο:MY"
#: ../js/ui/calendar.js:450 #: ../js/ui/calendar.js:446
msgid "Previous month" msgid "Previous month"
msgstr "Προηγούμενος μήνας" msgstr "Προηγούμενος μήνας"
#: ../js/ui/calendar.js:460 #: ../js/ui/calendar.js:456
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:772 #: ../js/ui/calendar.js:762
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:790 #: ../js/ui/calendar.js:780
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %B %d"
#. 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:793 #: ../js/ui/calendar.js:783
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y" msgstr "%A, %B %d, %Y"
#: ../js/ui/calendar.js:804 #: ../js/ui/calendar.js:794
msgid "Today" msgid "Today"
msgstr "Σήμερα" msgstr "Σήμερα"
#: ../js/ui/calendar.js:808 #: ../js/ui/calendar.js:798
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Αύριο" msgstr "Αύριο"
#: ../js/ui/calendar.js:819 #: ../js/ui/calendar.js:809
msgid "This week" msgid "This week"
msgstr "Αυτή η εβδομάδα" msgstr "Αυτή η εβδομάδα"
#: ../js/ui/calendar.js:827 #: ../js/ui/calendar.js:817
msgid "Next week" msgid "Next week"
msgstr "Επόμενη εβδομάδα" msgstr "Επόμενη εβδομάδα"
@@ -620,8 +620,8 @@ msgstr "Κωδικός:"
msgid "Type again:" msgid "Type again:"
msgstr "Πληκτρολογήστε ξανά:" msgstr "Πληκτρολογήστε ξανά:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881 #: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect" msgid "Connect"
msgstr "Σύνδεση" msgstr "Σύνδεση"
@@ -960,8 +960,8 @@ msgstr "Το πιστοποιητικό έχει ανακληθεί"
msgid "" msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak" "Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "" msgstr ""
"Το πιστοποιητικό χρησιμοποιεί έναν μη ασφαλή αλγόριθμο αποκρυπτογράφησης " "Το πιστοποιητικό χρησιμοποιεί ένα μη ασφαλή αλγόριθμο αποτυπώματος ή είναι "
"αποτυπώματος ή είναι κρυπτογραφικά ασθενές" "αδύναμο κρυπτογραφικά"
#: ../js/ui/components/telepathyClient.js:1385 #: ../js/ui/components/telepathyClient.js:1385
msgid "" msgid ""
@@ -987,7 +987,7 @@ msgstr "Αδυναμία σύνδεσης με %s"
msgid "View account" msgid "View account"
msgstr "Προβολή λογαριασμού" msgstr "Προβολή λογαριασμού"
#: ../js/ui/components/telepathyClient.js:1439 #: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason" msgid "Unknown reason"
msgstr "Άγνωστος λόγος" msgstr "Άγνωστος λόγος"
@@ -1003,24 +1003,24 @@ msgstr "Εμφάνιση εφαρμογών"
msgid "Dash" msgid "Dash"
msgstr "Ταμπλό" msgstr "Ταμπλό"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Άνοιγμα ημερολογίου" msgstr "Άνοιγμα ημερολογίου"
#: ../js/ui/dateMenu.js:95 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Άνοιγμα ρολογιών" msgstr "Άνοιγμα ρολογιών"
#: ../js/ui/dateMenu.js:102 #: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Ρυθμίσεις ημερομηνίας & ώρας" msgstr "Ρυθμίσεις ημερομηνίας & ώρας"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. */ #. */
#: ../js/ui/dateMenu.js:192 #: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y" msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66 #: ../js/ui/endSessionDialog.js:66
#, javascript-format #, javascript-format
@@ -1066,8 +1066,8 @@ msgstr "Εγκατάσταση ενημερώσεων & τερματισμός"
#, javascript-format #, 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] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτο." msgstr[0] "Το σύστημα θα τερματιστεί αυτόματα σε %d δευτερόλεπτο."
msgstr[1] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτα." msgstr[1] "Το σύστημα θα τερματιστεί αυτόματα σε %d δευτερόλεπτα."
#: ../js/ui/endSessionDialog.js:93 #: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox" msgctxt "checkbox"
@@ -1137,11 +1137,11 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:332 #: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work." msgid "Some applications are busy or have unsaved work."
msgstr "" msgstr ""
"Κάποιες εφαρμογές είναι απασχολημένες ή έχουν εργασία που δεν αποθηκεύθηκε." "Κάποιες εφαρμογές είναι απασχολημένες ή έχουν εργασία που δεν αποθηκεύτηκε."
#: ../js/ui/endSessionDialog.js:339 #: ../js/ui/endSessionDialog.js:339
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:618 #: ../js/ui/endSessionDialog.js:618
@@ -1168,26 +1168,25 @@ msgstr "Λήψη και εγκατάσταση του “%s” από το exten
msgid "Keyboard" msgid "Keyboard"
msgstr "Πληκτρολόγιο" msgstr "Πληκτρολόγιο"
#: ../js/ui/lookingGlass.js:643 #: ../js/ui/lookingGlass.js:641
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:697 #: ../js/ui/lookingGlass.js:695
#, javascript-format #, javascript-format
msgid "%s has not emitted any errors." msgid "%s has not emitted any errors."
msgstr "Το %s δεν έδωσε σφάλματα." msgstr "Το %s δεν έδωσε σφάλματα."
#: ../js/ui/lookingGlass.js:703 #: ../js/ui/lookingGlass.js:701
msgid "Hide Errors" msgid "Hide Errors"
msgstr "Απόκρυψη σφαλμάτων" msgstr "Απόκρυψη σφαλμάτων"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767 #: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors" msgid "Show Errors"
msgstr "Εμφάνιση σφαλμάτων" msgstr "Εμφάνιση σφαλμάτων"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59 #: ../js/ui/lookingGlass.js:714
#: ../js/ui/status/location.js:167
msgid "Enabled" msgid "Enabled"
msgstr "Ενεργοποιημένο" msgstr "Ενεργοποιημένο"
@@ -1195,64 +1194,64 @@ msgstr "Ενεργοποιημένο"
#. because it's disabled by rfkill (airplane mode) */ #. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164 #: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830 #: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Απενεργοποιημένο" msgstr "Απενεργοποιημένο"
#: ../js/ui/lookingGlass.js:721 #: ../js/ui/lookingGlass.js:719
msgid "Error" msgid "Error"
msgstr "Σφάλμα" msgstr "Σφάλμα"
#: ../js/ui/lookingGlass.js:723 #: ../js/ui/lookingGlass.js:721
msgid "Out of date" msgid "Out of date"
msgstr "Μη ενημερωμένο" msgstr "Μη ενημερωμένο"
#: ../js/ui/lookingGlass.js:725 #: ../js/ui/lookingGlass.js:723
msgid "Downloading" msgid "Downloading"
msgstr "Γίνεται λήψη" msgstr "Γίνεται λήψη"
#: ../js/ui/lookingGlass.js:749 #: ../js/ui/lookingGlass.js:747
msgid "View Source" msgid "View Source"
msgstr "Προβολή πηγής" msgstr "Προβολή πηγής"
#: ../js/ui/lookingGlass.js:758 #: ../js/ui/lookingGlass.js:756
msgid "Web Page" msgid "Web Page"
msgstr "Ιστοσελίδα" msgstr "Ιστοσελίδα"
#: ../js/ui/messageTray.js:1326 #: ../js/ui/messageTray.js:1324
msgid "Open" msgid "Open"
msgstr "Άνοιγμα" msgstr "Άνοιγμα"
#: ../js/ui/messageTray.js:1333 #: ../js/ui/messageTray.js:1331
msgid "Remove" msgid "Remove"
msgstr "Αφαίρεση" msgstr "Αφαίρεση"
#: ../js/ui/messageTray.js:1630 #: ../js/ui/messageTray.js:1628
msgid "Notifications" msgid "Notifications"
msgstr "Ειδοποιήσεις" msgstr "Ειδοποιήσεις"
#: ../js/ui/messageTray.js:1637 #: ../js/ui/messageTray.js:1635
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Καθαρισμός μηνυμάτων" msgstr "Καθαρισμός μηνυμάτων"
#: ../js/ui/messageTray.js:1656 #: ../js/ui/messageTray.js:1654
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Ρυθμίσεις ειδοποιήσεων" msgstr "Ρυθμίσεις ειδοποιήσεων"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Μενού περιοχής ειδοποιήσεων" msgstr "Μενού περιοχής ειδοποιήσεων"
#: ../js/ui/messageTray.js:1926 #: ../js/ui/messageTray.js:1924
msgid "No Messages" msgid "No Messages"
msgstr "Κανένα μήνυμα" msgstr "Κανένα μήνυμα"
#: ../js/ui/messageTray.js:1964 #: ../js/ui/messageTray.js:1962
msgid "Message Tray" msgid "Message Tray"
msgstr "Περιοχή ειδοποιήσεων μηνυμάτων" msgstr "Περιοχή ειδοποιήσεων μηνυμάτων"
#: ../js/ui/messageTray.js:2962 #: ../js/ui/messageTray.js:2946
msgid "System Information" msgid "System Information"
msgstr "Πληροφορίες συστήματος" msgstr "Πληροφορίες συστήματος"
@@ -1268,11 +1267,11 @@ msgid_plural "%d new messages"
msgstr[0] "%d νέο μήνυμα" msgstr[0] "%d νέο μήνυμα"
msgstr[1] "%d νέα μηνύματα" msgstr[1] "%d νέα μηνύματα"
#: ../js/ui/overview.js:84 #: ../js/ui/overview.js:83
msgid "Undo" msgid "Undo"
msgstr "Αναίρεση" msgstr "Αναίρεση"
#: ../js/ui/overview.js:124 #: ../js/ui/overview.js:123
msgid "Overview" msgid "Overview"
msgstr "Επισκόπηση" msgstr "Επισκόπηση"
@@ -1280,7 +1279,7 @@ msgstr "Επισκόπηση"
#. 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:250 #: ../js/ui/overview.js:257
msgid "Type to search…" msgid "Type to search…"
msgstr "Πληκτρολογήστε για αναζήτηση…" msgstr "Πληκτρολογήστε για αναζήτηση…"
@@ -1314,7 +1313,7 @@ msgstr "Κλείσιμο"
#. 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, %B %d"
#: ../js/ui/screenShield.js:153 #: ../js/ui/screenShield.js:153
#, javascript-format #, javascript-format
@@ -1323,27 +1322,27 @@ msgid_plural "%d new notifications"
msgstr[0] "%d νέα ειδοποίηση" msgstr[0] "%d νέα ειδοποίηση"
msgstr[1] "%d νέες ειδοποιήσεις" msgstr[1] "%d νέες ειδοποιήσεις"
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342 #: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:342
msgid "Lock" msgid "Lock"
msgstr "Κλείδωμα" msgstr "Κλείδωμα"
#: ../js/ui/screenShield.js:708 #: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen" msgid "GNOME needs to lock the screen"
msgstr "Το GNOME χρειάζεται να κλειδώσει την οθόνη" msgstr "Το GNOME χρειάζεται να κλειδώσει την οθόνη"
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309 #: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1301
msgid "Unable to lock" msgid "Unable to lock"
msgstr "Αδυναμία κλειδώματος" msgstr "Αδυναμία κλειδώματος"
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310 #: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1302
msgid "Lock was blocked by an application" msgid "Lock was blocked by an application"
msgstr "Το κλείδωμα εμποδίσθηκε από μια εφαρμογή" msgstr "Το κλείδωμα εμποδίστηκε από μια εφαρμογή"
#: ../js/ui/search.js:603 #: ../js/ui/search.js:589
msgid "Searching…" msgid "Searching…"
msgstr "Αναζήτηση…" msgstr "Αναζήτηση…"
#: ../js/ui/search.js:649 #: ../js/ui/search.js:632
msgid "No results." msgid "No results."
msgstr "Δε βρέθηκαν αποτελέσματα." msgstr "Δε βρέθηκαν αποτελέσματα."
@@ -1415,29 +1414,30 @@ msgstr "Υψηλή αντίθεση"
msgid "Large Text" msgid "Large Text"
msgstr "Μεγάλο κείμενο" msgstr "Μεγάλο κείμενο"
#: ../js/ui/status/bluetooth.js:49 #: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151 #: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234 #: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85 #: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105 #: ../js/ui/status/rfkill.js:105
msgid "Turn Off" msgid "Turn Off"
msgstr "Σβήσιμο" msgstr "Σβήσιμο"
#: ../js/ui/status/bluetooth.js:54 #: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
msgstr "Ρυθμίσεις Bluetooth" msgstr "Ρυθμίσεις Bluetooth"
#: ../js/ui/status/bluetooth.js:104 #: ../js/ui/status/bluetooth.js:100
#, 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 συνδεδεμένη συσκευή" msgstr[0] "%d συνδεμένη συσκευή"
msgstr[1] "%d συνδεδεμένες συσκευές" msgstr[1] "%d συνδεμένες συσκευές"
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262 #: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
msgid "Not Connected" msgid "Not Connected"
msgstr "Χωρίς σύνδεση" msgstr "Χωρίς σύνδεση"
@@ -1449,170 +1449,159 @@ msgstr "Φωτεινότητα"
msgid "Show Keyboard Layout" msgid "Show Keyboard Layout"
msgstr "Εμφάνιση διάταξης πληκτρολογίου" msgstr "Εμφάνιση διάταξης πληκτρολογίου"
#: ../js/ui/status/location.js:53 #: ../js/ui/status/location.js:52
msgid "Location" msgid "Location"
msgstr "Θέση" msgstr "Θέση"
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168 #: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
msgid "Disable" #: ../js/ui/status/rfkill.js:84
msgstr "Απενεργοποίηση" msgid "On"
#: ../js/ui/status/location.js:165
msgid "Enable"
msgstr "Ενεργοποίηση" msgstr "Ενεργοποίηση"
#: ../js/ui/status/location.js:167 #: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
msgid "In Use" #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgstr "Σε χρήση" msgid "Off"
msgstr "Εκτός σύνδεσης"
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
msgid "Turn On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/network.js:74 #: ../js/ui/status/network.js:74
msgid "<unknown>" msgid "<unknown>"
msgstr "<άγνωστο>" msgstr "<άγνωστο>"
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
#: ../js/ui/status/network.js:1464
msgid "Off"
msgstr "Εκτός σύνδεσης"
#: ../js/ui/status/network.js:422
msgid "Connected"
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:426 #: ../js/ui/status/network.js:431
msgid "unmanaged" msgid "unmanaged"
msgstr "χωρίς διαχείριση" msgstr "μη διαχειριζόμενες"
#: ../js/ui/status/network.js:428 #: ../js/ui/status/network.js:433
msgid "disconnecting..." msgid "disconnecting..."
msgstr "αποσύνδεση..." msgstr "αποσύνδεση..."
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362 #: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
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:437 ../js/ui/status/network.js:1365 #: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
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:445 #: ../js/ui/status/network.js:450
msgid "firmware missing" msgid "firmware missing"
msgstr "έλλειψη λογισμικού υλικού (firmware)" msgstr "έλλειψη 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:449 #: ../js/ui/status/network.js:454
msgid "unavailable" msgid "unavailable"
msgstr "μη διαθέσιμο" msgstr "μη διαθέσιμο"
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367 #: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
msgid "connection failed" msgid "connection failed"
msgstr "αποτυχία σύνδεσης" msgstr "αποτυχία σύνδεσης"
#: ../js/ui/status/network.js:467 #: ../js/ui/status/network.js:472
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Ενσύρματες ρυθμίσεις" msgstr "Ενσύρματες ρυθμίσεις"
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587 #: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Ρυθμίσεις Κινήτης Ευρυζωνικής" msgstr "Ρυθμίσεις Κινήτης Ευρυζωνικής"
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258 #: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
msgid "Hardware Disabled" msgid "Hardware Disabled"
msgstr "Το Υλικό απενεργοποιήθηκε" msgstr "Το Υλικό Απενεργοποιήθηκε"
#: ../js/ui/status/network.js:595 #: ../js/ui/status/network.js:600
msgid "Use as Internet connection" msgid "Use as Internet connection"
msgstr "Χρήση με σύνδεση διαδικτύου" msgstr "Χρήση με σύνδεση διαδικτύου"
#: ../js/ui/status/network.js:776 #: ../js/ui/status/network.js:781
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Η κατάσταση λειτουργίας αεροπλάνου είναι ενεργή" msgstr "Η κατάσταση λειτουργίας αεροπλάνου είναι ενεργή"
#: ../js/ui/status/network.js:777 #: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "" msgstr ""
"Η ασύρματη σύνδεση είναι ανενεργή όταν η λειτουργία αεροπλάνου είναι ενεργή." "Η ασύρματη σύνδεση είναι ανενεργή όταν η λειτουργία αεροπλάνου είναι ενεργή."
#: ../js/ui/status/network.js:778 #: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Απενεργοποίηση της κατάστασης λειτουργίας αεροπλάνου" msgstr "Απενεργοποίηση της κατάστασης λειτουργίας αεροπλάνου"
#: ../js/ui/status/network.js:787 #: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Το ασύρματο δίκτυο είναι ανενεργό" msgstr "Το ασύρματο δίκτυο είναι ανενεργό"
#: ../js/ui/status/network.js:788 #: ../js/ui/status/network.js:793
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "" msgstr ""
"Το ασύρματο δίκτυο χρειάζεται να ενεργοποιηθεί για να συνδεθείτε με ένα " "Το ασύρματο δίκτυο χρειάζεται να ενεργοποιηθεί για να συνδεθείτε με ένα "
"δίκτυο." "δίκτυο."
#: ../js/ui/status/network.js:789 #: ../js/ui/status/network.js:794
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Ενεργοποίηση του ασυρμάτου δικτύου Wi-Fi" msgstr "Ενεργοποιήστε το ασύρματο δικτύο"
#: ../js/ui/status/network.js:814 #: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Δίκτυα Wi-Fi" msgstr "Δίκτυα Wi-Fi"
#: ../js/ui/status/network.js:816 #: ../js/ui/status/network.js:821
msgid "Select a network" msgid "Select a network"
msgstr "Επιλογή δικτύου" msgstr "Επιλογή δικτύου"
#: ../js/ui/status/network.js:845 #: ../js/ui/status/network.js:850
msgid "No Networks" msgid "No Networks"
msgstr "Χωρίς δίκτυα" msgstr "Χωρίς δίκτυα"
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103 #: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Χρήση διακόπτη υλικού για τερματισμό" msgstr "Χρησιμοποιήστε διακόπτη υλικού για τερματισμό"
#: ../js/ui/status/network.js:1136 #: ../js/ui/status/network.js:1141
msgid "Select Network" msgid "Select Network"
msgstr "Επιλογή δικτύου" msgstr "Επιλογή δικτύου"
#: ../js/ui/status/network.js:1142 #: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Ρυθμίσεις Wi-Fi" msgstr "Ρυθμίσεις Wi-Fi"
#: ../js/ui/status/network.js:1234 #: ../js/ui/status/network.js:1252
msgid "Turn On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/network.js:1251
msgid "Hotspot Active" msgid "Hotspot Active"
msgstr "Ενεργό θερμό σημείο" msgstr "Ενεργό θερμό σημείο"
#: ../js/ui/status/network.js:1254 #: ../js/ui/status/network.js:1255
msgid "Connecting" msgid "Connecting"
msgstr "Συνδέεται" msgstr "Συνδέεται"
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88 #: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
msgid "Network Settings" msgid "Network Settings"
msgstr "Ρυθμίσεις δικτύου" msgstr "Ρυθμίσεις δικτύου"
#: ../js/ui/status/network.js:1435 #: ../js/ui/status/network.js:1436
msgid "VPN Settings" msgid "VPN Settings"
msgstr "Ρυθμίσεις VPN" msgstr "Ρυθμίσεις VPN"
#: ../js/ui/status/network.js:1454 #: ../js/ui/status/network.js:1455
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
#: ../js/ui/status/network.js:1607 #: ../js/ui/status/network.js:1598
msgid "Network Manager" msgid "Network Manager"
msgstr "Διαχειριστής δικτύου" msgstr "Διαχειριστής δικτύου"
#: ../js/ui/status/network.js:1646 #: ../js/ui/status/network.js:1637
msgid "Connection failed" msgid "Connection failed"
msgstr "Αποτυχία σύνδεσης" msgstr "Αποτυχία σύνδεσης"
#: ../js/ui/status/network.js:1647 #: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed" msgid "Activation of network connection failed"
msgstr "Απέτυχε η ενεργοποίηση της σύνδεσης δικτύου" msgstr "Απέτυχε η ενεργοποίηση της σύνδεσης δικτύου"
@@ -1650,10 +1639,6 @@ msgstr "Μπαταρία"
msgid "Airplane Mode" msgid "Airplane Mode"
msgstr "Κατάσταση λειτουργίας αεροπλάνου" msgstr "Κατάσταση λειτουργίας αεροπλάνου"
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/system.js:314 #: ../js/ui/status/system.js:314
msgid "Switch User" msgid "Switch User"
msgstr "Αλλαγή χρήστη" msgstr "Αλλαγή χρήστη"
@@ -1767,8 +1752,8 @@ msgstr ""
#: ../src/main.c:361 #: ../src/main.c:361
msgid "Use a specific mode, e.g. \"gdm\" for login screen" msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr "" msgstr ""
"Χρήση μιας συγκεκριμένης κατάστασης λειτουργίας, π.χ. \"gdm\" για την οθόνη " "Χρησιμοποιήστε μια συγκεκριμένη κατάσταση λειτουργίας, π.χ. \"gdm\" για την "
"σύνδεσης" "οθόνη σύνδεσης"
#: ../src/main.c:367 #: ../src/main.c:367
msgid "List possible modes" msgid "List possible modes"

File diff suppressed because it is too large Load Diff

771
po/es.po

File diff suppressed because it is too large Load Diff

1039
po/eu.po

File diff suppressed because it is too large Load Diff

170
po/fi.po
View File

@@ -26,8 +26,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: 2014-03-05 20:31+0000\n" "POT-Creation-Date: 2014-02-24 08:30+0000\n"
"PO-Revision-Date: 2014-03-05 22:43+0200\n" "PO-Revision-Date: 2014-02-24 21:20+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n" "Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <gnome-fi-laatu@lists.sourceforge.net>\n" "Language-Team: suomi <gnome-fi-laatu@lists.sourceforge.net>\n"
"Language: fi\n" "Language: fi\n"
@@ -100,9 +100,10 @@ msgstr ""
"kautta." "kautta."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#, fuzzy
#| msgid "Uuids of extensions to enable" #| msgid "Uuids of extensions to enable"
msgid "UUIDs of extensions to enable" msgid "UUIDs of extensions to enable"
msgstr "Käyttöön otettavien laajennusten UUID:t" msgstr "Käyttöön otettavien laajennosten UUID:t"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4 #: ../data/org.gnome.shell.gschema.xml.in.in.h:4
#, fuzzy #, fuzzy
@@ -124,7 +125,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.in.h:5
msgid "Disables the validation of extension version compatibility" msgid "Disables the validation of extension version compatibility"
msgstr "Poistaa käytöstä laajennusten versioyhteensopivuuden tarkistuksen" msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.in.h:6
msgid "" msgid ""
@@ -152,6 +153,7 @@ msgid "History for the looking glass dialog"
msgstr "Historia näyttölasi-ikkunalle" msgstr "Historia näyttölasi-ikkunalle"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.in.h:11
#| msgid "Always show the 'Log out' menuitem in the user menu."
msgid "Always show the 'Log out' menu item in the user menu." msgid "Always show the 'Log out' menu item in the user menu."
msgstr "Näytä aina \"Kirjaudu ulos\"-toiminto käyttäjävalikossa." msgstr "Näytä aina \"Kirjaudu ulos\"-toiminto käyttäjävalikossa."
@@ -249,7 +251,7 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed " "Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', " "to see. Valid options are 'off' (disable location tracking), 'country', "
"'city', 'neighborhood', 'street', and 'exact' (typically requires GPS " "'city', 'neighborhood', 'street', and 'exact' (typically requires GPS "
"receiver). Please keep in mind that this only controls what GeoClue will " "receiver). Please keep in mind that this only controls what Geoclue will "
"allow applications to see and they can find user's location on their own " "allow applications to see and they can find user's location on their own "
"using network resources (albeit with street-level accuracy at best)." "using network resources (albeit with street-level accuracy at best)."
msgstr "" msgstr ""
@@ -322,7 +324,7 @@ msgstr "Valitse muokattava laajennus alta."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136 #: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429 #: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399 #: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:873 #: ../js/ui/status/network.js:883
msgid "Cancel" msgid "Cancel"
msgstr "Peru" msgstr "Peru"
@@ -380,6 +382,7 @@ msgstr "Komentoa ei voi jäsentää:"
#: ../js/misc/util.js:156 #: ../js/misc/util.js:156
#, javascript-format #, javascript-format
#| msgid "Execution of '%s' failed:"
msgid "Execution of “%s” failed:" msgid "Execution of “%s” failed:"
msgstr "Kohteen ”%s” suorittaminen epäonnistui:" msgstr "Kohteen ”%s” suorittaminen epäonnistui:"
@@ -555,35 +558,35 @@ msgid "Next month"
msgstr "Seuraava kuukausi" msgstr "Seuraava kuukausi"
#. Translators: Text to show if there are no events */ #. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:763 #: ../js/ui/calendar.js:762
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "Ei merkintöjä" msgstr "Ei merkintöjä"
#. 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:781 #: ../js/ui/calendar.js:780
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %e. %Bta" msgstr "%A, %e. %Bta"
#. 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:784 #: ../js/ui/calendar.js:783
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %e. %Bta %Y" msgstr "%A, %e. %Bta %Y"
#: ../js/ui/calendar.js:795 #: ../js/ui/calendar.js:794
msgid "Today" msgid "Today"
msgstr "Tänään" msgstr "Tänään"
#: ../js/ui/calendar.js:799 #: ../js/ui/calendar.js:798
msgid "Tomorrow" msgid "Tomorrow"
msgstr "Huomenna" msgstr "Huomenna"
#: ../js/ui/calendar.js:810 #: ../js/ui/calendar.js:809
msgid "This week" msgid "This week"
msgstr "Tällä viikolla" msgstr "Tällä viikolla"
#: ../js/ui/calendar.js:818 #: ../js/ui/calendar.js:817
msgid "Next week" msgid "Next week"
msgstr "Ensi viikolla" msgstr "Ensi viikolla"
@@ -616,8 +619,8 @@ msgstr "Salasana:"
msgid "Type again:" msgid "Type again:"
msgstr "Uudelleen:" msgstr "Uudelleen:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240 #: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:317 ../js/ui/status/network.js:876 #: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect" msgid "Connect"
msgstr "Yhdistä" msgstr "Yhdistä"
@@ -651,6 +654,9 @@ msgstr "Langaton verkko vaatii tunnistautumisen"
#: ../js/ui/components/networkAgent.js:312 #: ../js/ui/components/networkAgent.js:312
#, javascript-format #, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
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”."
@@ -686,6 +692,7 @@ msgstr "Mobiililaajakaistan verkkosalasana"
#: ../js/ui/components/networkAgent.js:339 #: ../js/ui/components/networkAgent.js:339
#, javascript-format #, javascript-format
#| msgid "A password is required to connect to '%s'."
msgid "A password is required to connect to “%s”." msgid "A password is required to connect to “%s”."
msgstr "Salasana vaaditaan kohteeseen \"%s\" yhdistämiseksi." msgstr "Salasana vaaditaan kohteeseen \"%s\" yhdistämiseksi."
@@ -735,18 +742,23 @@ msgstr "Vaimenna"
#. Translators: Time in 24h format */ #. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:955 #: ../js/ui/components/telepathyClient.js:955
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%H%M" msgid "%H%M"
msgstr "%H%M" msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a #. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */ #. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:962 #: ../js/ui/components/telepathyClient.js:962
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M" msgid "Yesterday, %H%M"
msgstr "Eilen, %H%M" msgstr "Eilen, %H%M"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */ #. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:969 #: ../js/ui/components/telepathyClient.js:969
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%A, %H%M" msgid "%A, %H%M"
msgstr "%A, %H%M" msgstr "%A, %H%M"
@@ -754,6 +766,8 @@ msgstr "%A, %H%M"
#. followed by a time string in 24h format. #. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */ #. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:976 #: ../js/ui/components/telepathyClient.js:976
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%B %d, %H%M" msgid "%B %d, %H%M"
msgstr "%e. %Bta, %H%M" msgstr "%e. %Bta, %H%M"
@@ -766,6 +780,8 @@ msgstr "%e. %Bta %Y, %H%M"
#. Translators: Time in 24h format */ #. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:991 #: ../js/ui/components/telepathyClient.js:991
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%l%M %p" msgid "%l%M %p"
msgstr "%l%M %p" msgstr "%l%M %p"
@@ -778,6 +794,7 @@ msgstr "Eilen, %l%M %p"
#. Translators: this is the week day name followed by a time #. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */ #. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1005 #: ../js/ui/components/telepathyClient.js:1005
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p" msgid "%A, %l%M %p"
msgstr "%A, %l%M %p" msgstr "%A, %l%M %p"
@@ -995,22 +1012,22 @@ msgstr "Näytä sovellukset"
msgid "Dash" msgid "Dash"
msgstr "Pikavalikko" msgstr "Pikavalikko"
#: ../js/ui/dateMenu.js:91 #: ../js/ui/dateMenu.js:86
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Avaa kalenteri" msgstr "Avaa kalenteri"
#: ../js/ui/dateMenu.js:95 #: ../js/ui/dateMenu.js:90
msgid "Open Clocks" msgid "Open Clocks"
msgstr "Avaa kellot" msgstr "Avaa kellot"
#: ../js/ui/dateMenu.js:102 #: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings" msgid "Date & Time Settings"
msgstr "Ajan & päiväyksen asetukset" msgstr "Ajan & päiväyksen asetukset"
#. 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:192 #: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e. %Bta %Y" msgstr "%A, %e. %Bta %Y"
@@ -1108,6 +1125,8 @@ msgstr[1] ""
"sekunnin kuluttua." "sekunnin kuluttua."
#: ../js/ui/endSessionDialog.js:129 #: ../js/ui/endSessionDialog.js:129
#| msgctxt "button"
#| msgid "Restart & Install"
msgctxt "button" msgctxt "button"
msgid "Restart &amp; Install" msgid "Restart &amp; Install"
msgstr "Käynnistä uudelleen ja asenna" msgstr "Käynnistä uudelleen ja asenna"
@@ -1154,6 +1173,7 @@ msgstr "Asenna"
#: ../js/ui/extensionDownloader.js:204 #: ../js/ui/extensionDownloader.js:204
#, javascript-format #, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
msgid "Download and install “%s” from extensions.gnome.org?" msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?" msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?"
@@ -1187,7 +1207,7 @@ msgstr "Käytössä"
#. because it's disabled by rfkill (airplane mode) */ #. because it's disabled by rfkill (airplane mode) */
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:550 #: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../src/gvc/gvc-mixer-control.c:1830 #: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled" msgid "Disabled"
msgstr "Ei käytössä" msgstr "Ei käytössä"
@@ -1212,39 +1232,39 @@ msgstr "Näytä lähde"
msgid "Web Page" msgid "Web Page"
msgstr "Verkkosivusto" msgstr "Verkkosivusto"
#: ../js/ui/messageTray.js:1326 #: ../js/ui/messageTray.js:1324
msgid "Open" msgid "Open"
msgstr "Avaa" msgstr "Avaa"
#: ../js/ui/messageTray.js:1333 #: ../js/ui/messageTray.js:1331
msgid "Remove" msgid "Remove"
msgstr "Poista" msgstr "Poista"
#: ../js/ui/messageTray.js:1630 #: ../js/ui/messageTray.js:1628
msgid "Notifications" msgid "Notifications"
msgstr "Ilmoitukset" msgstr "Ilmoitukset"
#: ../js/ui/messageTray.js:1637 #: ../js/ui/messageTray.js:1635
msgid "Clear Messages" msgid "Clear Messages"
msgstr "Tyhjennä viestit" msgstr "Tyhjennä viestit"
#: ../js/ui/messageTray.js:1656 #: ../js/ui/messageTray.js:1654
msgid "Notification Settings" msgid "Notification Settings"
msgstr "Ilmoitusasetukset" msgstr "Ilmoitusasetukset"
#: ../js/ui/messageTray.js:1709 #: ../js/ui/messageTray.js:1707
msgid "Tray Menu" msgid "Tray Menu"
msgstr "Viestialuevalikko" msgstr "Viestialuevalikko"
#: ../js/ui/messageTray.js:1926 #: ../js/ui/messageTray.js:1924
msgid "No Messages" msgid "No Messages"
msgstr "Ei viestejä" msgstr "Ei viestejä"
#: ../js/ui/messageTray.js:1964 #: ../js/ui/messageTray.js:1962
msgid "Message Tray" msgid "Message Tray"
msgstr "Viestialue" msgstr "Viestialue"
#: ../js/ui/messageTray.js:2948 #: ../js/ui/messageTray.js:2946
msgid "System Information" msgid "System Information"
msgstr "Järjestelmän tiedot" msgstr "Järjestelmän tiedot"
@@ -1411,10 +1431,10 @@ msgstr "Suuri tekstin koko"
msgid "Bluetooth" msgid "Bluetooth"
msgstr "Bluetooth" msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59 #: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151 #: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:318 ../js/ui/status/network.js:1225 #: ../js/ui/status/network.js:328 ../js/ui/status/network.js:1235
#: ../js/ui/status/network.js:1336 ../js/ui/status/rfkill.js:85 #: ../js/ui/status/network.js:1346 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/rfkill.js:105 #: ../js/ui/status/rfkill.js:105
msgid "Turn Off" msgid "Turn Off"
msgstr "Sammuta" msgstr "Sammuta"
@@ -1430,7 +1450,7 @@ msgid_plural "%d Connected Devices"
msgstr[0] "%d yhdistetty laite" msgstr[0] "%d yhdistetty laite"
msgstr[1] "%d yhdistettyä laitetta" msgstr[1] "%d yhdistettyä laitetta"
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1253 #: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
msgid "Not Connected" msgid "Not Connected"
msgstr "Ei yhdistetty" msgstr "Ei yhdistetty"
@@ -1443,20 +1463,21 @@ msgid "Show Keyboard Layout"
msgstr "Näytä näppäimistön asettelu" msgstr "Näytä näppäimistön asettelu"
#: ../js/ui/status/location.js:52 #: ../js/ui/status/location.js:52
#| msgid "Notifications"
msgid "Location" msgid "Location"
msgstr "Sijainti" msgstr "Sijainti"
#: ../js/ui/status/location.js:58 ../js/ui/status/location.js:158 #: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
#: ../js/ui/status/rfkill.js:84 #: ../js/ui/status/rfkill.js:84
msgid "On" msgid "On"
msgstr "Päällä" msgstr "Päällä"
#: ../js/ui/status/location.js:155 ../js/ui/status/network.js:415 #: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:1251 ../js/ui/status/network.js:1455 #: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgid "Off" msgid "Off"
msgstr "Pois" msgstr "Pois"
#: ../js/ui/status/location.js:156 ../js/ui/status/network.js:1225 #: ../js/ui/status/location.js:159 ../js/ui/status/network.js:1235
msgid "Turn On" msgid "Turn On"
msgstr "Ota käyttöön" msgstr "Ota käyttöön"
@@ -1464,127 +1485,130 @@ msgstr "Ota käyttöön"
msgid "<unknown>" msgid "<unknown>"
msgstr "<tuntematon>" msgstr "<tuntematon>"
#: ../js/ui/status/network.js:417
#| msgid "Connect"
msgid "Connected"
msgstr "Yhdistetty"
#. 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:421 #: ../js/ui/status/network.js:431
msgid "unmanaged" msgid "unmanaged"
msgstr "ei hallinnassa" msgstr "ei hallinnassa"
#: ../js/ui/status/network.js:423 #: ../js/ui/status/network.js:433
msgid "disconnecting..." msgid "disconnecting..."
msgstr "katkaistaan yhteyttä…" msgstr "katkaistaan yhteyttä…"
#: ../js/ui/status/network.js:429 ../js/ui/status/network.js:1353 #: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
msgid "connecting..." msgid "connecting..."
msgstr "yhdistetään…" msgstr "yhdistetää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:432 ../js/ui/status/network.js:1356 #: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
msgid "authentication required" msgid "authentication required"
msgstr "tunnistautuminen vaaditaan" msgstr "tunnistautuminen vaaditaan"
#. 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:440 #: ../js/ui/status/network.js:450
msgid "firmware missing" msgid "firmware missing"
msgstr "laiteohjelmisto puuttuu" msgstr "laiteohjelmisto puuttuu"
#. 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:444 #: ../js/ui/status/network.js:454
msgid "unavailable" msgid "unavailable"
msgstr "ei käytettävissä" msgstr "ei käytettävissä"
#: ../js/ui/status/network.js:446 ../js/ui/status/network.js:1358 #: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
msgid "connection failed" msgid "connection failed"
msgstr "yhteys katkesi" msgstr "yhteys katkesi"
#: ../js/ui/status/network.js:462 #: ../js/ui/status/network.js:472
#| msgid "Wi-Fi Settings"
msgid "Wired Settings" msgid "Wired Settings"
msgstr "Kiinteän yhteyden asetukset" msgstr "Kiinteän yhteyden asetukset"
#: ../js/ui/status/network.js:504 ../js/ui/status/network.js:582 #: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
msgid "Mobile Broadband Settings" msgid "Mobile Broadband Settings"
msgstr "Mobiililaajakaistan asetukset" msgstr "Mobiililaajakaistan asetukset"
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:1249 #: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
#| msgid "hardware disabled"
msgid "Hardware Disabled" msgid "Hardware Disabled"
msgstr "Laite on pois käytöstä" msgstr "Laite on pois käytöstä"
#: ../js/ui/status/network.js:590 #: ../js/ui/status/network.js:600
msgid "Use as Internet connection" msgid "Use as Internet connection"
msgstr "Käytä internetyhteytenä" msgstr "Käytä internetyhteytenä"
#: ../js/ui/status/network.js:771 #: ../js/ui/status/network.js:781
#| msgid "Airplane Mode"
msgid "Airplane Mode is On" msgid "Airplane Mode is On"
msgstr "Lentokonetila on päällä" msgstr "Lentokonetila on päällä"
#: ../js/ui/status/network.js:772 #: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on." msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "Wifi on pois päältä lentokonetilan ollessa päällä." msgstr "Wifi on pois päältä lentokonetilan ollessa päällä."
#: ../js/ui/status/network.js:773 #: ../js/ui/status/network.js:783
#| msgid "Airplane Mode"
msgid "Turn Off Airplane Mode" msgid "Turn Off Airplane Mode"
msgstr "Käytä lentokonetilaa" msgstr "Käytä lentokonetilaa"
#: ../js/ui/status/network.js:782 #: ../js/ui/status/network.js:792
#| msgid "Wi-Fi Settings"
msgid "Wi-Fi is Off" msgid "Wi-Fi is Off"
msgstr "Wifi on pois" msgstr "Wifi on pois"
#: ../js/ui/status/network.js:783 #: ../js/ui/status/network.js:793
msgid "Wi-Fi needs to be turned on in order to connect to a network." msgid "Wi-Fi needs to be turned on in order to connect to a network."
msgstr "Wifin tulee olla päällä, jotta yhteys verkkoon on mahdollinen." msgstr "Wifin tulee olla päällä, jotta yhteys verkkoon on mahdollinen."
#: ../js/ui/status/network.js:784 #: ../js/ui/status/network.js:794
#| msgid "Turn On"
msgid "Turn On Wi-Fi" msgid "Turn On Wi-Fi"
msgstr "Ota wifi käyttöön" msgstr "Ota wifi käyttöön"
#: ../js/ui/status/network.js:809 #: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks" msgid "Wi-Fi Networks"
msgstr "Wifi-verkot" msgstr "Wifi-verkot"
#: ../js/ui/status/network.js:811 #: ../js/ui/status/network.js:821
msgid "Select a network" msgid "Select a network"
msgstr "Valitse verkko" msgstr "Valitse verkko"
#: ../js/ui/status/network.js:840 #: ../js/ui/status/network.js:850
msgid "No Networks" msgid "No Networks"
msgstr "Ei verkkoja" msgstr "Ei verkkoja"
#: ../js/ui/status/network.js:861 ../js/ui/status/rfkill.js:103 #: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
msgid "Use hardware switch to turn off" msgid "Use hardware switch to turn off"
msgstr "Käytä laitepainiketta sammuttaaksesi" msgstr ""
#: ../js/ui/status/network.js:1131 #: ../js/ui/status/network.js:1141
msgid "Select Network" msgid "Select Network"
msgstr "Valitse verkko" msgstr "Valitse verkko"
#: ../js/ui/status/network.js:1137 #: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings" msgid "Wi-Fi Settings"
msgstr "Wifin asetukset" msgstr "Wifin asetukset"
#: ../js/ui/status/network.js:1242 #: ../js/ui/status/network.js:1252
msgid "Hotspot Active" msgid "Hotspot Active"
msgstr "Yhteyspiste aktiivisena" msgstr "Yhteyspiste aktiivisena"
#: ../js/ui/status/network.js:1245 #: ../js/ui/status/network.js:1255
#| msgid "Connection"
msgid "Connecting" msgid "Connecting"
msgstr "Yhdistetään" msgstr "Yhdistetään"
#: ../js/ui/status/network.js:1424 ../js/ui/status/rfkill.js:88 #: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
msgid "Network Settings" msgid "Network Settings"
msgstr "Verkkoasetukset" msgstr "Verkkoasetukset"
#: ../js/ui/status/network.js:1426 #: ../js/ui/status/network.js:1436
#| msgid "Settings"
msgid "VPN Settings" msgid "VPN Settings"
msgstr "VPN-asetukset" msgstr "VPN-asetukset"
#: ../js/ui/status/network.js:1445 #: ../js/ui/status/network.js:1455
msgid "VPN" msgid "VPN"
msgstr "VPN" msgstr "VPN"
@@ -1684,6 +1708,7 @@ msgstr "Haku"
#: ../js/ui/windowAttentionHandler.js:19 #: ../js/ui/windowAttentionHandler.js:19
#, javascript-format #, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready" msgid "“%s” is ready"
msgstr "“%s” on valmis" msgstr "“%s” on valmis"
@@ -1753,6 +1778,7 @@ msgstr "Listaa mahdolliset tilat"
#: ../src/shell-app.c:666 #: ../src/shell-app.c:666
#, c-format #, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”" msgid "Failed to launch “%s”"
msgstr "Sovelluksen ”%s” käynnistäminen epäonnistui" msgstr "Sovelluksen ”%s” käynnistäminen epäonnistui"

1247
po/fr.po

File diff suppressed because it is too large Load Diff

539
po/gl.po

File diff suppressed because it is too large Load Diff

814
po/he.po

File diff suppressed because it is too large Load Diff

1210
po/hu.po

File diff suppressed because it is too large Load Diff

624
po/id.po

File diff suppressed because it is too large Load Diff

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