Compare commits

..

20 Commits

Author SHA1 Message Date
28f4030aa2 retrigger greeter 2014-03-07 19:36:31 -05:00
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
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
056375cbcf gdm: Merge clear() and cancel()
cancel() isn't used anymore.
2014-03-07 18:49:41 -05:00
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
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
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
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
7afb503666 gdm: Rearrange code to make it slightly easier to read 2014-03-07 18:47:37 -05:00
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
b978d99820 gdm: Remove params from AuthPrompt.begin();
It's just one parameter now.
2014-03-07 18:47:36 -05:00
6d8d094e0c gdm: Remove the hold from AuthPrompt / UserVerifier
After the removal before, it's now unused.
2014-03-07 18:47:36 -05:00
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
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
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
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
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
8173110842 gdm: Make a method private 2014-03-07 18:42:17 -05:00
fee97da26b activate session 2014-03-07 18:42:07 -05:00
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-tool
src/gnome-shell-hotplug-sniffer
src/gnome-shell-jhbuild
src/gnome-shell-perf-helper
src/gnome-shell-perf-tool
src/gnome-shell-real
src/gnome-shell-wayland
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
src/run-js-test
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
=======
* 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,
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'
product.

View File

@ -1,5 +1,5 @@
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_SRCDIR([src/shell-global.c])
@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
CLUTTER_MIN_VERSION=1.15.90
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=1.39.0
MUTTER_MIN_VERSION=3.13.3
MUTTER_MIN_VERSION=3.11.91
GTK_MIN_VERSION=3.7.9
GIO_MIN_VERSION=2.37.0
LIBECAL_MIN_VERSION=3.5.3
@ -112,6 +112,13 @@ fi
PKG_CHECK_MODULES(GNOME_SHELL, $SHARED_PCS)
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(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)
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"}"
AC_ARG_VAR([BROWSER_PLUGIN_DIR],[Where to install the plugin to])

View File

@ -1,5 +1,9 @@
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
# file when built in a non-system prefix
@ -35,6 +39,7 @@ dist_theme_DATA = \
theme/filter-selected-rtl.svg \
theme/gnome-shell.css \
theme/logged-in-indicator.svg \
theme/menu-arrow-symbolic.svg \
theme/message-tray-background.png \
theme/more-results.svg \
theme/noise-texture.png \

View File

@ -1,4 +1,5 @@
[org.gnome.shell.overrides]
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
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary

View File

@ -2,7 +2,7 @@
Type=Application
_Name=GNOME Shell (wayland compositor)
_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-Product=gnome-shell
X-GNOME-Bugzilla-Component=general

View File

@ -38,6 +38,7 @@
<method name="Screencast">
<arg type="s" direction="in" name="file_template"/>
<arg type="a{sv}" direction="in" name="options"/>
<arg type="b" direction="in" name="flash"/>
<arg type="b" direction="out" name="success"/>
<arg type="s" direction="out" name="filename_used"/>
</method>

View File

@ -31,7 +31,7 @@
</_description>
</key>
<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>
<_description>
The applications corresponding to these identifiers
@ -40,10 +40,10 @@
</key>
<key name="app-picker-view" type="u">
<default>0</default>
<_summary>App Picker View</_summary>
<_description>
<summary>App Picker View</summary>
<description>
Index of the currently selected view in the application picker.
</_description>
</description>
</key>
<key name="command-history" type="as">
<default>[]</default>
@ -128,8 +128,8 @@
</key>
<key name="pause-resume-tweens" type="as">
<default>[]</default>
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary>
<_description></_description>
<summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
<description></description>
</key>
</schema>
@ -175,11 +175,11 @@
gettext-domain="@GETTEXT_PACKAGE@">
<key type="b" name="current-workspace-only">
<default>false</default>
<_summary>Limit switcher to current workspace.</_summary>
<_description>
<summary>Limit switcher to current workspace.</summary>
<description>
If true, only applications that have windows on the current workspace are shown in the switcher.
Otherwise, all applications are included.
</_description>
</description>
</key>
</schema>
@ -202,11 +202,11 @@
</key>
<key type="b" name="current-workspace-only">
<default>true</default>
<_summary>Limit switcher to current workspace.</_summary>
<_description>
<summary>Limit switcher to current workspace.</summary>
<description>
If true, only windows from the current workspace are shown in the switcher.
Otherwise, all windows are included.
</_description>
</description>
</key>
</schema>
@ -221,6 +221,15 @@
</_description>
</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">
<default>true</default>
<_summary>Enable edge tiling when dropping windows on screen edges</_summary>

View File

@ -153,21 +153,6 @@ StScrollBar StButton#vhandle:active {
-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 {
min-width: 200px;
}
@ -181,15 +166,6 @@ StScrollBar StButton#vhandle:active {
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 {
background-gradient-start: rgba(80,80,80,0.3);
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);
}
.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 {
padding-right: 0em;
}
@ -259,29 +221,7 @@ StScrollBar StButton#vhandle:active {
color: #9f9f9f;
}
.fallback-app-menu .popup-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-image-menu-item {
}
.popup-separator-menu-item {
@ -293,15 +233,8 @@ StScrollBar StButton#vhandle:active {
padding: 8px 0px;
}
.fallback-app-menu .popup-separator-menu-item {
-gradient-start: #a0a2a3;
-gradient-end: #a0a2a3;
-margin-horizontal: 0;
}
.fallback-app-menu.dark .popup-separator-menu-item {
-gradient-start: #818584;
-gradient-end: #818584;
.popup-alternating-menu-item:alternate {
font-weight: bold;
}
.popup-status-menu-item {
@ -403,14 +336,6 @@ StScrollBar StButton#vhandle:active {
icon-size: 16px;
}
.no-networks-label {
color: #999999;
}
.no-networks-box {
spacing: 12px;
}
/* Buttons */
.candidate-page-button,
@ -657,6 +582,11 @@ StScrollBar StButton#vhandle:active {
app-icon-bottom-clip: 2px;
}
.app-menu-icon {
width: 24px;
height: 24px;
}
.panel-button {
-natural-hpadding: 12px;
-minimum-hpadding: 6px;
@ -740,7 +670,7 @@ StScrollBar StButton#vhandle:active {
color: #e6e6e6;
border-radius: 32px; /* wish we could do 50% */
padding: 13px;
border: 2px solid #5f5f5f; /* using rgba() is flaky unfortunately */
border: 1px solid #5f5f5f; /* using rgba() is flaky unfortunately */
}
.system-menu-action:hover,
@ -748,7 +678,7 @@ StScrollBar StButton#vhandle:active {
color: white;
background-color: #4c4c4c;
border: none;
padding: 15px;
padding: 14px;
}
.system-menu-action:active {
@ -1049,8 +979,6 @@ StScrollBar StButton#vhandle:active {
.app-folder-icon {
padding: 5px;
spacing-rows: 5px;
spacing-columns: 5px;
}
.dash-item-container > StButton {
@ -1227,6 +1155,11 @@ StScrollBar StButton#vhandle:active {
text-shadow: black 0px 2px 2px;
}
#LookingGlassDialog .lg-inspector-title {
font-weight: bold;
padding-bottom: 8px;
}
.lg-dialog StEntry {
selection-background-color: #bbbbbb;
selected-color: #333333;
@ -1306,8 +1239,14 @@ StScrollBar StButton#vhandle:active {
width: 0.3em;
}
#calendarPopup .calendar {
padding: 10px;
}
.calendar {
padding: .4em 1.75em .8em 1.75em;
spacing-rows: 0px;
spacing-columns: 0px;
}
.calendar-month-label {
@ -1503,8 +1442,11 @@ StScrollBar StButton#vhandle:active {
padding-right: 8pt;
}
/* Message Tray */
.url-highlighter {
link-color: #ccccff;
}
/* Message Tray */
#message-tray {
background: #2e3436 url(message-tray-background.png);
background-repeat: repeat;
@ -1527,12 +1469,13 @@ StScrollBar StButton#vhandle:active {
color: #eeeeee;
}
.url-highlighter {
link-color: #ccccff;
.no-messages-label,
.no-networks-label {
color: #999999;
}
.no-messages-label {
color: #999999;
.no-networks-box {
spacing: 12px;
}
.notification {
@ -1828,6 +1771,26 @@ StScrollBar StButton#vhandle:active {
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 {
padding: 8px;
border-radius: 8px;
@ -2097,6 +2060,10 @@ StScrollBar StButton#vhandle:active {
icon-size: 48px;
}
.mount-password-reask {
color: red;
}
.show-processes-dialog,
.mount-question-dialog {
spacing: 24px;
@ -2392,6 +2359,13 @@ StScrollBar StButton#vhandle:active {
padding-bottom: 1em;
}
.login-dialog-title {
font-size: 14pt;
font-weight: bold;
color: #666666;
padding-bottom: 2em;
}
.login-dialog {
/* Reset border and background */
border: none;
@ -2440,6 +2414,10 @@ StScrollBar StButton#vhandle:active {
background-size: contain;
}
.login-dialog-user-list-item-text-box {
padding: 0 0.5em;
}
.login-dialog-user-list-item .login-dialog-timed-login-indicator {
background-color: rgba(0,0,0,0.0);
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 \
gactionobservable.h \
gactionobserver.h \
shell-network-agent.h \
shell-recorder-src.h
if !BUILD_RECORDER

View File

@ -50,6 +50,7 @@
<xi:include href="xml/shell-wm.xml"/>
<xi:include href="xml/shell-util.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-tp-client.xml"/>
</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
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
changing project, it will be much easier than get GNOME Shell and
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" />
<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" />

View File

@ -23,11 +23,6 @@ const GnomeShellIface = '<node> \
</interface> \
</node>';
const customCss = '.prefs-button { \
padding: 8px; \
border-radius: 20px; \
}';
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
function stripPrefix(string, prefix) {
@ -51,9 +46,13 @@ const Application = new Lang.Class({
this._extensionPrefsModules = {};
this._extensionIters = {};
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) {
@ -71,6 +70,11 @@ const Application = new Lang.Class({
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) {
let uuid = extension.metadata.uuid;
@ -100,23 +104,21 @@ const Application = new Lang.Class({
widget = this._buildErrorUI(extension, e);
}
let dialog = new Gtk.Dialog({ use_header_bar: true,
modal: true,
title: extension.metadata.name });
// Destroy the current prefs widget, if it exists
if (this._extensionPrefsBin.get_child())
this._extensionPrefsBin.get_child().destroy();
if (this._skipMainWindow) {
this.application.add_window(dialog);
if (this._window)
this._window.destroy();
this._window = dialog;
this._window.window_position = Gtk.WindowPosition.CENTER;
} else {
dialog.transient_for = this._window;
}
this._extensionPrefsBin.add(widget);
this._extensionSelector.set_active_iter(this._extensionIters[uuid]);
},
dialog.set_default_size(600, 400);
dialog.get_content_area().add(widget);
dialog.show();
_extensionSelected: function() {
let [success, iter] = this._extensionSelector.get_active_iter();
if (!success)
return;
let uuid = this._model.get_value(iter, 0);
this._selectExtension(uuid);
},
_buildErrorUI: function(extension, exc) {
@ -149,26 +151,48 @@ const Application = new Lang.Class({
_buildUI: function(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,
title: _("GNOME Shell Extensions") });
this._window.set_titlebar(this._titlebar);
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
this._window.add(vbox);
let scroll = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER,
shadow_type: Gtk.ShadowType.IN,
halign: Gtk.Align.CENTER,
margin: 18 });
this._window.add(scroll);
let toolbar = new Gtk.Toolbar();
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR);
vbox.add(toolbar);
let toolitem;
this._extensionSelector = new Gtk.ListBox({ selection_mode: Gtk.SelectionMode.NONE });
this._extensionSelector.set_sort_func(Lang.bind(this, this._sortList));
this._extensionSelector.set_header_func(Lang.bind(this, this._updateHeader));
let label = new Gtk.Label({ label: '<b>' + _("Extension") + '</b>',
use_markup: true });
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.connectSignal('ExtensionStatusChanged', Lang.bind(this, function(proxy, senderName, [uuid, state, error]) {
@ -179,35 +203,6 @@ const Application = new Lang.Class({
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() {
let finder = new ExtensionUtils.ExtensionFinder();
finder.connect('extension-found', Lang.bind(this, this._extensionFound));
@ -216,24 +211,15 @@ const Application = new Lang.Class({
},
_extensionFound: function(finder, extension) {
let row = new ExtensionRow(extension.uuid);
row.prefsButton.visible = this._extensionAvailable(row.uuid);
row.prefsButton.connect('clicked', Lang.bind(this,
function() {
this._selectExtension(row.uuid);
}));
row.show_all();
this._extensionSelector.add(row);
let iter = this._model.append();
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
this._extensionIters[extension.uuid] = iter;
},
_extensionsLoaded: function() {
if (this._startupUuid && this._extensionAvailable(this._startupUuid))
this._selectExtension(this._startupUuid);
this._startupUuid = null;
this._skipMainWindow = false;
this._loaded = true;
},
_onActivate: function() {
@ -241,125 +227,29 @@ const Application = new Lang.Class({
},
_onStartup: function(app) {
this._buildModel();
this._buildUI(app);
this._addCustomStyle();
this._scanExtensions();
},
_onCommandLine: function(app, commandLine) {
app.activate();
let args = commandLine.get_arguments();
if (args.length) {
let uuid = args[0];
this._skipMainWindow = true;
// Strip off "extension:///" prefix which fakes a URI, if it exists
uuid = stripPrefix(uuid, "extension:///");
if (this._extensionAvailable(uuid))
this._selectExtension(uuid);
else if (!this._loaded)
this._startupUuid = uuid;
else
this._skipMainWindow = false;
this._startupUuid = uuid;
}
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() {
// Monkey-patch in a "global" object that fakes some Shell utilities
// that ExtensionUtils depends on.

View File

@ -24,24 +24,10 @@ const AuthPromptMode = {
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({
Name: 'AuthPrompt',
_init: function(gdmClient, mode) {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this._gdmClient = gdmClient;
this._mode = mode;
@ -53,14 +39,11 @@ const AuthPrompt = new Lang.Class({
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('show-message', Lang.bind(this, this._onShowMessage));
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('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.updateSensitivity(false);
@ -133,6 +116,10 @@ const AuthPrompt = new Lang.Class({
this._defaultButtonWell.add_child(this._spinner.actor);
},
get verificationStatus() {
return this._userVerifier.verificationStatus;
},
_onDestroy: function() {
this._userVerifier.clear();
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) {
if (this._preemptiveAnswer) {
if (this._queryingService)
@ -221,30 +216,6 @@ const AuthPrompt = new Lang.Class({
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) {
this.setMessage(message, type);
this.emit('prompted');
@ -256,15 +227,11 @@ const AuthPrompt = new Lang.Class({
this.updateSensitivity(true);
this.setActorInDefaultButtonWell(null);
this.verificationStatus = AuthPromptStatus.VERIFICATION_FAILED;
},
_onVerificationComplete: function() {
this.verificationStatus = AuthPromptStatus.VERIFICATION_SUCCEEDED;
this.emit('failed');
},
_onReset: function() {
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
this.reset();
},
@ -428,38 +395,13 @@ const AuthPrompt = new Lang.Class({
},
reset: function() {
let oldStatus = this.verificationStatus;
this.verificationStatus = AuthPromptStatus.NOT_VERIFYING;
if (oldStatus == AuthPromptStatus.VERIFYING)
this._userVerifier.cancel();
this._queryingService = null;
this.clear();
this._message.opacity = 0;
this.setUser(null);
this.stopSpinning();
if (oldStatus == AuthPromptStatus.VERIFICATION_FAILED)
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);
this.emit('reset');
},
addCharacter: function(unichar) {
@ -470,18 +412,13 @@ const AuthPrompt = new Lang.Class({
this._entry.clutter_text.insert_unichar(unichar);
},
begin: function(params) {
params = Params.parse(params, { userName: null,
hold: null });
begin: function() {
this.updateSensitivity(false);
this._userVerifier.begin();
},
let hold = params.hold;
if (!hold)
hold = new Batch.Hold();
this._userVerifier.begin(params.userName, hold);
this.verificationStatus = AuthPromptStatus.VERIFYING;
needsUsername: function() {
this._userVerifier.begin(userName);
},
finish: function(onComplete) {
@ -499,7 +436,6 @@ const AuthPrompt = new Lang.Class({
cancel: function() {
this.reset();
this.emit('cancelled');
}
});
Signals.addSignalMethods(AuthPrompt.prototype);

View File

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

View File

@ -119,6 +119,14 @@ function cloneAndFadeOutActor(actor) {
return hold;
}
const VerificationStatus = {
NOT_VERIFYING: 0,
ASKING_FOR_USERNAME: 1,
VERIFYING: 2,
VERIFICATION_FAILED: 3,
VERIFICATION_SUCCEEDED: 4,
};
const ShellUserVerifier = new Lang.Class({
Name: 'ShellUserVerifier',
@ -128,10 +136,9 @@ const ShellUserVerifier = new Lang.Class({
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',
Lang.bind(this, this._updateDefaultService));
this._updateDefaultService();
this._fprintManager = new Fprint.FprintManager();
this._smartcardManager = SmartcardManager.getSmartcardManager();
@ -152,45 +159,69 @@ const ShellUserVerifier = new Lang.Class({
this.hasPendingMessages = false;
this.reauthenticating = false;
this._failCounter = 0;
this._oVirtCredentialsManager = OVirt.getOVirtCredentialsManager();
this._oVirtCredentialsManager.connect('user-authenticated', Lang.bind(this, this._oVirtUserAuthenticated));
if (this._oVirtCredentialsManager.hasToken())
this._oVirtUserAuthenticated(this._oVirtCredentialsManager.getToken());
this._oVirtCredentialsManager.connect('user-authenticated',
Lang.bind(this, this._oVirtUserAuthenticated));
this._reset();
},
begin: function(userName, hold) {
this._cancellable = new Gio.Cancellable();
this._hold = hold;
_reset: function() {
// Clear previous attempts to authenticate
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._beginAuthentication();
},
_beginAuthentication: function() {
this.verificationStatus = VerificationStatus.VERIFYING;
this._cancellable = new Gio.Cancellable();
this.reauthenticating = false;
this._checkForFingerprintReader();
if (userName) {
if (this._userName) {
// If possible, reauthenticate an already running session,
// 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));
} else {
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() {
if (this._cancellable) {
this._cancellable.cancel();
@ -198,6 +229,7 @@ const ShellUserVerifier = new Lang.Class({
}
if (this._userVerifier) {
this._userVerifier.call_cancel_sync(null);
this._userVerifier.run_dispose();
this._userVerifier = null;
}
@ -205,24 +237,29 @@ const ShellUserVerifier = new Lang.Class({
this._clearMessageQueue();
},
answerQuery: function(serviceName, answer) {
if (!this.hasPendingMessages) {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
_doAfterPendingMessages: function(func) {
if (this.hasPendingMessages) {
let signalId = this.connect('no-more-messages', Lang.bind(this, function() {
this.disconnect(signalId);
func();
}));
} else {
let signalId = this.connect('no-more-messages',
Lang.bind(this, function() {
this.disconnect(signalId);
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
func();
}
},
answerQuery: function(serviceName, answer) {
this._doAfterPendingMessages(Lang.bind(this, function() {
this._userVerifier.call_answer_query(serviceName, answer, this._cancellable, null);
}));
},
_getIntervalForMessage: function(message) {
// We probably could be smarter here
return message.length * USER_READ_TIME;
},
finishMessageQueue: function() {
_finishMessageQueue: function() {
if (!this.hasPendingMessages)
return;
@ -234,7 +271,7 @@ const ShellUserVerifier = new Lang.Class({
_queueMessageTimeout: function() {
if (this._messageQueue.length == 0) {
this.finishMessageQueue();
this._finishMessageQueue();
return;
}
@ -252,7 +289,6 @@ const ShellUserVerifier = new Lang.Class({
this._queueMessageTimeout();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._messageQueueTimeoutId, '[gnome-shell] this._queueMessageTimeout');
},
_queueMessage: function(message, messageType) {
@ -264,7 +300,7 @@ const ShellUserVerifier = new Lang.Class({
},
_clearMessageQueue: function() {
this.finishMessageQueue();
this._finishMessageQueue();
if (this._messageQueueTimeoutId != 0) {
GLib.source_remove(this._messageQueueTimeoutId);
@ -289,9 +325,9 @@ const ShellUserVerifier = new Lang.Class({
}));
},
_oVirtUserAuthenticated: function(token) {
this._preemptingService = OVIRT_SERVICE_NAME;
this.emit('ovirt-user-authenticated');
_oVirtUserAuthenticated: function() {
if (this.verificationStatus != GdmUtil.VerificationStatus.VERIFICATION_SUCCEEDED)
this._reset();
},
_checkForSmartcard: function() {
@ -299,26 +335,34 @@ const ShellUserVerifier = new Lang.Class({
if (!this._settings.get_boolean(SMARTCARD_AUTHENTICATION_KEY))
smartcardDetected = false;
else if (this._reauthOnly)
else if (this.reauthenticating)
smartcardDetected = this._smartcardManager.hasInsertedLoginToken();
else
smartcardDetected = this._smartcardManager.hasInsertedTokens();
if (smartcardDetected != this.smartcardDetected) {
this.smartcardDetected = smartcardDetected;
if (this._smartcardDetected == smartcardDetected)
return;
if (this.smartcardDetected)
this._preemptingService = SMARTCARD_SERVICE_NAME;
else if (this._preemptingService == SMARTCARD_SERVICE_NAME)
this._preemptingService = null;
this._smartcardDetected = smartcardDetected;
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) {
logError(error, where);
this._hold.release();
this._queueMessage(_("Authentication error"), MessageType.ERROR);
this._verificationFailed(false);
@ -344,7 +388,6 @@ const ShellUserVerifier = new Lang.Class({
this.reauthenticating = true;
this._connectSignals();
this._beginVerification();
this._hold.release();
},
_userVerifierGot: function(client, result) {
@ -359,7 +402,6 @@ const ShellUserVerifier = new Lang.Class({
this._connectSignals();
this._beginVerification();
this._hold.release();
},
_connectSignals: function() {
@ -373,31 +415,32 @@ const ShellUserVerifier = new Lang.Class({
},
_getForegroundService: function() {
if (this._preemptingService)
return this._preemptingService;
if (this._oVirtCredentialsManager.hasToken())
return OVIRT_SERVICE_NAME;
if (this._smartcardDetected)
return SMARTCARD_SERVICE_NAME;
return this._defaultService;
},
serviceIsForeground: function(serviceName) {
_serviceIsForeground: function(serviceName) {
return serviceName == this._getForegroundService();
},
serviceIsDefault: function(serviceName) {
_serviceIsDefault: function(serviceName) {
return serviceName == this._defaultService;
},
_updateDefaultService: function() {
if (this._settings.get_boolean(PASSWORD_AUTHENTICATION_KEY))
this._defaultService = PASSWORD_SERVICE_NAME;
else if (this.smartcardDetected)
else if (this._smartcardDetected)
this._defaultService = SMARTCARD_SERVICE_NAME;
else if (this._haveFingerprintReader)
this._defaultService = FINGERPRINT_SERVICE_NAME;
},
_startService: function(serviceName) {
this._hold.acquire();
if (this._userName) {
this._userVerifier.call_begin_verification_for_user(serviceName,
this._userName,
@ -411,8 +454,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification for user', e);
return;
}
this._hold.release();
}));
} else {
this._userVerifier.call_begin_verification(serviceName,
@ -426,8 +467,6 @@ const ShellUserVerifier = new Lang.Class({
this._reportInitError('Failed to start verification', e);
return;
}
this._hold.release();
}));
}
},
@ -435,12 +474,12 @@ const ShellUserVerifier = new Lang.Class({
_beginVerification: function() {
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);
},
_onInfo: function(client, serviceName, info) {
if (this.serviceIsForeground(serviceName)) {
if (this._serviceIsForeground(serviceName)) {
this._queueMessage(info, MessageType.INFO);
} else if (serviceName == FINGERPRINT_SERVICE_NAME &&
this._haveFingerprintReader) {
@ -455,21 +494,21 @@ const ShellUserVerifier = new Lang.Class({
},
_onProblem: function(client, serviceName, problem) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
this._queueMessage(problem, MessageType.ERROR);
},
_onInfoQuery: function(client, serviceName, question) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
this.emit('ask-question', serviceName, question, '');
},
_onSecretInfoQuery: function(client, serviceName, secretQuestion) {
if (!this.serviceIsForeground(serviceName))
if (!this._serviceIsForeground(serviceName))
return;
if (serviceName == OVIRT_SERVICE_NAME) {
@ -482,24 +521,11 @@ const ShellUserVerifier = new Lang.Class({
},
_onReset: function() {
// Clear previous attempts to authenticate
this._failCounter = 0;
this._updateDefaultService();
this.emit('reset');
this._reset();
},
_onVerificationComplete: function() {
this.emit('verification-complete');
},
_cancelAndReset: function() {
this.cancel();
this._onReset();
},
_retry: function() {
this.begin(this._userName, new Batch.Hold());
this.verificationStatus = VerificationStatus.VERIFICATION_SUCCEEDED;
},
_verificationFailed: function(retry) {
@ -512,38 +538,23 @@ const ShellUserVerifier = new Lang.Class({
let canRetry = retry && this._userName &&
this._failCounter < this._settings.get_int(ALLOWED_FAILURES_KEY);
if (canRetry) {
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.verificationStatus = VerificationStatus.VERIFICATION_FAILED;
this.emit('verification-failed');
this._doAfterPendingMessages(Lang.bind(this, function() {
if (canRetry)
this._beginAuthentication();
else
this.clear();
}));
},
_onConversationStopped: function(client, serviceName) {
// If the login failed with the preauthenticated oVirt credentials
// then discard the credentials and revert to default authentication
// mechanism.
if (this.serviceIsForeground(OVIRT_SERVICE_NAME)) {
if (this._serviceIsForeground(OVIRT_SERVICE_NAME)) {
this._oVirtCredentialsManager.resetToken();
this._preemptingService = null;
this._verificationFailed(false);
return;
}
@ -551,7 +562,7 @@ const ShellUserVerifier = new Lang.Class({
// if the password service fails, then cancel everything.
// But if, e.g., fingerprint fails, still give
// password authentication a chance to succeed
if (this.serviceIsForeground(serviceName)) {
if (this._serviceIsForeground(serviceName)) {
this._verificationFailed(true);
}
},

View File

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

View File

@ -39,13 +39,39 @@ const SystemdLoginSessionIface = '<node> \
<interface name="org.freedesktop.login1.Session"> \
<signal name="Lock" /> \
<signal name="Unlock" /> \
<property name="Active" type="b" access="read" /> \
<property name="Active" access="readonly" /> \
</interface> \
</node>';
const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface);
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() {
return GLib.access("/run/systemd/seats", 0) >= 0;
}
@ -75,7 +101,7 @@ function canLock() {
-1, null);
let version = result.deep_unpack()[0].deep_unpack();
return haveSystemd() && versionCompare('3.5.91', version);
return versionCompare('3.5.91', version);
} catch(e) {
return false;
}
@ -93,7 +119,7 @@ function getLoginManager() {
if (haveSystemd())
_loginManager = new LoginManagerSystemd();
else
_loginManager = new LoginManagerDummy();
_loginManager = new LoginManagerConsoleKit();
}
return _loginManager;
@ -110,6 +136,9 @@ const LoginManagerSystemd = new Lang.Class({
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) {
if (this._currentSession) {
callback (this._currentSession);
@ -162,7 +191,7 @@ const LoginManagerSystemd = new Lang.Class({
let fd = -1;
try {
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 }));
} catch(e) {
logError(e, "Error getting systemd inhibitor");
@ -177,13 +206,35 @@ const LoginManagerSystemd = new Lang.Class({
});
Signals.addSignalMethods(LoginManagerSystemd.prototype);
const LoginManagerDummy = new Lang.Class({
Name: 'LoginManagerDummy',
const LoginManagerConsoleKit = new Lang.Class({
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) {
// we could return a DummySession object that fakes whatever callers
// expect (at the time of writing: connect() and connectSignal()
// methods), but just never calling the callback should be safer
if (this._currentSession) {
callback (this._currentSession);
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) {
@ -203,4 +254,4 @@ const LoginManagerDummy = new Lang.Class({
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
// because then we lose the parent-child relationship, which
// 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:

View File

@ -167,8 +167,6 @@ const AppSwitcherPopup = new Lang.Class({
this._select(this._selectedIndex, this._nextWindow());
else if (keysym == Clutter.Up)
this._select(this._selectedIndex, null, true);
else
return Clutter.EVENT_PROPAGATE;
} else {
if (keysym == Clutter.Left)
this._select(this._previous());
@ -176,11 +174,7 @@ const AppSwitcherPopup = new Lang.Class({
this._select(this._next());
else if (keysym == Clutter.Down)
this._select(this._selectedIndex, 0);
else
return Clutter.EVENT_PROPAGATE;
}
return Clutter.EVENT_STOP;
},
_scrollHandler: function(direction) {
@ -311,7 +305,6 @@ const AppSwitcherPopup = new Lang.Class({
this._thumbnailTimeoutId = Mainloop.timeout_add (
THUMBNAIL_POPUP_TIME,
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) {
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() {
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() {
@ -410,11 +403,7 @@ const WindowSwitcherPopup = new Lang.Class({
this._select(this._previous());
else if (keysym == Clutter.Right)
this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
}
return Clutter.EVENT_STOP;
},
_finish: function() {
@ -456,10 +445,11 @@ const AppSwitcher = new Lang.Class({
this._arrows = [];
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()
: 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
for (let i = 0; i < apps.length; i++) {
@ -566,7 +556,6 @@ const AppSwitcher = new Lang.Class({
this._mouseTimeOutId = 0;
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._mouseTimeOutId, '[gnome-shell] this._enterItem');
} else
this._itemEntered(index);
},

View File

@ -21,9 +21,7 @@ const Animation = new Lang.Class({
this._isPlaying = false;
this._timeoutId = 0;
this._frame = 0;
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height, scaleFactor,
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
Lang.bind(this, this._animationsLoaded));
this.actor.set_child(this._animations);
},
@ -34,7 +32,6 @@ const Animation = new Lang.Class({
this._showFrame(0);
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;

View File

@ -16,7 +16,6 @@ const Atk = imports.gi.Atk;
const AppFavorites = imports.ui.appFavorites;
const BoxPointer = imports.ui.boxpointer;
const DND = imports.ui.dnd;
const GrabHelper = imports.ui.grabHelper;
const IconGrid = imports.ui.iconGrid;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
@ -42,7 +41,9 @@ const MIN_FREQUENT_APPS_COUNT = 3;
const INDICATORS_BASE_TIME = 0.25;
const INDICATORS_ANIMATION_DELAY = 0.125;
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 VIEWS_SWITCH_TIME = 0.4;
@ -80,10 +81,6 @@ function _getFolderName(folder) {
return name;
}
function clamp(value, min, max) {
return Math.max(min, Math.min(max, value));
}
const BaseAppView = new Lang.Class({
Name: 'BaseAppView',
Abstract: true,
@ -102,9 +99,6 @@ const BaseAppView = new Lang.Class({
else
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
this._grid.actor.x_expand = true;
@ -112,10 +106,6 @@ const BaseAppView = new Lang.Class({
this._allItems = [];
},
_keyFocusIn: function(actor) {
// Nothing by default
},
removeAll: function() {
this._grid.destroyAll();
this._items = {};
@ -371,7 +361,7 @@ const AllView = new Lang.Class({
Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, function() {
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() {
Main.queueDeferredWork(this._redisplayWorkId);
}));
@ -442,8 +432,8 @@ const AllView = new Lang.Class({
},
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)
return;
if (this._displayingPopup && this._currentPopup)
@ -475,12 +465,14 @@ const AllView = new Lang.Class({
// longer than PAGE_SWITCH_TIME
time = Math.min(time, PAGE_SWITCH_TIME);
this._currentPage = pageNumber;
Tweener.addTween(this._adjustment,
{ value: this._grid.getPageY(this._currentPage),
time: time,
transition: 'easeOutQuad' });
this._pageIndicators.setCurrentPage(pageNumber);
if (pageNumber < this._grid.nPages() && pageNumber >= 0) {
this._currentPage = pageNumber;
Tweener.addTween(this._adjustment,
{ value: this._grid.getPageY(this._currentPage),
time: time,
transition: 'easeOutQuad' });
this._pageIndicators.setCurrentPage(pageNumber);
}
},
_diffToPage: function (pageNumber) {
@ -527,19 +519,15 @@ const AllView = new Lang.Class({
_onPanEnd: function(action) {
if (this._displayingPopup)
return;
let pageHeight = this._grid.getPageHeight();
// Calculate the scroll value we'd be at, which is our current
// scroll plus any velocity the user had when they released
// their finger.
let velocity = -action.get_velocity(0)[2];
let endPanValue = this._adjustment.value + velocity;
let closestPage = Math.round(endPanValue / pageHeight);
this.goToPage(closestPage);
let diffCurrentPage = this._diffToPage(this._currentPage);
if (diffCurrentPage > this._scrollView.height * PAGE_SWITCH_TRESHOLD) {
if (action.get_velocity(0)[2] > 0)
this.goToPage(this._currentPage - 1);
else
this.goToPage(this._currentPage + 1);
} else {
this.goToPage(this._currentPage);
}
this._panning = false;
},
@ -570,7 +558,7 @@ const AllView = new Lang.Class({
}));
},
_keyFocusIn: function(icon) {
_ensureIconVisible: function(icon) {
let itemPage = this._grid.getItemPage(icon);
this.goToPage(itemPage);
},
@ -741,7 +729,7 @@ const AppDisplay = new Lang.Class({
Name: 'AppDisplay',
_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',
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,
layout_manager: this._viewStackLayout });
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 });
this._controls = new St.Widget({ style_class: 'app-view-controls',
layout_manager: layout });
@ -941,28 +929,20 @@ const FolderView = new Lang.Class({
this.actor.add_action(action);
},
_keyFocusIn: function(actor) {
Util.ensureActorVisibleInScrollView(this.actor, actor);
},
createFolderIcon: function(size) {
let layout = new Clutter.TableLayout();
let icon = new St.Widget({ layout_manager: layout,
style_class: 'app-folder-icon' });
layout.hookup_style(icon);
let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
let numItems = this._allItems.length;
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
for (let i = 0; i < 4; i++) {
let bin;
if (i < numItems) {
let texture = this._allItems[i].app.create_icon_texture(subSize);
bin = new St.Bin({ child: texture });
} else {
bin = new St.Bin({ width: subSize, height: subSize });
}
layout.pack(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2));
let aligns = [ Clutter.ActorAlign.START, Clutter.ActorAlign.END ];
for (let i = 0; i < Math.min(this._allItems.length, 4); i++) {
let texture = this._allItems[i].app.create_icon_texture(subSize);
let bin = new St.Bin({ child: texture,
x_expand: true, y_expand: true });
bin.set_x_align(aligns[i % 2]);
bin.set_y_align(aligns[Math.floor(i / 2)]);
layout.pack(bin, i % 2, Math.floor(i / 2));
}
return icon;
@ -1251,8 +1231,18 @@ const AppFolderPopup = new Lang.Class({
function() {
this.actor.destroy();
}));
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
this._grabHelper.addActor(Main.layoutManager.overviewGroup);
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
},
_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() {
@ -1266,12 +1256,6 @@ const AppFolderPopup = new Lang.Class({
if (this._isOpen)
return;
this._isOpen = this._grabHelper.grab({ actor: this.actor,
onUngrab: Lang.bind(this, this.popdown) });
if (!this._isOpen)
return;
this.actor.show();
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._isOpen = true;
this.emit('open-state-changed', true);
},
@ -1287,8 +1272,6 @@ const AppFolderPopup = new Lang.Class({
if (!this._isOpen)
return;
this._grabHelper.ungrab({ actor: this.actor });
this._boxPointer.hide(BoxPointer.PopupAnimation.FADE |
BoxPointer.PopupAnimation.SLIDE);
this._isOpen = false;
@ -1405,7 +1388,6 @@ const AppIcon = new Lang.Class({
this.popupMenu();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
} else if (button == 3) {
this.popupMenu();
return Clutter.EVENT_STOP;
@ -1601,26 +1583,6 @@ const AppIconMenu = new Lang.Class({
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);
},
_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) {
params = Params.parse(params, { monitorIndex: 0,
style: null,
@ -159,28 +140,27 @@ const BackgroundCache = new Lang.Class({
cancellable: 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++) {
let fileLoad = this._pendingFileLoads[i];
if (fileLoad.filename == params.filename &&
fileLoad.style == params.style) {
this._attachCallerToFileLoad(caller, fileLoad);
if (this._pendingFileLoads[i].filename == params.filename &&
this._pendingFileLoads[i].style == params.style) {
this._pendingFileLoads[i].callers.push({ shouldCopy: true,
monitorIndex: params.monitorIndex,
effects: params.effects,
onFinished: params.onFinished });
return;
}
}
let fileLoad = { filename: params.filename,
style: params.style,
cancellable: new Gio.Cancellable(),
callers: [] };
this._attachCallerToFileLoad(caller, fileLoad);
this._pendingFileLoads.push({ filename: params.filename,
style: params.style,
callers: [{ shouldCopy: false,
monitorIndex: params.monitorIndex,
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,
params.style,
@ -191,26 +171,35 @@ const BackgroundCache = new Lang.Class({
content.load_file_finish(result);
this._monitorFile(params.filename);
this._images.push(content);
} catch(e) {
content = null;
}
for (let i = 0; i < fileLoad.callers.length; i++) {
let caller = fileLoad.callers[i];
if (caller.onFinished) {
let newContent;
for (let i = 0; i < this._pendingFileLoads.length; i++) {
let pendingLoad = this._pendingFileLoads[i];
if (pendingLoad.filename != params.filename ||
pendingLoad.style != params.style)
continue;
if (content) {
newContent = content.copy(caller.monitorIndex, caller.effects);
this._images.push(newContent);
for (let j = 0; j < pendingLoad.callers.length; j++) {
if (pendingLoad.callers[j].onFinished) {
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(idx, 1);
this._pendingFileLoads.splice(i, 1);
}
}));
},
@ -271,11 +260,10 @@ const BackgroundCache = new Lang.Class({
if (this._animationFilename == params.filename) {
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);
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;
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);
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;
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');
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this.emit');
},
_loadPattern: function() {
@ -535,7 +521,6 @@ const Background = new Lang.Class({
this._updateAnimation();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._updateAnimationTimeoutId, '[gnome-shell] this._updateAnimation');
},
_loadAnimation: function(filename) {
@ -725,7 +710,7 @@ const BackgroundManager = new Lang.Class({
controlPosition: true,
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._layoutManager = params.layoutManager;
this._effects = params.effects;
@ -758,18 +743,17 @@ const BackgroundManager = new Lang.Class({
Lang.bind(this, function() {
newBackground.disconnect(newBackground.loadedSignalId);
newBackground.loadedSignalId = 0;
if (this._newBackground != newBackground) {
/* Not interesting, we queued another load */
newBackground.actor.destroy();
return;
}
Tweener.addTween(this.background.actor,
{ opacity: 0,
time: FADE_ANIMATION_TIME,
transition: 'easeOutQuad',
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 = newBackground;
this._newBackground = null;

View File

@ -35,7 +35,7 @@ function addBackgroundMenu(actor, layoutManager) {
function openMenu() {
let [x, y] = global.get_pointer();
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
Main.layoutManager.setDummyCursorPosition(x, y);
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 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
const CLOCK_FORMAT_KEY = 'clock-format';
@ -383,14 +380,14 @@ const Calendar = new Lang.Class({
_init: function() {
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._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
// Find the ordering for month/year in the calendar heading
this._headerFormatWithoutYear = '%B';
switch (gtk30_('calendar:MY')) {
switch (Gettext_gtk30.gettext('calendar:MY')) {
case 'calendar:MY':
this._headerFormat = '%B %Y';
break;
@ -408,9 +405,9 @@ const Calendar = new Lang.Class({
this._shouldDateGrabFocus = false;
this.actor = new St.Widget({ style_class: 'calendar',
layout_manager: new Clutter.TableLayout(),
reactive: true });
this.actor = new St.Table({ homogeneous: false,
style_class: 'calendar',
reactive: true });
this.actor.connect('scroll-event',
Lang.bind(this, this._onScroll));
@ -423,10 +420,8 @@ const Calendar = new Lang.Class({
setEventSource: function(eventSource) {
this._eventSource = eventSource;
this._eventSource.connect('changed', Lang.bind(this, function() {
this._rebuildCalendar();
this._update();
}));
this._rebuildCalendar();
this._update();
},
@ -441,14 +436,13 @@ const Calendar = new Lang.Class({
},
_buildHeader: function() {
let layout = this.actor.layout_manager;
let offsetCols = this._useWeekdate ? 1 : 0;
this.actor.destroy_all_children();
// Top line of the calendar '<| September 2009 |>'
this._topBox = new St.BoxLayout();
layout.pack(this._topBox, 0, 0);
layout.set_span(this._topBox, offsetCols + 7, 1);
this.actor.add(this._topBox,
{ row: 0, col: 0, col_span: offsetCols + 7 });
this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
accessible_name: _("Previous month"),
@ -480,12 +474,10 @@ const Calendar = new Lang.Class({
let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay());
let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading',
text: customDayAbbrev });
let col;
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
else
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.pack(label, col, 1);
this.actor.add(label,
{ row: 1,
col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7,
x_fill: false, x_align: St.Align.MIDDLE });
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);
let layout = this.actor.layout_manager;
let iter = new Date(beginDate);
let row = 2;
// nRows here means 6 weeks + one header + one navbar
@ -652,19 +643,16 @@ const Calendar = new Lang.Class({
button.style_class = styleClass;
let offsetCols = this._useWeekdate ? 1 : 0;
let col;
if (rtl)
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
else
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
layout.pack(button, col, row);
this.actor.add(button,
{ row: row, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7 });
this._buttons.push(button);
if (this._useWeekdate && iter.getDay() == 4) {
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
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);
@ -707,12 +695,9 @@ const EventsList = new Lang.Class({
Name: 'EventsList',
_init: function() {
let layout = new Clutter.TableLayout();
this.actor = new St.Widget({ style_class: 'events-table',
layout_manager: layout });
layout.hookup_style(this.actor);
this.actor = new St.Table({ style_class: 'events-table' });
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._weekStart = Shell.util_get_week_start();
},
@ -734,13 +719,9 @@ const EventsList = new Lang.Class({
dayLabel.clutter_text.line_wrap = false;
dayLabel.clutter_text.ellipsize = false;
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
let layout = this.actor.layout_manager;
layout.pack(dayLabel, rtl ? 2 : 0, index);
layout.child_set(dayLabel, { x_expand: false,
x_align: Clutter.TableAlignment.END,
y_align: Clutter.TableAlignment.START });
this.actor.add(dayLabel, { row: index, col: 0,
x_expand: false, x_align: St.Align.END,
y_fill: false, y_align: St.Align.START });
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
let timeString = _formatEventTime(event, clockFormat);
@ -749,17 +730,18 @@ const EventsList = new Lang.Class({
timeLabel.clutter_text.line_wrap = false;
timeLabel.clutter_text.ellipsize = false;
layout.pack(timeLabel, 1, index);
layout.child_set(timeLabel, { x_expand: false,
y_align: Clutter.TableAlignment.START });
this.actor.add(timeLabel, { row: index, col: 1,
x_expand: false, x_align: St.Align.MIDDLE,
y_fill: false, y_align: St.Align.START });
let titleLabel = new St.Label({ style_class: 'events-day-task',
text: event.summary });
titleLabel.clutter_text.line_wrap = true;
titleLabel.clutter_text.ellipsize = false;
layout.pack(titleLabel, rtl ? 0 : 2, index);
layout.child_set(titleLabel, { x_expand: true });
this.actor.add(titleLabel, { row: index, col: 2,
x_expand: true, x_align: St.Align.START,
y_fill: false, y_align: St.Align.START });
},
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
@ -768,10 +750,13 @@ const EventsList = new Lang.Class({
if (events.length == 0 && !showNothingScheduled)
return index;
let label = new St.Label({ style_class: 'events-day-header', text: header });
let layout = this.actor.layout_manager;
layout.pack(label, 0, index);
layout.child_set(label, { column_span: 3, x_expand: false });
this.actor.add(new St.Label({ style_class: 'events-day-header', text: header }),
{ row: index, col: 0, col_span: 3,
// In theory, x_expand should be true here, but x_expand
// 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++;
for (let n = 0; n < events.length; n++) {

View File

@ -23,7 +23,7 @@ const AutomountManager = new Lang.Class({
Name: 'AutomountManager',
_init: function() {
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
this._volumeQueue = [];
this._session = new GnomeSession.SessionManager();
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._mountAllId = Mainloop.idle_add(Lang.bind(this, this._startupMountAll));
GLib.Source.set_name_by_id(this._mountAllId, '[gnome-shell] this._startupMountAll');
},
disable: function() {
@ -235,11 +234,10 @@ const AutomountManager = new Lang.Class({
},
_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;
return GLib.SOURCE_REMOVE;
});
GLib.Source.set_name_by_id(id, '[gnome-shell] volume.allowAutorun');
}
});
const Component = AutomountManager;

View File

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

View File

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

View File

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

View File

@ -87,7 +87,7 @@ const CtrlAltTabManager = new Lang.Class({
if (Main.sessionMode.hasWindows && !Main.overview.visible) {
let screen = global.screen;
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 textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) {
@ -165,10 +165,6 @@ const CtrlAltTabPopup = new Lang.Class({
this._select(this._previous());
else if (keysym == Clutter.Right)
this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
return Clutter.EVENT_STOP;
},
_finish : function(time) {

View File

@ -582,7 +582,6 @@ const Dash = new Lang.Class({
this._showLabelTimeoutId = 0;
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._showLabelTimeoutId, '[gnome-shell] item.showLabel');
if (this._resetHoverTimeoutId > 0) {
Mainloop.source_remove(this._resetHoverTimeoutId);
this._resetHoverTimeoutId = 0;
@ -600,7 +599,6 @@ const Dash = new Lang.Class({
this._resetHoverTimeoutId = 0;
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 Calendar = imports.ui.calendar;
function _onVertSepRepaint(area) {
function _onVertSepRepaint (area)
{
let cr = area.get_context();
let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size();
@ -32,7 +33,7 @@ function _onVertSepRepaint(area) {
cr.setLineWidth(stippleWidth);
cr.stroke();
cr.$dispose();
}
};
const DateMenuButton = new Lang.Class({
Name: 'DateMenuButton',
@ -62,11 +63,8 @@ const DateMenuButton = new Lang.Class({
hbox.add(vbox);
// 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',
reactive: false
can_focus: true,
});
this._date.connect('clicked',
Lang.bind(this, function() {
@ -84,9 +82,6 @@ const DateMenuButton = new Lang.Class({
// and the calender makes those dates unclickable when instantiated with
// a null event source
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);
@ -137,13 +132,6 @@ const DateMenuButton = new Lang.Class({
this._sessionUpdated();
},
_isToday: function(date) {
let now = new Date();
return now.getYear() == date.getYear() &&
now.getMonth() == date.getMonth() &&
now.getDay() == date.getDay();
},
_appInstalledChanged: function() {
this._calendarApp = undefined;
this._updateEventsVisibility();

View File

@ -395,7 +395,6 @@ const _Draggable = new Lang.Class({
this._updateHoverId = GLib.idle_add(GLib.PRIORITY_DEFAULT,
Lang.bind(this, this._updateDragHover));
GLib.Source.set_name_by_id(this._updateHoverId, '[gnome-shell] this._updateDragHover');
},
_updateDragPosition : function (event) {

View File

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

View File

@ -5,8 +5,6 @@ imports.gi.versions.Gio = '2.0';
imports.gi.versions.Gdk = '3.0';
imports.gi.versions.GdkPixbuf = '2.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 Gettext = imports.gettext;
@ -47,11 +45,8 @@ function _patchLayoutClass(layoutClass, styleProps) {
layoutClass.prototype.hookup_style = function(container) {
container.connect('style-changed', Lang.bind(this, function() {
let node = container.get_theme_node();
for (let prop in styleProps) {
let [found, length] = node.lookup_length(styleProps[prop], false);
if (found)
this[prop] = length;
}
for (let prop in styleProps)
this[prop] = node.get_length(styleProps[prop]);
}));
};
layoutClass.prototype.child_set = function(actor, props) {

View File

@ -32,9 +32,11 @@ const FocusCaretTracker = new Lang.Class({
Name: 'FocusCaretTracker',
_init: function() {
Atspi.init();
Atspi.set_timeout(250, 250);
this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
this._atspiInited = false;
this._focusListenerRegistered = false;
this._caretListenerRegistered = false;
},
@ -46,20 +48,12 @@ const FocusCaretTracker = new Lang.Class({
this.emit('caret-moved', event);
},
_initAtspi: function() {
if (!this._atspiInited) {
Atspi.init();
Atspi.set_timeout(250, 250);
this._atspiInited = true;
}
},
registerFocusListener: function() {
if (this._focusListenerRegistered)
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 + ':selected');
this._focusListenerRegistered = true;
@ -69,8 +63,6 @@ const FocusCaretTracker = new Lang.Class({
if (this._caretListenerRegistered)
return;
this._initAtspi();
this._atspiListener.register(CARETMOVED);
this._caretListenerRegistered = true;
},

View File

@ -155,7 +155,7 @@ const CandidatePopup = new Lang.Class({
panelService.connect('set-cursor-location',
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)
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-height', Lang.bind(this, this._getPreferredHeight));
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) {
@ -522,6 +508,11 @@ const IconGrid = new Lang.Class({
this._fixedHItemSize = Math.max(this._hItemSize - 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);
}
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
_updateChildrenScale: function(scale) {
let newIconSize = Math.floor(ICON_SIZE * scale);
for (let i in this._items) {
let newIconSize = Math.floor(ICON_SIZE * scale);
this._items[i].icon.setIconSize(newIconSize);
}
}
});
Signals.addSignalMethods(IconGrid.prototype);
const PaginatedIconGrid = new Lang.Class({
Name: 'PaginatedIconGrid',
@ -640,10 +630,6 @@ const PaginatedIconGrid = new Lang.Class({
return this._nPages;
},
getPageHeight: function() {
return this._availableHeightPerPageForItems();
},
getPageY: function(pageNumber) {
if (!this._nPages)
return 0;

View File

@ -161,9 +161,9 @@ const Keyboard = new Lang.Class({
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._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._settingsChanged();
@ -266,14 +266,12 @@ const Keyboard = new Lang.Class({
return;
}
if (!this._showIdleId) {
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() {
this.Show(time);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._showIdleId, '[gnome-shell] this.Show');
}
if (!this._showIdleId)
this._showIdleId = GLib.idle_add(GLib.PRIORITY_DEFAULT_IDLE,
Lang.bind(this, function() {
this.Show(time);
return GLib.SOURCE_REMOVE;
}));
},
_createLayersForGroup: function (gname) {
@ -502,7 +500,6 @@ const Keyboard = new Lang.Class({
this._show(monitor);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
},
_show: function(monitor) {
@ -529,7 +526,6 @@ const Keyboard = new Lang.Class({
this._hide();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._keyboardRestingId, '[gnome-shell] this._clearKeyboardRestTimer');
},
_hide: function() {

View File

@ -4,6 +4,7 @@ const Clutter = imports.gi.Clutter;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const Signals = imports.signals;
@ -212,10 +213,6 @@ const LayoutManager = new Lang.Class({
this.addChrome(this.trayBox);
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',
reactive: true,
track_hover: true });
@ -223,7 +220,7 @@ const LayoutManager = new Lang.Class({
this._keyboardHeightNotifyId = 0;
// 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.uiGroup.add_actor(this.dummyCursor);
@ -603,7 +600,7 @@ const LayoutManager = new Lang.Class({
this._updateBackgrounds();
// 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.trayBox.hide();
@ -628,11 +625,10 @@ const LayoutManager = new Lang.Class({
// until the event loop is uncontended and idle.
// This helps to prevent us from running the animation
// 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();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._startupAnimation');
},
_startupAnimation: function() {
@ -729,7 +725,7 @@ const LayoutManager = new Lang.Class({
this._updateRegions();
},
// setDummyCursorGeometry:
// setDummyCursorPosition:
//
// The cursor dummy is a standard widget commonly used for popup
// 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
// 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
// position and has the right size.
setDummyCursorGeometry: function(x, y, w, h) {
// position.
setDummyCursorPosition: function(x, y) {
this.dummyCursor.set_position(Math.round(x), Math.round(y));
this.dummyCursor.set_size(Math.round(w), Math.round(h));
},
// addChrome:
@ -912,8 +907,8 @@ const LayoutManager = new Lang.Class({
return;
if (!this._updateRegionIdle)
this._updateRegionIdle = Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
Lang.bind(this, this._updateRegions));
this._updateRegionIdle = Mainloop.idle_add(Lang.bind(this, this._updateRegions),
Meta.PRIORITY_BEFORE_REDRAW);
},
_getWindowActorsForWorkspace: function(workspace) {
@ -944,7 +939,7 @@ const LayoutManager = new Lang.Class({
let rects = [], struts = [], i;
if (this._updateRegionIdle) {
Meta.later_remove(this._updateRegionIdle);
Mainloop.source_remove(this._updateRegionIdle);
delete this._updateRegionIdle;
}
@ -1017,6 +1012,23 @@ const LayoutManager = new Lang.Class({
else
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 strut = new Meta.Strut({ rect: strutRect, side: side });
struts.push(strut);

View File

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

View File

@ -797,7 +797,7 @@ const LookingGlass = new Lang.Class({
reactive: true });
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',
Lang.bind(this, this._updateFont));
this._updateFont();
@ -843,10 +843,9 @@ const LookingGlass = new Lang.Class({
System.gc();
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
gcIcon.icon_name = 'gnome-fs-trash-full';
this._timeoutId = 0;
Mainloop.source_remove(this._timeoutId);
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;
}));

View File

@ -441,8 +441,8 @@ const Magnifier = new Lang.Class({
},
_settingsInit: function(zoomRegion) {
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
this._appSettings = new Gio.Settings({ schema: APPLICATIONS_SCHEMA });
this._settings = new Gio.Settings({ schema: MAGNIFIER_SCHEMA });
if (zoomRegion) {
// 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 STICKY_KEYS_ENABLE = 'stickykeys-enable';
const GNOMESHELL_STARTED_MESSAGE_ID = 'f3ea493c22934e26811cd62abe8e203a';
let componentManager = null;
let panel = null;
@ -56,7 +55,7 @@ let screenShield = null;
let notificationDaemon = null;
let windowAttentionHandler = null;
let ctrlAltTabManager = null;
let osdWindowManager = null;
let osdWindow = null;
let sessionMode = null;
let shellDBusService = null;
let shellMountOpDBusService = null;
@ -74,6 +73,7 @@ let _startDate;
let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _a11ySettings = null;
let dynamicWorkspacesSchema = null;
function _sessionUpdated() {
_loadDefaultStylesheet();
@ -103,6 +103,9 @@ function start() {
global.logError = 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
global.connect('notify-error', function (global, msg, detail) { notifyError(msg, detail); });
@ -110,6 +113,7 @@ function start() {
sessionMode = new SessionMode.SessionMode();
sessionMode.connect('updated', _sessionUpdated);
_initializePrefs();
_initializeUI();
shellDBusService = new ShellDBus.GnomeShell();
@ -118,6 +122,17 @@ function start() {
_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() {
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem
@ -143,7 +158,7 @@ function _initializeUI() {
screencastService = new Screencast.ScreencastService();
xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
osdWindowManager = new OsdWindow.OsdWindowManager();
osdWindow = new OsdWindow.OsdWindow();
overview = new Overview.Overview();
wm = new WindowManager.WindowManager();
magnifier = new Magnifier.Magnifier();
@ -160,7 +175,7 @@ function _initializeUI() {
layoutManager.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 () {
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
@ -176,6 +191,8 @@ function _initializeUI() {
_startDate = new Date();
log('GNOME Shell started at ' + _startDate);
let perfModuleName = GLib.getenv("SHELL_PERF_MODULE");
if (perfModuleName) {
let perfOutput = GLib.getenv("SHELL_PERF_OUTPUT");
@ -186,6 +203,10 @@ function _initializeUI() {
ExtensionDownloader.init();
ExtensionSystem.init();
layoutManager.connect('startup-prepared', function() {
Meta.activate_session();
});
if (sessionMode.isGreeter && screenShield) {
layoutManager.connect('startup-prepared', function() {
screenShield.showDialog();
@ -199,17 +220,6 @@ function _initializeUI() {
if (screenShield) {
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;
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)
return;
this._prevFocusedWindow = global.display.focus_window;
this._prevKeyFocusActor = global.stage.get_key_focus();
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._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));
},
@ -365,8 +366,8 @@ const NotificationApplicationPolicy = new Lang.Class({
this.id = id;
this._canonicalId = this._canonicalizeId(id);
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
@ -503,6 +504,7 @@ const Notification = new Lang.Class({
this.bannerBodyMarkup = false;
this._bannerBodyAdded = false;
this._titleFitsInBannerMode = true;
this._titleDirection = Clutter.TextDirection.DEFAULT;
this._spacing = 0;
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
this._imageBin = null;
@ -641,11 +643,10 @@ const Notification = new Lang.Class({
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
let titleDirection;
if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL)
titleDirection = Clutter.TextDirection.RTL;
this._titleDirection = Clutter.TextDirection.RTL;
else
titleDirection = Clutter.TextDirection.LTR;
this._titleDirection = Clutter.TextDirection.LTR;
// Let the title's text direction control the overall direction
// 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
// will be allocated at the available width, so that their alignment
// 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
// 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.wm.addKeybinding('toggle-message-tray',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY |
Shell.KeyBindingMode.OVERVIEW,
Lang.bind(this, this.toggleAndNavigate));
Main.wm.addKeybinding('focus-active-notification',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.MESSAGE_TRAY |
@ -1986,7 +1987,6 @@ const MessageTray = new Lang.Class({
this._trayDwellTimeoutId = Mainloop.timeout_add(TRAY_DWELL_TIME,
Lang.bind(this, this._trayDwellTimeout));
GLib.Source.set_name_by_id(this._trayDwellTimeoutId, '[gnome-shell] this._trayDwellTimeout');
}
this._trayDwelling = true;
} else {
@ -2027,18 +2027,13 @@ const MessageTray = new Lang.Class({
_onNotificationKeyRelease: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Escape && event.get_state() == 0) {
this._expireNotification();
this._closeNotification();
return Clutter.EVENT_STOP;
}
return Clutter.EVENT_PROPAGATE;
},
_expireNotification: function() {
this._notificationExpired = true;
this._updateState();
},
_closeNotification: function() {
if (this._notificationState == State.SHOWN) {
this._closeButton.hide();
@ -2267,16 +2262,6 @@ const MessageTray = new Lang.Class({
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() {
if (this._notificationWidget.hover == this._notificationHovered)
return;
@ -2286,7 +2271,14 @@ const MessageTray = new Lang.Class({
// No dwell inside notifications at the bottom of the screen
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) {
let actorAtShowNotificationPosition =
@ -2303,7 +2295,6 @@ const MessageTray = new Lang.Class({
return;
}
}
this._pointerInNotification = true;
this._updateState();
} 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.
let timeout = this._useLongerNotificationLeftTimeout ? LONGER_HIDE_TIMEOUT * 1000 : HIDE_TIMEOUT * 1000;
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._notificationLeftTimeoutId = Mainloop.timeout_add(LONGER_HIDE_TIMEOUT * 1000,
Lang.bind(this, this._onNotificationLeftTimeout));
GLib.Source.set_name_by_id(this._notificationLeftTimeoutId, '[gnome-shell] this._onNotificationLeftTimeout');
} else {
this._notificationLeftTimeoutId = 0;
this._useLongerNotificationLeftTimeout = false;
@ -2409,7 +2398,7 @@ const MessageTray = new Lang.Class({
this._notificationTimeoutId == 0 &&
this._notification.urgency != Urgency.CRITICAL &&
!this._notification.focused &&
!this._pointerInNotification) || this._notificationExpired;
!this._pointerInNotification);
let mustClose = (this._notificationRemoved || !hasNotifications || expired || this._traySummoned);
if (mustClose) {
@ -2470,10 +2459,6 @@ const MessageTray = new Lang.Class({
this._hideDesktopClone();
this._updatingState = false;
// Clean transient variables that are used to communicate actions
// to updateState()
this._notificationExpired = false;
},
_tween: function(actor, statevar, value, params) {
@ -2630,8 +2615,6 @@ const MessageTray = new Lang.Class({
// the mouse is moving towards it or within it.
this._lastSeenMouseX = x;
this._lastSeenMouseY = y;
this._resetNotificationLeftTimeout();
},
_updateShowingNotification: function() {
@ -2676,12 +2659,10 @@ const MessageTray = new Lang.Class({
Mainloop.source_remove(this._notificationTimeoutId);
this._notificationTimeoutId = 0;
}
if (timeout > 0) {
if (timeout > 0)
this._notificationTimeoutId =
Mainloop.timeout_add(timeout,
Lang.bind(this, this._notificationTimeout));
GLib.Source.set_name_by_id(this._notificationTimeoutId, '[gnome-shell] this._notificationTimeout');
}
},
_notificationTimeout: function() {
@ -2724,7 +2705,13 @@ const MessageTray = new Lang.Class({
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) {
this._tween(this._notificationWidget, '_notificationState', State.HIDDEN,
@ -2794,12 +2781,7 @@ const MessageTray = new Lang.Class({
{ y: expandedY,
opacity: 255,
time: ANIMATION_TIME,
transition: 'easeOutQuad',
// HACK: Drive the state machine here better,
// instead of overwriting tweens
onComplete: Lang.bind(this, function() {
this._notificationState = State.SHOWN;
}),
transition: 'easeOutQuad'
});
}
},

View File

@ -41,6 +41,7 @@ const ModalDialog = new Lang.Class({
_init: function(params) {
params = Params.parse(params, { shellReactive: false,
styleClass: null,
parentActor: Main.uiGroup,
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
shouldFadeIn: true,
destroyOnClose: true });
@ -56,7 +57,7 @@ const ModalDialog = new Lang.Class({
x: 0,
y: 0,
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,
coordinate: Clutter.BindCoordinate.ALL });

View File

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

View File

@ -14,7 +14,6 @@ const Gdk = imports.gi.Gdk;
const Background = imports.ui.background;
const DND = imports.ui.dnd;
const LayoutManager = imports.ui.layout;
const Lightbox = imports.ui.lightbox;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const OverviewControls = imports.ui.overviewControls;
@ -197,7 +196,11 @@ const Overview = new Lang.Class({
Tweener.addTween(background,
{ brightness: 1.0,
vignetteSharpness: 0.0,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
Tweener.addTween(background,
{ vignetteSharpness: 0.0,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
@ -210,8 +213,12 @@ const Overview = new Lang.Class({
let background = backgrounds[i]._delegate;
Tweener.addTween(background,
{ brightness: Lightbox.VIGNETTE_BRIGHTNESS,
vignetteSharpness: Lightbox.VIGNETTE_SHARPNESS,
{ brightness: 0.8,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
Tweener.addTween(background,
{ vignetteSharpness: 0.7,
time: SHADE_ANIMATION_TIME,
transition: 'easeOutQuad'
});
@ -365,7 +372,6 @@ const Overview = new Lang.Class({
this._lastHoveredWindow = null;
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(this._windowSwitchTimeoutId, '[gnome-shell] Main.activateWindow');
}
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));
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);
},
_getAlwaysZoomOut: function() {
// 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
let alwaysZoomOut = this.actor.hover ||
this._inDrag ||
!Meta.prefs_get_dynamic_workspaces() ||
global.screen.n_workspaces > 2 ||
global.screen.get_active_workspace_index() != 0;
// actually used, e.g. there are windows on more than one
let alwaysZoomOut = this.actor.hover || this._inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2;
if (!alwaysZoomOut) {
let monitors = Main.layoutManager.monitors;

View File

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

View File

@ -41,7 +41,8 @@ const ButtonBox = new Lang.Class({
},
_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) {
[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) {
let child = actor.get_first_child();
let children = actor.get_children();
let child = children.length > 0 ? children[0] : null;
if (child) {
[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) {
let child = actor.get_first_child();
if (!child)
let children = actor.get_children();
if (children.length == 0)
return;
let child = children[0];
let [minWidth, natWidth] = child.get_preferred_width(-1);
let [minHeight, natHeight] = child.get_preferred_height(-1);
let availWidth = box.x2 - box.x1;
let availHeight = box.y2 - box.y1;

View File

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

View File

@ -46,28 +46,33 @@ function isPopupMenuItemVisible(child) {
* @side Side to which the arrow points.
*/
function arrowIcon(side) {
let iconName;
let rotation;
switch (side) {
case St.Side.TOP:
iconName = 'pan-up-symbolic';
rotation = 180;
break;
case St.Side.RIGHT:
iconName = 'pan-end-symbolic';
rotation = - 90;
break;
case St.Side.BOTTOM:
iconName = 'pan-down-symbolic';
rotation = 0;
break;
case St.Side.LEFT:
iconName = 'pan-start-symbolic';
rotation = 90;
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',
icon_name: iconName,
gicon: gicon,
accessible_role: Atk.Role.ARROW,
y_expand: true,
y_align: Clutter.ActorAlign.CENTER });
arrow.rotation_angle_z = rotation;
return arrow;
}
@ -246,16 +251,8 @@ const PopupSeparatorMenuItem = new Lang.Class({
this.actor.add(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.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')) {
callback([]);
return;

View File

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

View File

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

View File

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

View File

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

View File

@ -31,7 +31,7 @@ const SearchSystem = new Lang.Class({
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::disable-external', 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) {
let index = this._providers.indexOf(provider);
this._providers.splice(index, 1);
if (provider.display)
provider.display.destroy();
},
getProviders: function() {
@ -318,8 +315,6 @@ const SearchResultsBase = new Lang.Class({
},
clear: function() {
for (let resultId in this._resultDisplays)
this._resultDisplays[resultId].actor.destroy();
this._resultDisplays = {};
this._clearResultDisplay();
this.actor.hide();
@ -343,22 +338,12 @@ const SearchResultsBase = new Lang.Class({
}));
if (metasNeeded.length === 0) {
callback(true);
callback();
} else {
this._cancellable.cancel();
this._cancellable.reset();
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) {
let meta = metas[i];
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));
this._resultDisplays[resultId] = display;
}));
callback(true);
callback();
}), this._cancellable);
}
},
@ -383,10 +368,8 @@ const SearchResultsBase = new Lang.Class({
let results = this.provider.filterResults(providerResults, maxResults);
let hasMoreResults = results.length < providerResults.length;
this._ensureResultActors(results, Lang.bind(this, function(successful) {
this._ensureResultActors(results, Lang.bind(this, function() {
this._clearResultDisplay();
if (!successful)
return;
// To avoid CSS transitions causing flickering when
// the first search result stays the same, we hide the
@ -632,11 +615,8 @@ const SearchResults = new Lang.Class({
if (newDefaultResult != this._defaultResult) {
if (this._defaultResult)
this._defaultResult.setSelected(false);
if (newDefaultResult) {
if (newDefaultResult)
newDefaultResult.setSelected(this._highlightDefault);
if (this._highlightDefault)
Util.ensureActorVisibleInScrollView(this._scrollView, newDefaultResult.actor);
}
this._defaultResult = newDefaultResult;
}
@ -673,11 +653,8 @@ const SearchResults = new Lang.Class({
highlightDefault: function(highlight) {
this._highlightDefault = highlight;
if (this._defaultResult) {
if (this._defaultResult)
this._defaultResult.setSelected(highlight);
if (highlight)
Util.ensureActorVisibleInScrollView(this._scrollView, this._defaultResult.actor);
}
},
navigateFocus: function(direction) {

View File

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

View File

@ -69,7 +69,6 @@ const ScreenSaverIface = '<node> \
<signal name="ActiveChanged"> \
<arg name="new_value" type="b" /> \
</signal> \
<signal name="WakeUpScreen" /> \
</interface> \
</node>';
@ -141,7 +140,12 @@ const GnomeShell = new Lang.Class({
if (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) {
@ -403,9 +407,6 @@ const ScreenSaverDBus = new Lang.Class({
screenShield.connect('active-changed', Lang.bind(this, function(shield) {
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.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._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));
let highContrast = this._buildHCItem();
@ -103,7 +103,6 @@ const ATIndicator = new Lang.Class({
return;
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) {
@ -118,7 +117,7 @@ const ATIndicator = new Lang.Class({
},
_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,
settings.get_boolean(key),
settings.is_writable(key),
@ -134,8 +133,8 @@ const ATIndicator = new Lang.Class({
},
_buildHCItem: function() {
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
let wmSettings = new Gio.Settings({ schema_id: WM_SCHEMA });
let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
@ -186,7 +185,7 @@ const ATIndicator = new Lang.Class({
},
_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 initial_setting = (factor > 1.0);

View File

@ -17,7 +17,6 @@ const OBJECT_PATH = '/org/gnome/SettingsDaemon/Rfkill';
const RfkillManagerInterface = '<node> \
<interface name="org.gnome.SettingsDaemon.Rfkill"> \
<property name="BluetoothAirplaneMode" type="b" access="readwrite" /> \
<property name="BluetoothHasAirplaneMode" type="b" access="read" /> \
</interface> \
</node>';
@ -59,7 +58,6 @@ const Indicator = new Lang.Class({
this._model.connect('row-changed', 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));
Main.sessionMode.connect('updated', Lang.bind(this, this._sync));
this._sync();
},
@ -94,11 +92,9 @@ const Indicator = new Lang.Class({
_sync: function() {
let nDevices = this._getNConnectedDevices();
let sensitive = !Main.sessionMode.isLocked && !Main.sessionMode.isGreeter;
this.menu.setSensitive(sensitive);
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)
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());
else if (keysym == Clutter.Right)
this._select(this._next());
else
return Clutter.EVENT_PROPAGATE;
return Clutter.EVENT_STOP;
},
_finish : function() {
@ -365,18 +361,18 @@ const InputSourceIndicator = new Lang.Class({
this._mruSources = [];
this._keybindingAction =
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,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._switchInputSource));
this._keybindingActionBackward =
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.IS_REVERSED,
Meta.KeyBindingFlags.REVERSED,
Shell.KeyBindingMode.ALL,
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_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));

View File

@ -4,10 +4,9 @@ const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Main = imports.ui.main;
const Shell = imports.gi.Shell;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Shell = imports.gi.Shell;
const LOCATION_SCHEMA = 'org.gnome.shell.location';
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
@ -43,7 +42,7 @@ const Indicator = new Lang.Class({
_init: function() {
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,
Lang.bind(this, this._onMaxAccuracyLevelChanged));
@ -56,8 +55,8 @@ const Indicator = new Lang.Class({
this._agent = Gio.DBusExportedObject.wrapJSObject(AgentIface, this);
this._agent.export(Gio.DBus.system, '/org/freedesktop/GeoClue2/Agent');
this._item.status.text = _("Enabled");
this._onOffAction = this._item.menu.addAction(_("Disable"), Lang.bind(this, this._onOnOffAction));
this._item.status.text = _("On");
this._onOffAction = this._item.menu.addAction(_("Turn Off"), Lang.bind(this, this._onOnOffAction));
this.menu.addMenuItem(this._item);
@ -66,8 +65,6 @@ const Indicator = new Lang.Class({
0,
Lang.bind(this, this._connectToGeoclue),
Lang.bind(this, this._onGeoclueVanished));
Main.sessionMode.connect('updated', Lang.bind(this, this._onSessionUpdated));
this._onSessionUpdated();
this._onMaxAccuracyLevelChanged();
this._connectToGeoclue();
},
@ -97,7 +94,6 @@ const Indicator = new Lang.Class({
}
this._indicator.visible = this._proxy.InUse;
this._updateMenuLabels();
},
_connectToGeoclue: function() {
@ -123,7 +119,7 @@ const Indicator = new Lang.Class({
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
Lang.bind(this, this._onGeocluePropsChanged));
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
this._updateMenu();
this._syncIndicator();
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);
},
_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() {
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
// 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);
},
_updateMenu: function() {
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
this.menu.actor.visible = (this._availableAccuracyLevel != 0);
},
_onGeocluePropsChanged: function(proxy, properties) {
let unpacked = properties.deep_unpack();
if ("InUse" in unpacked)
this._syncIndicator();
if ("AvailableAccuracyLevel" in unpacked) {
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
if (this._getMaxAccuracyLevel() != 0)
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
}
if ("AvailableAccuracyLevel" in unpacked)
this._updateMenu();
}
});

View File

@ -293,13 +293,8 @@ const NMConnectionSection = new Lang.Class({
},
removeConnection: function(connection) {
let uuid = connection.get_uuid();
let item = this._connectionItems.get(uuid);
if (item == undefined)
return;
item.destroy();
this._connectionItems.delete(uuid);
this._connectionItems.get(connection.get_uuid()).destroy();
this._connectionItems.delete(connection.get_uuid());
let pos = this._connections.indexOf(connection);
this._connections.splice(pos, 1);
@ -423,18 +418,18 @@ const NMConnectionDevice = new Lang.Class({
case NetworkManager.DeviceState.UNMANAGED:
/* 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) */
return _("Unmanaged");
return _("unmanaged");
case NetworkManager.DeviceState.DEACTIVATING:
return _("Disconnecting");
return _("disconnecting...");
case NetworkManager.DeviceState.PREPARE:
case NetworkManager.DeviceState.CONFIG:
case NetworkManager.DeviceState.IP_CONFIG:
case NetworkManager.DeviceState.IP_CHECK:
case NetworkManager.DeviceState.SECONDARIES:
return _("Connecting");
return _("connecting...");
case NetworkManager.DeviceState.NEED_AUTH:
/* Translators: this is for network connections that require some kind of key or password */
return _("Authentication required");
return _("authentication required");
case NetworkManager.DeviceState.UNAVAILABLE:
// This state is actually a compound of various states (generically unavailable,
// 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) {
/* Translators: this is for devices that require some kind of firmware or kernel
module, which is missing */
return _("Firmware missing");
return _("firmware missing");
}
/* Translators: this is for a network device that cannot be activated (for example it
is disabled by rfkill, or it has no coverage */
return _("Unavailable");
return _("unavailable");
case NetworkManager.DeviceState.FAILED:
return _("Connection failed");
return _("connection failed");
default:
log('Device state invalid, is %d'.format(this._device.state));
return 'invalid';
@ -1170,10 +1165,6 @@ const NMDeviceWireless = new Lang.Class({
this._client.disconnect(this._wirelessHwEnabledChangedId);
this._wirelessHwEnabledChangedId = 0;
}
if (this._dialog) {
this._dialog.destroy();
this._dialog = null;
}
this.item.destroy();
},
@ -1866,7 +1857,8 @@ const NMApplet = new Lang.Class({
_updateIcon: function() {
if (!this._client.networking_enabled || !this._mainConnection) {
this._primaryIndicator.visible = false;
this._primaryIndicator.icon_name = 'network-offline-symbolic';
this._primaryIndicator.visible = true;
} else {
let dev = this._mainConnection._primaryDevice;
this._primaryIndicator.visible = (dev != null);

View File

@ -4,7 +4,6 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Signals = imports.signals;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
@ -84,18 +83,10 @@ const Indicator = new Lang.Class({
this._item.icon.icon_name = 'airplane-mode-symbolic';
this._item.status.text = _("On");
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.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() {

View File

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

View File

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

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.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('needs-username', Lang.bind(this, this._onNeedsUserName));
this._authPrompt.setPasswordChar('\u25cf');
this._authPrompt.nextButton.label = _("Unlock");
@ -62,7 +62,7 @@ const UnlockDialog = new Lang.Class({
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')) {
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
style_class: 'login-dialog-not-listed-label' });
@ -101,6 +101,10 @@ const UnlockDialog = new Lang.Class({
},
_onReset: function(authPrompt, beginRequest) {
this._authPrompt.begin();
},
_onNeedsUserName: function() {
let userName;
if (beginRequest == AuthPrompt.BeginRequestType.PROVIDE_USERNAME) {
this._authPrompt.setUser(this._user);
@ -109,7 +113,7 @@ const UnlockDialog = new Lang.Class({
userName = null;
}
this._authPrompt.begin({ userName: userName });
this._authPrompt.gotUserName(userName);
},
_escape: function() {

View File

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

View File

@ -15,7 +15,6 @@ const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
const Main = imports.ui.main;
const ModalDialog = imports.ui.modalDialog;
const Tweener = imports.ui.tweener;
const WindowMenu = imports.ui.windowMenu;
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
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 });
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) {
@ -199,19 +197,12 @@ const WorkspaceTracker = new Lang.Class({
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
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._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() {
let i;
let emptyWorkspaces = [];
@ -280,20 +271,18 @@ const WorkspaceTracker = new Lang.Class({
this._queueCheckWorkspaces();
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(workspace._keepAliveId, '[gnome-shell] this._queueCheckWorkspaces');
},
_windowRemoved: function(workspace, window) {
workspace._lastRemovedWindow = window;
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) {
workspace._lastRemovedWindow = null;
this._queueCheckWorkspaces();
}
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._queueCheckWorkspaces');
},
_windowLeftMonitor: function(metaScreen, monitorIndex, metaWin) {
@ -471,6 +460,8 @@ const WindowManager = new Lang.Class({
this._dimmedWindows = [];
this._animationBlockCount = 0;
this._allowedKeybindings = {};
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('show-tile-preview', Lang.bind(this, this._showTilePreview));
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('maximize', Lang.bind(this, this._maximizeWindow));
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
@ -514,10 +504,6 @@ const WindowManager = new Lang.Class({
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
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',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
@ -618,9 +604,6 @@ const WindowManager = new Lang.Class({
this.setCustomKeybindingHandler('move-to-workspace-12',
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('move-to-workspace-last',
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._showWorkspaceSwitcher));
this.setCustomKeybindingHandler('switch-applications',
Shell.KeyBindingMode.NORMAL,
Lang.bind(this, this._startAppSwitcher));
@ -655,13 +638,13 @@ const WindowManager = new Lang.Class({
Lang.bind(this, this._startA11ySwitcher));
this.addKeybinding('pause-resume-tweens',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.ALL,
Lang.bind(this, this._toggleTweens));
this.addKeybinding('open-application-menu',
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
Meta.KeyBindingFlags.NONE,
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.TOPBAR_POPUP,
@ -676,8 +659,6 @@ const WindowManager = new Lang.Class({
this._dimWindow(this._dimmedWindows[i]);
}));
this._windowMenuManager = new WindowMenu.WindowMenuManager();
if (Main.sessionMode.hasWorkspaces)
this._workspaceTracker = new WorkspaceTracker(this);
@ -713,8 +694,16 @@ const WindowManager = new Lang.Class({
this._allowedKeybindings[name] = modes;
},
blockAnimations: function() {
this._animationBlockCount++;
},
unblockAnimations: function() {
this._animationBlockCount = Math.max(0, this._animationBlockCount - 1);
},
_shouldAnimate: function() {
return !Main.overview.visible;
return !(Main.overview.visible || this._animationBlockCount > 0);
},
_shouldAnimateActor: function(actor) {
@ -1160,10 +1149,6 @@ const WindowManager = new Lang.Class({
this._tilePreview.hide();
},
_showWindowMenu: function(shellwm, window, menu, rect) {
this._windowMenuManager.showWindowMenuForWindow(window, menu, rect);
},
_startAppSwitcher : function(display, screen, window, binding) {
/* prevent a corner case where both popups show up at once */
if (this._workspaceSwitcherPopup != null)
@ -1220,10 +1205,7 @@ const WindowManager = new Lang.Class({
let newWs;
let direction;
if (target == 'last') {
direction = Meta.MotionDirection.DOWN;
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
} else if (isNaN(target)) {
if (isNaN(target)) {
direction = Meta.MotionDirection[target.toUpperCase()];
newWs = screen.get_active_workspace().get_neighbor(direction);
} 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 Shell = imports.gi.Shell;
const St = imports.gi.St;
const Atk = imports.gi.Atk;
const Signals = imports.signals;
const DND = imports.ui.dnd;
@ -67,7 +65,7 @@ const WindowCloneLayout = new Lang.Class({
// paradoxically is the smaller rectangle, containing the positions
// of the visible frame. The input rect contains everything,
// including the invisible border padding.
let inputRect = window.get_buffer_rect();
let inputRect = window.get_input_rect();
let box = new Clutter.ActorBox();
@ -123,7 +121,6 @@ const WindowClone = new Lang.Class({
// the hierarchy that is sized to only the visible portion.
this.actor = new St.Widget({ reactive: true,
can_focus: true,
accessible_role: Atk.Role.PUSH_BUTTON,
layout_manager: new WindowCloneLayout() });
this.actor.add_child(this._windowClone);
@ -200,10 +197,6 @@ const WindowClone = new Lang.Class({
this.emit('size-changed');
},
hasAttachedDialogs: function() {
return this.actor.get_n_children() > 1;
},
_doAddAttachedDialog: function(metaWin, realWin) {
let clone = new Clutter.Clone({ source: realWin });
clone._updateId = metaWin.connect('size-changed', Lang.bind(this, function() {
@ -431,7 +424,6 @@ const WindowOverlay = new Lang.Class({
text: metaWindow.title });
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
title._spacing = 0;
windowClone.actor.label_actor = title;
this._updateCaptionId = metaWindow.connect('notify::title',
Lang.bind(this, function(w) {
@ -586,8 +578,7 @@ const WindowOverlay = new Lang.Class({
},
_windowCanClose: function() {
return this._windowClone.metaWindow.can_close() &&
!this._windowClone.hasAttachedDialogs();
return this._windowClone.metaWindow.can_close();
},
_onWindowAdded: function(workspace, win) {
@ -599,12 +590,11 @@ const WindowOverlay = new Lang.Class({
// use an idle handler to avoid mapping problems -
// see comment in Workspace._windowAdded
let id = Mainloop.idle_add(Lang.bind(this,
function() {
this._windowClone.emit('selected');
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._windowClone.emit');
Mainloop.idle_add(Lang.bind(this,
function() {
this._windowClone.emit('selected');
return GLib.SOURCE_REMOVE;
}));
}
},
@ -675,10 +665,8 @@ const WindowOverlay = new Lang.Class({
},
_onLeave: function() {
if (this._idleToggleCloseId == 0) {
if (this._idleToggleCloseId == 0)
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;
},
@ -1426,7 +1414,6 @@ const Workspace = new Lang.Class({
this._currentLayout = null;
this._repositionWindowsId = Mainloop.timeout_add(750,
Lang.bind(this, this._delayedWindowRepositioning));
GLib.Source.set_name_by_id(this._repositionWindowsId, '[gnome-shell] this._delayedWindowRepositioning');
},
_doAddWindow : function(metaWin) {
@ -1438,15 +1425,14 @@ const Workspace = new Lang.Class({
if (!win) {
// Newly-created windows are added to a workspace before
// the compositor finds out about them...
let id = Mainloop.idle_add(Lang.bind(this,
function () {
if (this.actor &&
metaWin.get_compositor_private() &&
metaWin.get_workspace() == this.metaWorkspace)
this._doAddWindow(metaWin);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow');
Mainloop.idle_add(Lang.bind(this,
function () {
if (this.actor &&
metaWin.get_compositor_private() &&
metaWin.get_workspace() == this.metaWorkspace)
this._doAddWindow(metaWin);
return GLib.SOURCE_REMOVE;
}));
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._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) {
@ -146,7 +145,6 @@ const WorkspaceSwitcherPopup = new Lang.Class({
if (this._timeoutId != 0)
Mainloop.source_remove(this._timeoutId);
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();
},

View File

@ -386,15 +386,14 @@ const WorkspaceThumbnail = new Lang.Class({
if (!win) {
// Newly-created windows are added to a workspace before
// the compositor finds out about them...
let id = Mainloop.idle_add(Lang.bind(this,
function () {
Mainloop.idle_add(Lang.bind(this,
function () {
if (!this._removed &&
metaWin.get_compositor_private() &&
metaWin.get_workspace() == this.metaWorkspace)
this._doAddWindow(metaWin);
return GLib.SOURCE_REMOVE;
}));
GLib.Source.set_name_by_id(id, '[gnome-shell] this._doAddWindow');
return;
}
@ -665,7 +664,7 @@ const ThumbnailsBox = new Lang.Class({
Main.overview.connect('window-drag-cancelled',
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',
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);
});
if (isWindow) {
if (isWindow)
// ... 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);
} else if (source.shellWorkspaceLaunch) {
else if (source.shellWorkspaceLaunch) {
source.shellWorkspaceLaunch({ workspace: newWorkspaceIndex,
timestamp: time });
// This new workspace will be automatically removed if the application fails
@ -907,10 +902,7 @@ const ThumbnailsBox = new Lang.Class({
},
_workspacesChanged: function() {
let validThumbnails = this._thumbnails.filter(function(t) {
return t.state <= ThumbnailState.NORMAL;
});
let oldNumWorkspaces = validThumbnails.length;
let oldNumWorkspaces = this._thumbnails.length;
let newNumWorkspaces = global.screen.n_workspaces;
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._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();
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
@ -429,7 +429,7 @@ const WorkspacesDisplay = new Lang.Class({
this._workspacesViews = [];
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',
Lang.bind(this,
this._workspacesOnlyOnPrimaryChanged));

View File

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

View File

@ -55,7 +55,6 @@ js/ui/unlockDialog.js
js/ui/viewSelector.js
js/ui/windowAttentionHandler.js
js/ui/windowManager.js
js/ui/windowMenu.js
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.
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.
# Khaled Hosny <khaledhosny@eglug.org>, 2009, 2010, 2011, 2012, 2013, 2014.
# 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.
msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-03-26 01:34+0200\n"
"PO-Revision-Date: 2014-03-21 11:05+0100\n"
"Last-Translator: Abderrahim Kitouni <a.kitouni@gmail.com>\n"
"POT-Creation-Date: 2014-02-28 22:55+0200\n"
"PO-Revision-Date: 2014-02-28 23:08+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
@ -18,7 +18,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"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"
"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"
"X-Project-Style: gnome\n"
@ -210,7 +210,7 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'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 "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
@ -277,7 +277,7 @@ msgstr "اختر امتدادا لضبطه من القائمة أعلاه."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:883
msgid "Cancel"
msgstr "ألغِ"
@ -295,25 +295,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "ادخل"
#: ../js/gdm/loginDialog.js:271
#: ../js/gdm/loginDialog.js:270
msgid "Choose Session"
msgstr "أغلق الجلسة"
#: ../js/gdm/loginDialog.js:431
#: ../js/gdm/loginDialog.js:430
msgid "Not listed?"
msgstr "غير مدرج؟"
#: ../js/gdm/loginDialog.js:611
#: ../js/gdm/loginDialog.js:598
#, javascript-format
msgid "(e.g., user or %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
msgid "Username: "
msgstr "اسم المستخدم: "
#: ../js/gdm/loginDialog.js:917
#: ../js/gdm/loginDialog.js:868
msgid "Login Window"
msgstr "نافذة الولوج"
@ -350,15 +350,15 @@ msgstr "شائعة"
msgid "All"
msgstr "الكل"
#: ../js/ui/appDisplay.js:1555
#: ../js/ui/appDisplay.js:1552
msgid "New Window"
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"
msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:1583
#: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة"
@ -501,44 +501,44 @@ msgstr "السبت"
msgid "calendar:MY"
msgstr ""
#: ../js/ui/calendar.js:450
#: ../js/ui/calendar.js:446
msgid "Previous month"
msgstr "الشهر السابق"
#: ../js/ui/calendar.js:460
#: ../js/ui/calendar.js:456
msgid "Next month"
msgstr "الشهر التالي"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:762
msgid "Nothing Scheduled"
msgstr "الجدول خال"
#. 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"
msgid "%A, %B %d"
msgstr "%A %d %B"
#. 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"
msgid "%A, %B %d, %Y"
msgstr "%A %d %B %Y"
#: ../js/ui/calendar.js:804
#: ../js/ui/calendar.js:794
msgid "Today"
msgstr "اليوم"
#: ../js/ui/calendar.js:808
#: ../js/ui/calendar.js:798
msgid "Tomorrow"
msgstr "غدا"
#: ../js/ui/calendar.js:819
#: ../js/ui/calendar.js:809
msgid "This week"
msgstr "هذا الأسبوع"
#: ../js/ui/calendar.js:827
#: ../js/ui/calendar.js:817
msgid "Next week"
msgstr "الأسبوع القادم"
@ -571,8 +571,8 @@ msgstr "كلمة السرّ:"
msgid "Type again:"
msgstr "أدخلها ثانية:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect"
msgstr "اتصل"
@ -697,7 +697,7 @@ msgstr "%H:%M"
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:962
msgid "Yesterday, %H%M"
msgstr "بالأمس، %H%M"
msgstr "بالأمس، %H:%M"
#. Translators: this is the week day name followed by a time
#. 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" */
#: ../js/ui/components/telepathyClient.js:982
msgid "%B %d %Y, %H%M"
msgstr "%d %B، %H:%M"
msgstr "%d %B %Y، %H:%M"
#. Translators: Time in 24h format */
#: ../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" */
#: ../js/ui/components/telepathyClient.js:998
msgid "Yesterday, %l%M %p"
msgstr "بالأمس، %l%M %p"
msgstr "بالأمس، %l:%M %p"
#. Translators: this is the week day name followed by a time
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1005
msgid "%A, %l%M %p"
msgstr "%l:%M %p"
msgstr "%A، %l:%M %p"
#. Translators: this is the month name and day number
#. followed by a time string in 12h format.
#. i.e. "May 25, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1012
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
#. number followed by a time string in 12h format.
#. i.e. "May 25 2012, 2:30 pm"*/
#: ../js/ui/components/telepathyClient.js:1018
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
#. IM name. */
@ -931,7 +931,7 @@ msgstr "تعذّر الاتصال مع %s"
msgid "View account"
msgstr "أظهر الحساب"
#: ../js/ui/components/telepathyClient.js:1439
#: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason"
msgstr "السبب غير معروف"
@ -947,22 +947,22 @@ msgstr "أظهر التطبيقات"
msgid "Dash"
msgstr "الشريط"
#: ../js/ui/dateMenu.js:91
#: ../js/ui/dateMenu.js:86
msgid "Open Calendar"
msgstr "افتح التقويم"
#: ../js/ui/dateMenu.js:95
#: ../js/ui/dateMenu.js:90
msgid "Open Clocks"
msgstr "افتح الساعات"
#: ../js/ui/dateMenu.js:102
#: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings"
msgstr "إعدادات الوقت و التّاريخ"
#. 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").
#. */
#: ../js/ui/dateMenu.js:192
#: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y"
msgstr "%A %e %B، %Y"
@ -978,6 +978,7 @@ msgid "Log Out"
msgstr "خروج"
#: ../js/ui/endSessionDialog.js:69
#, javascript-format
msgid "%s will be logged out automatically in %d second."
msgid_plural "%s will be logged out automatically in %d seconds."
msgstr[0] "سيُخرج %s تلقائيا الآن."
@ -988,6 +989,7 @@ msgstr[4] "سيُخرج %s تلقائيا بعد %d ثانية."
msgstr[5] "سيُخرج %s تلقائيا بعد %d ثانية."
#: ../js/ui/endSessionDialog.js:74
#, javascript-format
msgid "You will be logged out automatically in %d second."
msgid_plural "You will be logged out automatically in %d seconds."
msgstr[0] "ستُخرج تلقائيا الآن."
@ -1013,6 +1015,7 @@ msgid "Install Updates & Power Off"
msgstr "ثبّت التحديثات ثم أطفئ"
#: ../js/ui/endSessionDialog.js:89
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "سيُطفأ النظام تلقائيا الآن."
@ -1043,6 +1046,7 @@ msgid "Restart"
msgstr "إعادة التشغيل"
#: ../js/ui/endSessionDialog.js:107
#, javascript-format
msgid "The system will restart automatically in %d second."
msgid_plural "The system will restart automatically in %d seconds."
msgstr[0] "سيُعاد تشغيل النظام تلقائيا الآن."
@ -1058,6 +1062,7 @@ msgid "Restart & Install Updates"
msgstr "أعد التشغيل و ثبّت التحديثات"
#: ../js/ui/endSessionDialog.js:123
#, javascript-format
msgid "The system will automatically restart and install updates in %d second."
msgid_plural ""
"The system will automatically restart and install updates in %d seconds."
@ -1120,25 +1125,25 @@ msgstr "هل تريد تنزيل و تثبيت ”%s“ من extensions.gnome.o
msgid "Keyboard"
msgstr "لوحة المفاتيح"
#: ../js/ui/lookingGlass.js:643
#: ../js/ui/lookingGlass.js:641
msgid "No extensions installed"
msgstr "لا امتدادات مثبّتة"
#. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:697
#: ../js/ui/lookingGlass.js:695
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "لم يصدر %s أي خطأ."
#: ../js/ui/lookingGlass.js:703
#: ../js/ui/lookingGlass.js:701
msgid "Hide Errors"
msgstr "أخفِ الأخطاء"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767
#: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors"
msgstr "اظهر الأخطاء"
#: ../js/ui/lookingGlass.js:716
#: ../js/ui/lookingGlass.js:714
msgid "Enabled"
msgstr "مفعّل"
@ -1146,28 +1151,28 @@ msgstr "مفعّل"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * 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
msgid "Disabled"
msgstr "معطّل"
#: ../js/ui/lookingGlass.js:721
#: ../js/ui/lookingGlass.js:719
msgid "Error"
msgstr "خطأ"
#: ../js/ui/lookingGlass.js:723
#: ../js/ui/lookingGlass.js:721
msgid "Out of date"
msgstr "قديم"
#: ../js/ui/lookingGlass.js:725
#: ../js/ui/lookingGlass.js:723
msgid "Downloading"
msgstr "ينزّل"
#: ../js/ui/lookingGlass.js:749
#: ../js/ui/lookingGlass.js:747
msgid "View Source"
msgstr "اعرض المصدر"
#: ../js/ui/lookingGlass.js:758
#: ../js/ui/lookingGlass.js:756
msgid "Web Page"
msgstr "صفحة الوب"
@ -1203,7 +1208,7 @@ msgstr "لا رسائل"
msgid "Message Tray"
msgstr "لوحة الرسائل"
#: ../js/ui/messageTray.js:2962
#: ../js/ui/messageTray.js:2948
msgid "System Information"
msgstr "معلومات النظام"
@ -1213,6 +1218,7 @@ msgid "Unknown"
msgstr "غير معروف"
#: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151
#, javascript-format
msgid "%d new message"
msgid_plural "%d new messages"
msgstr[0] "لا رسائل جديدة"
@ -1222,11 +1228,11 @@ msgstr[3] "%d رسائل جديدة"
msgstr[4] "%d رسالة جديدة"
msgstr[5] "%d رسالة جديدة"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:83
msgid "Undo"
msgstr "تراجع"
#: ../js/ui/overview.js:124
#: ../js/ui/overview.js:123
msgid "Overview"
msgstr "نظرة عامة"
@ -1234,7 +1240,7 @@ msgstr "نظرة عامة"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:257
msgid "Type to search…"
msgstr "اكتب نصا للبحث عنه…"
@ -1271,6 +1277,7 @@ msgid "%A, %B %d"
msgstr "%A، %d %B"
#: ../js/ui/screenShield.js:153
#, javascript-format
msgid "%d new notification"
msgid_plural "%d new notifications"
msgstr[0] "لا تنبيهات جديدة"
@ -1280,27 +1287,27 @@ msgstr[3] "%d تنبيهات جديدة"
msgstr[4] "%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"
msgstr "أوصِد"
#: ../js/ui/screenShield.js:708
#: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
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"
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"
msgstr "منع تطبيق الإيصاد"
#: ../js/ui/search.js:603
#: ../js/ui/search.js:589
msgid "Searching…"
msgstr "يبحث…"
#: ../js/ui/search.js:646
#: ../js/ui/search.js:632
msgid "No results."
msgstr "لا نتائج."
@ -1372,23 +1379,24 @@ msgstr "تباين عال"
msgid "Large Text"
msgstr "نص كبير"
#: ../js/ui/status/bluetooth.js:49
#: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "بلوتوث"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/location.js:60
#: ../js/ui/status/location.js:167 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151
#: ../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
msgid "Turn Off"
msgstr "أوقف"
#: ../js/ui/status/bluetooth.js:54
#: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings"
msgstr "إعدادات بلوتوث"
#: ../js/ui/status/bluetooth.js:104
#: ../js/ui/status/bluetooth.js:100
#, javascript-format
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "لا أجهزة موصّلة"
@ -1398,7 +1406,7 @@ msgstr[3] "%d أجهزة موصّلة"
msgstr[4] "%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"
msgstr "غير متّصل"
@ -1410,21 +1418,21 @@ msgstr "السطوع"
msgid "Show Keyboard Layout"
msgstr "أظهر تخطيط لوحة المفاتيح"
#: ../js/ui/status/location.js:53
#: ../js/ui/status/location.js:52
msgid "Location"
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
msgid "On"
msgstr "مفعّل"
#: ../js/ui/status/location.js:163 ../js/ui/status/network.js:420
#: ../js/ui/status/network.js:1260 ../js/ui/status/network.js:1464
#: ../js/ui/status/location.js:155 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgid "Off"
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"
msgstr "شغّل"
@ -1432,138 +1440,134 @@ msgstr "شغّل"
msgid "<unknown>"
msgstr "<غير معروفة>"
#: ../js/ui/status/network.js:422
msgid "Connected"
msgstr "مُتصل"
#. 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) */
#: ../js/ui/status/network.js:426
#: ../js/ui/status/network.js:431
msgid "unmanaged"
msgstr "غير مُدار"
#: ../js/ui/status/network.js:428
#: ../js/ui/status/network.js:433
msgid "disconnecting..."
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..."
msgstr "يتّصل..."
#. 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"
msgstr "الاستيثاق مطلوب"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:445
#: ../js/ui/status/network.js:450
msgid "firmware missing"
msgstr "البرمجية الثابتة (Firmware) غير موجودة"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:449
#: ../js/ui/status/network.js:454
msgid "unavailable"
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"
msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:467
#: ../js/ui/status/network.js:472
msgid "Wired Settings"
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"
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"
msgstr "العتاد مُعَطَّل"
#: ../js/ui/status/network.js:595
#: ../js/ui/status/network.js:600
msgid "Use as Internet connection"
msgstr "استخدمه اتّصالًا بالإنترنت"
#: ../js/ui/status/network.js:776
#: ../js/ui/status/network.js:781
msgid "Airplane Mode is On"
msgstr "وضع الطائرة مُفعّل"
#: ../js/ui/status/network.js:777
#: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "الاتصال اللاسلكي مُعطّل في وضع الطائرة."
#: ../js/ui/status/network.js:778
#: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode"
msgstr "عطّل وضع الطائرة"
#: ../js/ui/status/network.js:787
#: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off"
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."
msgstr "تحتاج إلى تشغيل الاتصال اللاسلكي للاتصال بالشبكة."
#: ../js/ui/status/network.js:789
#: ../js/ui/status/network.js:794
msgid "Turn On Wi-Fi"
msgstr "شغّل الاتصال اللاسلكي"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks"
msgstr "الشبكات اللاسلكية"
#: ../js/ui/status/network.js:816
#: ../js/ui/status/network.js:821
msgid "Select a network"
msgstr "اختر شبكة"
#: ../js/ui/status/network.js:845
#: ../js/ui/status/network.js:850
msgid "No Networks"
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"
msgstr "استخدم زر العتاد للإغلاق"
#: ../js/ui/status/network.js:1136
#: ../js/ui/status/network.js:1141
msgid "Select Network"
msgstr "اختر شبكة"
#: ../js/ui/status/network.js:1142
#: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings"
msgstr "إعدادات الاتصال اللاسلكي"
#: ../js/ui/status/network.js:1251
#: ../js/ui/status/network.js:1252
msgid "Hotspot Active"
msgstr "نقطة الاتصال نشطة"
#: ../js/ui/status/network.js:1254
#: ../js/ui/status/network.js:1255
msgid "Connecting"
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"
msgstr "إعدادات الشّبكة"
#: ../js/ui/status/network.js:1435
#: ../js/ui/status/network.js:1436
msgid "VPN Settings"
msgstr "إعدادات ش‌خ‌ف (VPN)"
#: ../js/ui/status/network.js:1454
#: ../js/ui/status/network.js:1455
msgid "VPN"
msgstr "ش‌خ‌ف (VPN)"
#: ../js/ui/status/network.js:1607
#: ../js/ui/status/network.js:1598
msgid "Network Manager"
msgstr "مدير الشبكة"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1637
msgid "Connection failed"
msgstr "فشل الاتصال"
#: ../js/ui/status/network.js:1647
#: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed"
msgstr "فشل تفعيل اتصال الشبكة"
@ -1582,12 +1586,12 @@ msgstr "يَحسِب…"
#: ../js/ui/status/power.js:86
#, javascript-format
msgid "%d%02d Remaining (%d%%)"
msgstr "بقي %d%02d (%d%%)"
msgstr "بقي %d:%02d (%d%%)"
#: ../js/ui/status/power.js:91
#, javascript-format
msgid "%d%02d Until Full (%d%%)"
msgstr "بقي على الاكتمال %d%02d (%d%%)"
msgstr "بقي على الاكتمال %d:%02d (%d%%)"
#: ../js/ui/status/power.js:119
msgid "UPS"
@ -1670,6 +1674,7 @@ msgid "Keep Changes"
msgstr "أبق على التغييرات"
#: ../js/ui/windowManager.js:97
#, javascript-format
msgid "Settings changes will revert in %d second"
msgid_plural "Settings changes will revert in %d seconds"
msgstr[0] "سيُتراجع عن التغييرات الآن"
@ -1746,35 +1751,6 @@ msgstr "لا يمكن أن تكون كلمة السرّ فارغة"
msgid "Authentication dialog was dismissed by the user"
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>"
#~ 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> "
#~ 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"
#~ msgstr "قائمة الإعدادات"

316
po/be.po
View File

@ -5,7 +5,7 @@ msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"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"
"Last-Translator: Ihar Hrachyshka <ihar.hrachyshka@gmail.com>\n"
"Language-Team: Belarusian <i18n-bel-gnome@googlegroups.com>\n"
@ -107,8 +107,8 @@ msgid ""
msgstr ""
"Абалонка GNOME запусціць толькі тыя пашырэнні, аўтары якіх сцвярджаюць, што "
"яны працуюць з бягучай версіяй абалонкі. Уключэнне гэтай настройкі выключыць "
"гэту праверку, і для ўсіх пашырэнняў будзе ажыццёўлена спроба загрузкі "
"незалежна ад сцвярджэнняў іх аўтараў."
"гэту праверку, і для ўсіх пашырэнняў будзе ажыццёўлена спроба загрузкі незалежна ад "
"сцвярджэнняў іх аўтараў."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
msgid "List of desktop file IDs for favorite applications"
@ -228,17 +228,10 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'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 "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
"Настройка максімальнай дакладнасці вызначэння месцапалажэння, даступнай праграмам. "
"Магчымыя значэнні: \"off\" (выключыць вызначэнне месцапалажэння), \"country\" (краіна), "
"\"city\" (горад), \"neighborhood\" (раён), \"street\" (вуліца) і \"exact\" (дэталёва, "
"звычайна патрабуе GPS-прыёмнік). Увага: гэта настройка вызначае толькі тое, што "
"даступна праграмам з дапамогай службы GeoClue, але яны могуць самастойна вызначаць "
"месцапалажэнне з дапамогай спецыяльных сеціўных рэсурсаў (праўда, максімальная дакладнасць "
"такіх рэсурсаў - назва вуліцы)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode."
@ -295,8 +288,7 @@ msgstr ""
#: ../js/extensionPrefs/main.js:127
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Падчас спробы загрузкі дыялогавага акенца настроек для %s адбылася памылка:"
msgstr "Падчас спробы загрузкі дыялогавага акенца настроек для %s адбылася памылка:"
#: ../js/extensionPrefs/main.js:167
msgid "Extension"
@ -311,7 +303,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:883
msgid "Cancel"
msgstr "Скасаваць"
@ -329,25 +321,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "Увайсці"
#: ../js/gdm/loginDialog.js:271
#: ../js/gdm/loginDialog.js:270
msgid "Choose Session"
msgstr "Выбар сеанса"
#: ../js/gdm/loginDialog.js:431
#: ../js/gdm/loginDialog.js:430
msgid "Not listed?"
msgstr "Няма ў спісе?"
#: ../js/gdm/loginDialog.js:614
#: ../js/gdm/loginDialog.js:598
#, javascript-format
msgid "(e.g., user or %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
msgid "Username: "
msgstr "Імя карыстальніка: "
#: ../js/gdm/loginDialog.js:920
#: ../js/gdm/loginDialog.js:868
msgid "Login Window"
msgstr "Акно ўваходу"
@ -372,27 +364,27 @@ msgstr "Не ўдалося разабраць загад:"
msgid "Execution of “%s” failed:"
msgstr "Не ўдалося выканаць \"%s\":"
#: ../js/ui/appDisplay.js:636
#: ../js/ui/appDisplay.js:629
msgid "Frequently used applications will appear here"
msgstr "Тут размешчаныя часта ўжываныя праграмы"
#: ../js/ui/appDisplay.js:747
#: ../js/ui/appDisplay.js:740
msgid "Frequent"
msgstr "Часта"
#: ../js/ui/appDisplay.js:754
#: ../js/ui/appDisplay.js:747
msgid "All"
msgstr "Усе"
#: ../js/ui/appDisplay.js:1566
#: ../js/ui/appDisplay.js:1552
msgid "New Window"
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"
msgstr "Выдаліць са спіса ўпадабанага"
#: ../js/ui/appDisplay.js:1594
#: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites"
msgstr "Дадаць у спіс упадабанага"
@ -535,44 +527,44 @@ msgstr "Сб"
msgid "calendar:MY"
msgstr "calendar:MY"
#: ../js/ui/calendar.js:450
#: ../js/ui/calendar.js:446
msgid "Previous month"
msgstr "Папярэдні месяц"
#: ../js/ui/calendar.js:460
#: ../js/ui/calendar.js:456
msgid "Next month"
msgstr "Наступны месяц"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:762
msgid "Nothing Scheduled"
msgstr "Нічога не прымеркавана"
#. 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"
msgid "%A, %B %d"
msgstr "%A, %d %B"
#. 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"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %B, %Y"
#: ../js/ui/calendar.js:804
#: ../js/ui/calendar.js:794
msgid "Today"
msgstr "Сёння"
#: ../js/ui/calendar.js:808
#: ../js/ui/calendar.js:798
msgid "Tomorrow"
msgstr "Заўтра"
#: ../js/ui/calendar.js:819
#: ../js/ui/calendar.js:809
msgid "This week"
msgstr "На гэтым тыдні"
#: ../js/ui/calendar.js:827
#: ../js/ui/calendar.js:817
msgid "Next week"
msgstr "На наступным тыдні"
@ -605,8 +597,8 @@ msgstr "Пароль:"
msgid "Type again:"
msgstr "Паўтарыце пароль:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect"
msgstr "Злучыць"
@ -813,13 +805,13 @@ msgstr "Удзельнік %s запрашае вас далучыцца да %s
#: ../js/ui/components/telepathyClient.js:1164
#: ../js/ui/components/telepathyClient.js:1199
#: ../js/ui/components/telepathyClient.js:1233
#: ../js/ui/components/telepathyClient.js:1291
#: ../js/ui/components/telepathyClient.js:1290
msgid "Decline"
msgstr "Адмовіцца"
#: ../js/ui/components/telepathyClient.js:1170
#: ../js/ui/components/telepathyClient.js:1239
#: ../js/ui/components/telepathyClient.js:1296
#: ../js/ui/components/telepathyClient.js:1295
msgid "Accept"
msgstr "Прыняць"
@ -856,97 +848,97 @@ msgstr "%s пасылае вам %s"
msgid "%s would like permission to see when you are online"
msgstr "%s просіць дазволу на прагляд вашага сеткавага стану"
#: ../js/ui/components/telepathyClient.js:1342
#: ../js/ui/components/telepathyClient.js:1341
msgid "Network error"
msgstr "Сеткавая памылка"
#: ../js/ui/components/telepathyClient.js:1344
#: ../js/ui/components/telepathyClient.js:1343
msgid "Authentication failed"
msgstr "Няўдалая ідэнтыфікацыя"
#: ../js/ui/components/telepathyClient.js:1346
#: ../js/ui/components/telepathyClient.js:1345
msgid "Encryption error"
msgstr "Памылка шыфравання"
#: ../js/ui/components/telepathyClient.js:1348
#: ../js/ui/components/telepathyClient.js:1347
msgid "Certificate not provided"
msgstr "Сертыфікат не пададзены"
#: ../js/ui/components/telepathyClient.js:1350
#: ../js/ui/components/telepathyClient.js:1349
msgid "Certificate untrusted"
msgstr "Сертыфікат не заслугоўвае даверу"
#: ../js/ui/components/telepathyClient.js:1352
#: ../js/ui/components/telepathyClient.js:1351
msgid "Certificate expired"
msgstr "Сертыфікат састарэў"
#: ../js/ui/components/telepathyClient.js:1354
#: ../js/ui/components/telepathyClient.js:1353
msgid "Certificate not activated"
msgstr "Сертыфікат не актывізаваны"
#: ../js/ui/components/telepathyClient.js:1356
#: ../js/ui/components/telepathyClient.js:1355
msgid "Certificate hostname mismatch"
msgstr "Назва камп'ютара ў сертыфікаце не адпавядае патрэбнай"
#: ../js/ui/components/telepathyClient.js:1358
#: ../js/ui/components/telepathyClient.js:1357
msgid "Certificate fingerprint mismatch"
msgstr "Адбітак сертыфіката не адпавядае патрэбнаму"
#: ../js/ui/components/telepathyClient.js:1360
#: ../js/ui/components/telepathyClient.js:1359
msgid "Certificate self-signed"
msgstr "Сертыфікат уласнаручна падпісаны"
#: ../js/ui/components/telepathyClient.js:1362
#: ../js/ui/components/telepathyClient.js:1361
msgid "Status is set to offline"
msgstr "Уключаны рэжым па-за сеткай"
#: ../js/ui/components/telepathyClient.js:1364
#: ../js/ui/components/telepathyClient.js:1363
msgid "Encryption is not available"
msgstr "Шыфраванне недаступнае"
#: ../js/ui/components/telepathyClient.js:1366
#: ../js/ui/components/telepathyClient.js:1365
msgid "Certificate is invalid"
msgstr "Хібны сертыфікат"
#: ../js/ui/components/telepathyClient.js:1368
#: ../js/ui/components/telepathyClient.js:1367
msgid "Connection has been refused"
msgstr "Адмоўлена ў злучэнні"
#: ../js/ui/components/telepathyClient.js:1370
#: ../js/ui/components/telepathyClient.js:1369
msgid "Connection can't be established"
msgstr "Не ўдалося ўсталяваць злучэнне"
#: ../js/ui/components/telepathyClient.js:1372
#: ../js/ui/components/telepathyClient.js:1371
msgid "Connection has been lost"
msgstr "Злучэнне страчана"
#: ../js/ui/components/telepathyClient.js:1374
#: ../js/ui/components/telepathyClient.js:1373
msgid "This account is already connected to the server"
msgstr "Гэты конт ужо злучаны з серверам"
#: ../js/ui/components/telepathyClient.js:1376
#: ../js/ui/components/telepathyClient.js:1375
msgid ""
"Connection has been replaced by a new connection using the same resource"
msgstr "Злучэнне заменена новым для таго ж самага рэсурсу"
#: ../js/ui/components/telepathyClient.js:1378
#: ../js/ui/components/telepathyClient.js:1377
msgid "The account already exists on the server"
msgstr "Такі конт ужо існуе на серверы"
#: ../js/ui/components/telepathyClient.js:1380
#: ../js/ui/components/telepathyClient.js:1379
msgid "Server is currently too busy to handle the connection"
msgstr "Сервер надта заняты і не можа абслужыць гэта злучэнне"
#: ../js/ui/components/telepathyClient.js:1382
#: ../js/ui/components/telepathyClient.js:1381
msgid "Certificate has been revoked"
msgstr "Сертыфікат быў адкліканы"
#: ../js/ui/components/telepathyClient.js:1384
#: ../js/ui/components/telepathyClient.js:1383
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr "Для сертыфіката выкарыстаны слабы або небяспечны алгарытм шыфравання"
#: ../js/ui/components/telepathyClient.js:1386
#: ../js/ui/components/telepathyClient.js:1385
msgid ""
"The length of the server certificate, or the depth of the server certificate "
"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"
msgstr "Унутраная памылка"
#. translators: argument is the account name, like
#. * name@jabber.org for example. */
#: ../js/ui/components/telepathyClient.js:1398
#: ../js/ui/components/telepathyClient.js:1397
#, javascript-format
msgid "Unable to connect to %s"
msgstr "Не ўдалося злучыцца з %s"
#: ../js/ui/components/telepathyClient.js:1403
#: ../js/ui/components/telepathyClient.js:1402
msgid "View account"
msgstr "Праглядзець конт"
#: ../js/ui/components/telepathyClient.js:1440
#: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason"
msgstr "Невядомая прычына"
@ -985,22 +977,22 @@ msgstr "Паказаць праграмы"
msgid "Dash"
msgstr "Прыборная дошка"
#: ../js/ui/dateMenu.js:91
#: ../js/ui/dateMenu.js:86
msgid "Open Calendar"
msgstr "Адкрыць каляндар"
#: ../js/ui/dateMenu.js:95
#: ../js/ui/dateMenu.js:90
msgid "Open Clocks"
msgstr "Адкрыць гадзіннікі"
#: ../js/ui/dateMenu.js:102
#: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings"
msgstr "Настройкі даты і часу"
#. 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").
#. */
#: ../js/ui/dateMenu.js:192
#: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y"
msgstr "%A, %e %B, %Y"
@ -1116,9 +1108,7 @@ msgstr "Выключыць камп'ютар пасля ўсталявання
#: ../js/ui/endSessionDialog.js:315
msgid "Running on battery power: please plug in before installing updates."
msgstr ""
"Камп'ютар сілкуецца ад акумулятара: падлучыце да знешняй крыніцы энергіі "
"перад усталяваннем абновак."
msgstr "Камп'ютар сілкуецца ад акумулятара: падлучыце да знешняй крыніцы энергіі перад усталяваннем абновак."
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
@ -1153,26 +1143,25 @@ msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?
msgid "Keyboard"
msgstr "Клавіятура"
#: ../js/ui/lookingGlass.js:643
#: ../js/ui/lookingGlass.js:641
msgid "No extensions installed"
msgstr "Няма ўсталяваных пашырэнняў"
#. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:697
#: ../js/ui/lookingGlass.js:695
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "%s не зрабіў ніякіх памылак."
#: ../js/ui/lookingGlass.js:703
#: ../js/ui/lookingGlass.js:701
msgid "Hide Errors"
msgstr "Хаваць памылкі"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767
#: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors"
msgstr "Паказваць памылкі"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:167
#: ../js/ui/lookingGlass.js:714
msgid "Enabled"
msgstr "Уключана"
@ -1180,64 +1169,64 @@ msgstr "Уключана"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Выключана"
#: ../js/ui/lookingGlass.js:721
#: ../js/ui/lookingGlass.js:719
msgid "Error"
msgstr "Памылка"
#: ../js/ui/lookingGlass.js:723
#: ../js/ui/lookingGlass.js:721
msgid "Out of date"
msgstr "Састарэла"
#: ../js/ui/lookingGlass.js:725
#: ../js/ui/lookingGlass.js:723
msgid "Downloading"
msgstr "Сцягванне"
#: ../js/ui/lookingGlass.js:749
#: ../js/ui/lookingGlass.js:747
msgid "View Source"
msgstr "Паглядзець выточны код"
#: ../js/ui/lookingGlass.js:758
#: ../js/ui/lookingGlass.js:756
msgid "Web Page"
msgstr "Сеціўная старонка"
#: ../js/ui/messageTray.js:1326
#: ../js/ui/messageTray.js:1324
msgid "Open"
msgstr "Адкрыць"
#: ../js/ui/messageTray.js:1333
#: ../js/ui/messageTray.js:1331
msgid "Remove"
msgstr "Выдаліць"
#: ../js/ui/messageTray.js:1630
#: ../js/ui/messageTray.js:1628
msgid "Notifications"
msgstr "Апавяшчэнні"
#: ../js/ui/messageTray.js:1637
#: ../js/ui/messageTray.js:1635
msgid "Clear Messages"
msgstr "Ачысціць спіс апавяшчэнняў"
#: ../js/ui/messageTray.js:1656
#: ../js/ui/messageTray.js:1654
msgid "Notification Settings"
msgstr "Настройкі апавяшчэння"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "Tray Menu"
msgstr "Меню трэя"
#: ../js/ui/messageTray.js:1926
#: ../js/ui/messageTray.js:1924
msgid "No Messages"
msgstr "Апавяшчэнні адсутнічаюць"
#: ../js/ui/messageTray.js:1964
#: ../js/ui/messageTray.js:1962
msgid "Message Tray"
msgstr "Абшар апавяшчэнняў"
#: ../js/ui/messageTray.js:2962
#: ../js/ui/messageTray.js:2946
msgid "System Information"
msgstr "Сістэмная інфармацыя"
@ -1254,11 +1243,11 @@ msgstr[0] "%d новае паведамленне"
msgstr[1] "%d новыя паведамленні"
msgstr[2] "%d новых паведамленняў"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:83
msgid "Undo"
msgstr "Адрабіць"
#: ../js/ui/overview.js:124
#: ../js/ui/overview.js:123
msgid "Overview"
msgstr "Агляд"
@ -1266,7 +1255,7 @@ msgstr "Агляд"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:257
msgid "Type to search…"
msgstr "Увядзіце тэкст для пошуку..."
@ -1310,27 +1299,27 @@ msgstr[0] "%d новае апавяшчэнне"
msgstr[1] "%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"
msgstr "Заблакіраваць"
#: ../js/ui/screenShield.js:708
#: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
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"
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"
msgstr "Блакіраванне стрымана праграмай"
#: ../js/ui/search.js:603
#: ../js/ui/search.js:589
msgid "Searching…"
msgstr "Пошук..."
#: ../js/ui/search.js:649
#: ../js/ui/search.js:632
msgid "No results."
msgstr "Нічога не знойдзена."
@ -1402,22 +1391,23 @@ msgstr "Высокая кантраснасць"
msgid "Large Text"
msgstr "Буйны тэкст"
#: ../js/ui/status/bluetooth.js:49
#: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
#: ../js/ui/status/rfkill.js:114
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../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
msgid "Turn Off"
msgstr "Выключыць"
#: ../js/ui/status/bluetooth.js:54
#: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings"
msgstr "Настройкі Bluetooth"
#: ../js/ui/status/bluetooth.js:104
#: ../js/ui/status/bluetooth.js:100
#, javascript-format
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
@ -1425,7 +1415,7 @@ msgstr[0] "%d злучанае прыстасаванне"
msgstr[1] "%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"
msgstr "Няма злучэння"
@ -1437,167 +1427,156 @@ msgstr "Яркасць"
msgid "Show Keyboard Layout"
msgstr "Паказаць клавіятурную раскладку"
#: ../js/ui/status/location.js:53
#: ../js/ui/status/location.js:52
msgid "Location"
msgstr "Месцапалажэнне"
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
msgid "Disable"
msgstr "Выключыць"
#: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "Укл."
#: ../js/ui/status/location.js:165
msgid "Enable"
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../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 "Уключыць"
#: ../js/ui/status/location.js:167
msgid "In Use"
msgstr "Ужыта"
#: ../js/ui/status/network.js:74
msgid "<unknown>"
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
#. 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"
msgstr "непадкантрольна"
#: ../js/ui/status/network.js:428
#: ../js/ui/status/network.js:433
msgid "disconnecting..."
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..."
msgstr "усталяванне злучэння..."
#. 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"
msgstr "патрэбная ідэнтыфікацыя"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:445
#: ../js/ui/status/network.js:450
msgid "firmware missing"
msgstr "няма апаратнага апраграмавання"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:449
#: ../js/ui/status/network.js:454
msgid "unavailable"
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"
msgstr "не ўдалося злучыцца"
#: ../js/ui/status/network.js:467
#: ../js/ui/status/network.js:472
msgid "Wired Settings"
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"
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"
msgstr "Прыстасаванне выключана"
#: ../js/ui/status/network.js:595
#: ../js/ui/status/network.js:600
msgid "Use as Internet connection"
msgstr "Ужыць для злучэння з Інтэрнэтам"
#: ../js/ui/status/network.js:776
#: ../js/ui/status/network.js:781
msgid "Airplane Mode is On"
msgstr "Рэжым самалёта ўключаны"
#: ../js/ui/status/network.js:777
#: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr "У рэжыме самалёта выключаецца Wi-Fi."
#: ../js/ui/status/network.js:778
#: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode"
msgstr "Выключыць рэжым самалёта"
#: ../js/ui/status/network.js:787
#: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off"
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."
msgstr "Каб злучыцца з сеткай, спачатку трэба ўключыць Wi-Fi."
#: ../js/ui/status/network.js:789
#: ../js/ui/status/network.js:794
msgid "Turn On Wi-Fi"
msgstr "Уключыць Wi-Fi"
#: ../js/ui/status/network.js:814
#: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks"
msgstr "Сеткі Wi-Fi"
#: ../js/ui/status/network.js:816
#: ../js/ui/status/network.js:821
msgid "Select a network"
msgstr "Выберыце сетку"
#: ../js/ui/status/network.js:845
#: ../js/ui/status/network.js:850
msgid "No Networks"
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"
msgstr "Задзейнічаць апаратны выключальнік"
#: ../js/ui/status/network.js:1136
#: ../js/ui/status/network.js:1141
msgid "Select Network"
msgstr "Выбраць сетку"
#: ../js/ui/status/network.js:1142
#: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings"
msgstr "Настройкі Wi-Fi"
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Уключыць"
#: ../js/ui/status/network.js:1251
#: ../js/ui/status/network.js:1252
msgid "Hotspot Active"
msgstr "Хотспот уключаны"
#: ../js/ui/status/network.js:1254
#: ../js/ui/status/network.js:1255
msgid "Connecting"
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"
msgstr "Сеткавыя настройкі"
#: ../js/ui/status/network.js:1435
#: ../js/ui/status/network.js:1436
msgid "VPN Settings"
msgstr "Настройкі VPN"
#: ../js/ui/status/network.js:1454
#: ../js/ui/status/network.js:1455
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1607
#: ../js/ui/status/network.js:1598
msgid "Network Manager"
msgstr "Сеткавы кіраўнік"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1637
msgid "Connection failed"
msgstr "Не ўдалося злучыцца"
#: ../js/ui/status/network.js:1647
#: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed"
msgstr "Не ўдалося ўключыць сеткавае злучэнне"
@ -1631,14 +1610,10 @@ msgstr "UPS"
msgid "Battery"
msgstr "Батарэя"
#: ../js/ui/status/rfkill.js:83
#: ../js/ui/status/rfkill.js:82
msgid "Airplane Mode"
msgstr "Рэжым самалёта"
#: ../js/ui/status/rfkill.js:85
msgid "On"
msgstr "Укл."
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "Перамяніць карыстальніка"
@ -1775,3 +1750,4 @@ msgstr "Пароль не можа быць пустым"
#: ../src/shell-polkit-authentication-agent.c:343
msgid "Authentication dialog was dismissed by the user"
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"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-03-27 21:19+0000\n"
"PO-Revision-Date: 2014-03-28 08:41+0300\n"
"POT-Creation-Date: 2014-02-19 23:39+0000\n"
"PO-Revision-Date: 2014-02-20 08:18+0300\n"
"Last-Translator: Dimitris Spingos (Δημήτρης Σπίγγος) <dmtrs32@gmail.com>\n"
"Language-Team: team@lists.gnome.gr\n"
"Language: el\n"
@ -47,7 +47,7 @@ msgstr "Άνοιγμα του μενού εφαρμογών"
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr "Κέλυφος GNOME Shell"
msgstr "GNOME Shell"
#: ../data/gnome-shell.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
#: ../js/extensionPrefs/main.js:155
msgid "GNOME Shell Extension Preferences"
msgstr "Προτιμήσεις επεκτάσεων του κελύφους GNOME Shell"
msgstr "Προτιμήσεις επεκτάσεων του GNOME Shell"
#: ../data/gnome-shell-extension-prefs.desktop.in.in.h:2
msgid "Configure GNOME Shell Extensions"
msgstr "Ρύθμιση επεκτάσεων του κελύφους GNOME Shell"
msgstr "Ρύθμιση επεκτάσεων του GNOME Shell"
#: ../data/gnome-shell-wayland.desktop.in.in.h:1
msgid "GNOME Shell (wayland compositor)"
msgstr "Κέλυφος GNOME Shell (συνθετητής wayland)"
msgstr "GNOME Shell (συνθετητής wayland)"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Ενεργοποίηση εσωτερικών εργαλείων χρήσιμων για τους προγραμματιστές και τους "
"δοκιμαστές, με το Alt-F2"
"δοκιμαστές με το Alt-F2"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
msgid ""
@ -79,7 +79,7 @@ msgid ""
"dialog."
msgstr ""
"Επιτρέπει την πρόσβαση σε εσωτερικά εργαλεία αποσφαλμάτωσης και "
"παρακολούθησης, με τη χρήση του διαλόγου Alt-F2."
"παρακολούθησης με τη χρήση του διαλόγου Alt-F2."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
msgid "UUIDs of extensions to enable"
@ -92,10 +92,10 @@ msgid ""
"list. You can also manipulate this list with the EnableExtension and "
"DisableExtension D-Bus methods on org.gnome.Shell."
msgstr ""
"Οι επεκτάσεις του κελύφους GNOME έχουν μια ιδιότητα UUID. Αυτό το κλειδί "
"Η επεκτάσεις του κελύφους GNOME έχουν μια ιδιότητα UUID· αυτό το κλειδί "
"εμφανίζει τις επεκτάσεις που πρέπει να φορτωθούν. Οποιαδήποτε επέκταση που "
"επιθυμεί να φορτωθεί πρέπει να είναι στον κατάλογο. Μπορείτε ακόμη να "
"χειρισθείτε αυτόν τον κατάλογο με τις μεθόδους διαύλου δεδομένων "
"χειριστείτε αυτόν τον κατάλογο με τις μεθόδους διαύλου δεδομένων "
"EnableExtension and DisableExtension στο org.gnome.Shell."
#: ../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"
msgstr ""
"Εάν θα θυμάται τον κωδικό πρόσβασης για προσάρτηση κρυπτογραφημένων ή "
"απομεμακρυσμένων συστημάτων αρχείων"
"απομακρυσμένων συστημάτων αρχείων"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
msgid ""
@ -161,9 +161,9 @@ msgid ""
"'Remember Password' checkbox will be present. This key sets the default "
"state of the checkbox."
msgstr ""
"Το κέλυφος θα ζητήσει έναν κωδικό όταν προσαρτάται μια κρυπτογραφημένη "
"συσκευή ή ένα απομεμακρυσμένο σύστημα αρχείων. Εάν ο κωδικός μπορεί να "
"αποθηκευθεί για μελλοντική χρήση, θα παρουσιάζεται ένα πλαίσιο ελέγχου 'Να "
"Το κέλυφος θα ζητήσει έναν κωδικό όταν μια κρυπτογραφημένη συσκευή ή ένα "
"απομακρυσμένο σύστημα αρχείων προσαρτάται. Εάν ο κωδικός μπορεί να "
"αποθηκευτεί για μελλοντική χρήση θα παρουσιάζεται ένα πλαίσιο ελέγχου 'Να "
"μην απαιτείται ο κωδικός πρόσβασης'. Αυτό το κλειδί ορίζει την προεπιλεγμένη "
"κατάσταση του πλαισίου ελέγχου."
@ -174,7 +174,7 @@ msgstr "Εμφάνιση του αριθμού εβδομάδας στο ημε
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
msgid "If true, display the ISO week date in the calendar."
msgstr ""
"Αν true, εμφανίζει τον αριθμό εβδομάδας σύμφωνα με το ISO στο ημερολόγιο."
"Αν αληθές, εμφανίζει τον αριθμό εβδομάδας σύμφωνα με το ISO στο ημερολόγιο."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
msgid "Keybinding to open the application menu"
@ -236,17 +236,17 @@ msgid ""
"Configures the maximum level of location accuracy applications are allowed "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'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 "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
"Ρυθμίζει το μέγιστο επίπεδο ακρίβειας στην εντόπιση θέσης το οποίο "
"επιτρέπεται να βλέπουν οι εφαρμογές. Οι έγκυρες επιλογές είναι "
"'όχι' (απενεργοποίηση εντοπισμού θέσης), 'χώρα', 'πόλη', 'γειτονιά', 'οδός' "
"και 'ακριβώς' (τυπικά, απαιτεί δέκτη GPS). Παρακαλούμε να θυμάστε ότι αυτό "
λέγχει μόνο τι θα επιτρέπει το Geoclue να βλέπουν οι εφαρμογές, ενώ αυτές "
"μπορούν να βρουν τη θέση του χρήστη και από μόνες τους, χρησιμοποιώντας "
"πόρους δικτύου (αν και, στην καλύτερη περίπτωση, με ακρίβεια επιπέδου οδού)."
"Ρυθμίζει το μέγιστο επίπεδο των εφαρμογών ακρίβειας της θέσης που "
"επιτρέπεται να δείτε. Οι έγκυρες επιλογές είναι 'όχι' (απενεργοποίηση "
"εντοπισμού θέσης), 'χώρα', 'πόλη', 'γειτονιά', 'οδός' και 'ακριβώς' (απαιτεί "
"τυπικά δέκτη GPS). Παρακαλούμε να θυμόσαστε ότι αυτό ελέγχει μόνο τι θα "
πιτρέψει στις εφαρμογές το Geoclue να δείτε και μπορούν να βρουν τη θέση "
"του χρήστη από μόνες τους χρησιμοποιώντας πόρους δικτύου (αν και με ακρίβεια "
"επιπέδου οδού στην καλύτερη περίπτωση)."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
msgid "The application icon mode."
@ -258,7 +258,7 @@ msgid ""
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Διαμορφώνει πώς θα εμφανίζονται τα παράθυρα κατά την εναλλαγή των παραθύρων. "
"Διαμορφώνει πώς τα παράθυρα θα εμφανίζονται στην εναλλαγή των παραθύρων. "
"Έγκυρες ρυθμίσεις είναι 'thumbnail-only' (εμφανίζει μια μικρογραφία του "
"παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή "
"'both' - και τα δύο."
@ -271,8 +271,8 @@ msgstr "Προσάρτηση αποκλειστικού διαλόγου στο
msgid ""
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.mutter όταν "
"εκτελείται το GNOME Shell."
"Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.mutter όταν εκτελείται "
"το GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
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 "
"GNOME Shell."
msgstr ""
"Αυτό το κλειδί υπερισχύει του κλειδιού που υπάρχει στο org.gnome.desktop.wm."
"preferences όταν εκτελείται το GNOME Shell."
"Αυτό το κλειδί υπερισχύει του κλειδιού στο org.gnome.desktop.wm.preferences "
"όταν εκτελείται το GNOME Shell."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Ενεργοποίηση της προσάρτησης άκρων, όταν αφήνετε παράθυρα στις άκρες της "
"Ενεργοποίηση της προσάρτηση άκρων, όταν αφήνετε παράθυρα στις άκρες της "
"οθόνης"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
msgid "Workspaces are managed dynamically"
msgstr "Η διαχείριση των χώρων γίνεται δυναμικά"
msgstr "Οι χώροι εργασίας διαχειρίζονται δυναμικά"
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
msgid "Workspaces only on primary monitor"
@ -310,8 +310,8 @@ msgstr ""
#, javascript-format
msgid "There was an error loading the preferences dialog for %s:"
msgstr ""
"Προέκυψε ένα σφάλμα κατά τη φόρτωση του παραθύρου διαλόγου των προτιμήσεων "
"για %s:"
"Προέκυψε ένα σφάλμα στη φόρτωση του παραθύρου διαλόγου των προτιμήσεων για "
"%s:"
#: ../js/extensionPrefs/main.js:167
msgid "Extension"
@ -326,7 +326,7 @@ msgstr ""
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:878
#: ../js/ui/status/network.js:883
msgid "Cancel"
msgstr "Ακύρωση"
@ -344,25 +344,25 @@ msgctxt "button"
msgid "Sign In"
msgstr "Σύνδεση"
#: ../js/gdm/loginDialog.js:271
#: ../js/gdm/loginDialog.js:270
msgid "Choose Session"
msgstr "Επιλογή συνεδρίας"
#: ../js/gdm/loginDialog.js:431
#: ../js/gdm/loginDialog.js:430
msgid "Not listed?"
msgstr "Δεν είστε στη λίστα;"
#: ../js/gdm/loginDialog.js:611
#: ../js/gdm/loginDialog.js:598
#, javascript-format
msgid "(e.g., user or %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
msgid "Username: "
msgstr "Όνομα χρήστη: "
#: ../js/gdm/loginDialog.js:917
#: ../js/gdm/loginDialog.js:868
msgid "Login Window"
msgstr "Παράθυρο σύνδεσης"
@ -380,34 +380,34 @@ msgstr "Δε βρέθηκε η εντολή"
#: ../js/misc/util.js:148
msgid "Could not parse command:"
msgstr "Δεν ήταν δυνατό να γίνει ανάλυση της εντολής:"
msgstr "Δεν ήταν δυνατό να επεξεργαστεί η εντολή:"
#: ../js/misc/util.js:156
#, javascript-format
msgid "Execution of “%s” failed:"
msgstr "Η εκτέλεση του “%s” απέτυχε:"
#: ../js/ui/appDisplay.js:636
#: ../js/ui/appDisplay.js:629
msgid "Frequently used applications will appear here"
msgstr "Οι πιο συχνά χρησιμοποιούμενες εφαρμογές θα εμφανιστούν εδώ"
msgstr "Οι συχνά χρησιμοποιούμενες εφαρμογές θα εμφανιστούν εδώ"
#: ../js/ui/appDisplay.js:747
#: ../js/ui/appDisplay.js:740
msgid "Frequent"
msgstr "Συχνά"
#: ../js/ui/appDisplay.js:754
#: ../js/ui/appDisplay.js:747
msgid "All"
msgstr "Όλα"
#: ../js/ui/appDisplay.js:1566
#: ../js/ui/appDisplay.js:1552
msgid "New Window"
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"
msgstr "Αφαίρεση από τα αγαπημένα"
#: ../js/ui/appDisplay.js:1594
#: ../js/ui/appDisplay.js:1580
msgid "Add to Favorites"
msgstr "Προσθήκη στα αγαπημένα"
@ -550,44 +550,44 @@ msgstr "Σα"
msgid "calendar:MY"
msgstr "ημερολόγιο:MY"
#: ../js/ui/calendar.js:450
#: ../js/ui/calendar.js:446
msgid "Previous month"
msgstr "Προηγούμενος μήνας"
#: ../js/ui/calendar.js:460
#: ../js/ui/calendar.js:456
msgid "Next month"
msgstr "Επόμενος μήνας"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:772
#: ../js/ui/calendar.js:762
msgid "Nothing Scheduled"
msgstr "Τίποτα προγραμματισμένο"
#. 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"
msgid "%A, %B %d"
msgstr "%A, %d %B"
msgstr "%A, %B %d"
#. 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"
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"
msgstr "Σήμερα"
#: ../js/ui/calendar.js:808
#: ../js/ui/calendar.js:798
msgid "Tomorrow"
msgstr "Αύριο"
#: ../js/ui/calendar.js:819
#: ../js/ui/calendar.js:809
msgid "This week"
msgstr "Αυτή η εβδομάδα"
#: ../js/ui/calendar.js:827
#: ../js/ui/calendar.js:817
msgid "Next week"
msgstr "Επόμενη εβδομάδα"
@ -620,8 +620,8 @@ msgstr "Κωδικός:"
msgid "Type again:"
msgstr "Πληκτρολογήστε ξανά:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect"
msgstr "Σύνδεση"
@ -960,8 +960,8 @@ msgstr "Το πιστοποιητικό έχει ανακληθεί"
msgid ""
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
msgstr ""
"Το πιστοποιητικό χρησιμοποιεί έναν μη ασφαλή αλγόριθμο αποκρυπτογράφησης "
"αποτυπώματος ή είναι κρυπτογραφικά ασθενές"
"Το πιστοποιητικό χρησιμοποιεί ένα μη ασφαλή αλγόριθμο αποτυπώματος ή είναι "
"αδύναμο κρυπτογραφικά"
#: ../js/ui/components/telepathyClient.js:1385
msgid ""
@ -987,7 +987,7 @@ msgstr "Αδυναμία σύνδεσης με %s"
msgid "View account"
msgstr "Προβολή λογαριασμού"
#: ../js/ui/components/telepathyClient.js:1439
#: ../js/ui/components/telepathyClient.js:1434
msgid "Unknown reason"
msgstr "Άγνωστος λόγος"
@ -1003,24 +1003,24 @@ msgstr "Εμφάνιση εφαρμογών"
msgid "Dash"
msgstr "Ταμπλό"
#: ../js/ui/dateMenu.js:91
#: ../js/ui/dateMenu.js:86
msgid "Open Calendar"
msgstr "Άνοιγμα ημερολογίου"
#: ../js/ui/dateMenu.js:95
#: ../js/ui/dateMenu.js:90
msgid "Open Clocks"
msgstr "Άνοιγμα ρολογιών"
#: ../js/ui/dateMenu.js:102
#: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings"
msgstr "Ρυθμίσεις ημερομηνίας & ώρας"
#. 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").
#. */
#: ../js/ui/dateMenu.js:192
#: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y"
msgstr "%A %B %e, %Y"
#: ../js/ui/endSessionDialog.js:66
#, javascript-format
@ -1066,8 +1066,8 @@ msgstr "Εγκατάσταση ενημερώσεων & τερματισμός"
#, javascript-format
msgid "The system will power off automatically in %d second."
msgid_plural "The system will power off automatically in %d seconds."
msgstr[0] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτο."
msgstr[1] "Το σύστημα θα τερματισθεί αυτόματα σε %d δευτερόλεπτα."
msgstr[0] "Το σύστημα θα τερματιστεί αυτόματα σε %d δευτερόλεπτο."
msgstr[1] "Το σύστημα θα τερματιστεί αυτόματα σε %d δευτερόλεπτα."
#: ../js/ui/endSessionDialog.js:93
msgctxt "checkbox"
@ -1137,11 +1137,11 @@ msgstr ""
#: ../js/ui/endSessionDialog.js:332
msgid "Some applications are busy or have unsaved work."
msgstr ""
"Κάποιες εφαρμογές είναι απασχολημένες ή έχουν εργασία που δεν αποθηκεύθηκε."
"Κάποιες εφαρμογές είναι απασχολημένες ή έχουν εργασία που δεν αποθηκεύτηκε."
#: ../js/ui/endSessionDialog.js:339
msgid "Other users are logged in."
msgstr "Είναι συνδεδεμένοι άλλοι χρήστες."
msgstr "Είναι συνδεμένοι άλλοι χρήστες."
#. Translators: Remote here refers to a remote session, like a ssh login */
#: ../js/ui/endSessionDialog.js:618
@ -1168,26 +1168,25 @@ msgstr "Λήψη και εγκατάσταση του “%s” από το exten
msgid "Keyboard"
msgstr "Πληκτρολόγιο"
#: ../js/ui/lookingGlass.js:643
#: ../js/ui/lookingGlass.js:641
msgid "No extensions installed"
msgstr "Δεν υπάρχουν εγκατεστημένες επεκτάσεις"
#. Translators: argument is an extension UUID. */
#: ../js/ui/lookingGlass.js:697
#: ../js/ui/lookingGlass.js:695
#, javascript-format
msgid "%s has not emitted any errors."
msgstr "Το %s δεν έδωσε σφάλματα."
#: ../js/ui/lookingGlass.js:703
#: ../js/ui/lookingGlass.js:701
msgid "Hide Errors"
msgstr "Απόκρυψη σφαλμάτων"
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767
#: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
msgid "Show Errors"
msgstr "Εμφάνιση σφαλμάτων"
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:167
#: ../js/ui/lookingGlass.js:714
msgid "Enabled"
msgstr "Ενεργοποιημένο"
@ -1195,64 +1194,64 @@ msgstr "Ενεργοποιημένο"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
#: ../src/gvc/gvc-mixer-control.c:1830
msgid "Disabled"
msgstr "Απενεργοποιημένο"
#: ../js/ui/lookingGlass.js:721
#: ../js/ui/lookingGlass.js:719
msgid "Error"
msgstr "Σφάλμα"
#: ../js/ui/lookingGlass.js:723
#: ../js/ui/lookingGlass.js:721
msgid "Out of date"
msgstr "Μη ενημερωμένο"
#: ../js/ui/lookingGlass.js:725
#: ../js/ui/lookingGlass.js:723
msgid "Downloading"
msgstr "Γίνεται λήψη"
#: ../js/ui/lookingGlass.js:749
#: ../js/ui/lookingGlass.js:747
msgid "View Source"
msgstr "Προβολή πηγής"
#: ../js/ui/lookingGlass.js:758
#: ../js/ui/lookingGlass.js:756
msgid "Web Page"
msgstr "Ιστοσελίδα"
#: ../js/ui/messageTray.js:1326
#: ../js/ui/messageTray.js:1324
msgid "Open"
msgstr "Άνοιγμα"
#: ../js/ui/messageTray.js:1333
#: ../js/ui/messageTray.js:1331
msgid "Remove"
msgstr "Αφαίρεση"
#: ../js/ui/messageTray.js:1630
#: ../js/ui/messageTray.js:1628
msgid "Notifications"
msgstr "Ειδοποιήσεις"
#: ../js/ui/messageTray.js:1637
#: ../js/ui/messageTray.js:1635
msgid "Clear Messages"
msgstr "Καθαρισμός μηνυμάτων"
#: ../js/ui/messageTray.js:1656
#: ../js/ui/messageTray.js:1654
msgid "Notification Settings"
msgstr "Ρυθμίσεις ειδοποιήσεων"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "Tray Menu"
msgstr "Μενού περιοχής ειδοποιήσεων"
#: ../js/ui/messageTray.js:1926
#: ../js/ui/messageTray.js:1924
msgid "No Messages"
msgstr "Κανένα μήνυμα"
#: ../js/ui/messageTray.js:1964
#: ../js/ui/messageTray.js:1962
msgid "Message Tray"
msgstr "Περιοχή ειδοποιήσεων μηνυμάτων"
#: ../js/ui/messageTray.js:2962
#: ../js/ui/messageTray.js:2946
msgid "System Information"
msgstr "Πληροφορίες συστήματος"
@ -1268,11 +1267,11 @@ msgid_plural "%d new messages"
msgstr[0] "%d νέο μήνυμα"
msgstr[1] "%d νέα μηνύματα"
#: ../js/ui/overview.js:84
#: ../js/ui/overview.js:83
msgid "Undo"
msgstr "Αναίρεση"
#: ../js/ui/overview.js:124
#: ../js/ui/overview.js:123
msgid "Overview"
msgstr "Επισκόπηση"
@ -1280,7 +1279,7 @@ msgstr "Επισκόπηση"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters. */
#: ../js/ui/overview.js:250
#: ../js/ui/overview.js:257
msgid "Type to search…"
msgstr "Πληκτρολογήστε για αναζήτηση…"
@ -1314,7 +1313,7 @@ msgstr "Κλείσιμο"
#. long format */
#: ../js/ui/screenShield.js:88
msgid "%A, %B %d"
msgstr "%A, %d %B"
msgstr "%A, %B %d"
#: ../js/ui/screenShield.js:153
#, javascript-format
@ -1323,27 +1322,27 @@ msgid_plural "%d new notifications"
msgstr[0] "%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"
msgstr "Κλείδωμα"
#: ../js/ui/screenShield.js:708
#: ../js/ui/screenShield.js:707
msgid "GNOME needs to lock the screen"
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"
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"
msgstr "Το κλείδωμα εμποδίσθηκε από μια εφαρμογή"
msgstr "Το κλείδωμα εμποδίστηκε από μια εφαρμογή"
#: ../js/ui/search.js:603
#: ../js/ui/search.js:589
msgid "Searching…"
msgstr "Αναζήτηση…"
#: ../js/ui/search.js:649
#: ../js/ui/search.js:632
msgid "No results."
msgstr "Δε βρέθηκαν αποτελέσματα."
@ -1415,29 +1414,30 @@ msgstr "Υψηλή αντίθεση"
msgid "Large Text"
msgstr "Μεγάλο κείμενο"
#: ../js/ui/status/bluetooth.js:49
#: ../js/ui/status/bluetooth.js:48
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../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
msgid "Turn Off"
msgstr "Σβήσιμο"
#: ../js/ui/status/bluetooth.js:54
#: ../js/ui/status/bluetooth.js:53
msgid "Bluetooth Settings"
msgstr "Ρυθμίσεις Bluetooth"
#: ../js/ui/status/bluetooth.js:104
#: ../js/ui/status/bluetooth.js:100
#, javascript-format
msgid "%d Connected Device"
msgid_plural "%d Connected Devices"
msgstr[0] "%d συνδεδεμένη συσκευή"
msgstr[1] "%d συνδεδεμένες συσκευές"
msgstr[0] "%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"
msgstr "Χωρίς σύνδεση"
@ -1449,170 +1449,159 @@ msgstr "Φωτεινότητα"
msgid "Show Keyboard Layout"
msgstr "Εμφάνιση διάταξης πληκτρολογίου"
#: ../js/ui/status/location.js:53
#: ../js/ui/status/location.js:52
msgid "Location"
msgstr "Θέση"
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
msgid "Disable"
msgstr "Απενεργοποίηση"
#: ../js/ui/status/location.js:165
msgid "Enable"
#: ../js/ui/status/location.js:61 ../js/ui/status/location.js:161
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/location.js:167
msgid "In Use"
msgstr "Σε χρήση"
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../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 "Ενεργοποίηση"
#: ../js/ui/status/network.js:74
msgid "<unknown>"
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
#. 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"
msgstr "χωρίς διαχείριση"
msgstr "μη διαχειριζόμενες"
#: ../js/ui/status/network.js:428
#: ../js/ui/status/network.js:433
msgid "disconnecting..."
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..."
msgstr "σύνδεση..."
#. 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"
msgstr "απαιτείται πιστοποίηση"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:445
#: ../js/ui/status/network.js:450
msgid "firmware missing"
msgstr "έλλειψη λογισμικού υλικού (firmware)"
msgstr "έλλειψη firmware"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:449
#: ../js/ui/status/network.js:454
msgid "unavailable"
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"
msgstr "αποτυχία σύνδεσης"
#: ../js/ui/status/network.js:467
#: ../js/ui/status/network.js:472
msgid "Wired Settings"
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"
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"
msgstr "Το Υλικό απενεργοποιήθηκε"
msgstr "Το Υλικό Απενεργοποιήθηκε"
#: ../js/ui/status/network.js:595
#: ../js/ui/status/network.js:600
msgid "Use as Internet connection"
msgstr "Χρήση με σύνδεση διαδικτύου"
#: ../js/ui/status/network.js:776
#: ../js/ui/status/network.js:781
msgid "Airplane Mode is On"
msgstr "Η κατάσταση λειτουργίας αεροπλάνου είναι ενεργή"
#: ../js/ui/status/network.js:777
#: ../js/ui/status/network.js:782
msgid "Wi-Fi is disabled when airplane mode is on."
msgstr ""
"Η ασύρματη σύνδεση είναι ανενεργή όταν η λειτουργία αεροπλάνου είναι ενεργή."
#: ../js/ui/status/network.js:778
#: ../js/ui/status/network.js:783
msgid "Turn Off Airplane Mode"
msgstr "Απενεργοποίηση της κατάστασης λειτουργίας αεροπλάνου"
#: ../js/ui/status/network.js:787
#: ../js/ui/status/network.js:792
msgid "Wi-Fi is Off"
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."
msgstr ""
"Το ασύρματο δίκτυο χρειάζεται να ενεργοποιηθεί για να συνδεθείτε με ένα "
"δίκτυο."
#: ../js/ui/status/network.js:789
#: ../js/ui/status/network.js:794
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"
msgstr "Δίκτυα Wi-Fi"
#: ../js/ui/status/network.js:816
#: ../js/ui/status/network.js:821
msgid "Select a network"
msgstr "Επιλογή δικτύου"
#: ../js/ui/status/network.js:845
#: ../js/ui/status/network.js:850
msgid "No Networks"
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"
msgstr "Χρήση διακόπτη υλικού για τερματισμό"
msgstr "Χρησιμοποιήστε διακόπτη υλικού για τερματισμό"
#: ../js/ui/status/network.js:1136
#: ../js/ui/status/network.js:1141
msgid "Select Network"
msgstr "Επιλογή δικτύου"
#: ../js/ui/status/network.js:1142
#: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings"
msgstr "Ρυθμίσεις Wi-Fi"
#: ../js/ui/status/network.js:1234
msgid "Turn On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/network.js:1251
#: ../js/ui/status/network.js:1252
msgid "Hotspot Active"
msgstr "Ενεργό θερμό σημείο"
#: ../js/ui/status/network.js:1254
#: ../js/ui/status/network.js:1255
msgid "Connecting"
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"
msgstr "Ρυθμίσεις δικτύου"
#: ../js/ui/status/network.js:1435
#: ../js/ui/status/network.js:1436
msgid "VPN Settings"
msgstr "Ρυθμίσεις VPN"
#: ../js/ui/status/network.js:1454
#: ../js/ui/status/network.js:1455
msgid "VPN"
msgstr "VPN"
#: ../js/ui/status/network.js:1607
#: ../js/ui/status/network.js:1598
msgid "Network Manager"
msgstr "Διαχειριστής δικτύου"
#: ../js/ui/status/network.js:1646
#: ../js/ui/status/network.js:1637
msgid "Connection failed"
msgstr "Αποτυχία σύνδεσης"
#: ../js/ui/status/network.js:1647
#: ../js/ui/status/network.js:1638
msgid "Activation of network connection failed"
msgstr "Απέτυχε η ενεργοποίηση της σύνδεσης δικτύου"
@ -1650,10 +1639,6 @@ msgstr "Μπαταρία"
msgid "Airplane Mode"
msgstr "Κατάσταση λειτουργίας αεροπλάνου"
#: ../js/ui/status/rfkill.js:84
msgid "On"
msgstr "Ενεργοποίηση"
#: ../js/ui/status/system.js:314
msgid "Switch User"
msgstr "Αλλαγή χρήστη"
@ -1767,8 +1752,8 @@ msgstr ""
#: ../src/main.c:361
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
msgstr ""
"Χρήση μιας συγκεκριμένης κατάστασης λειτουργίας, π.χ. \"gdm\" για την οθόνη "
"σύνδεσης"
"Χρησιμοποιήστε μια συγκεκριμένη κατάσταση λειτουργίας, π.χ. \"gdm\" για την "
"οθόνη σύνδεσης"
#: ../src/main.c:367
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"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2014-03-05 20:31+0000\n"
"PO-Revision-Date: 2014-03-05 22:43+0200\n"
"POT-Creation-Date: 2014-02-24 08:30+0000\n"
"PO-Revision-Date: 2014-02-24 21:20+0200\n"
"Last-Translator: Jiri Grönroos <jiri.gronroos+l10n@iki.fi>\n"
"Language-Team: suomi <gnome-fi-laatu@lists.sourceforge.net>\n"
"Language: fi\n"
@ -100,9 +100,10 @@ msgstr ""
"kautta."
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
#, fuzzy
#| 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
#, fuzzy
@ -124,7 +125,7 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
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
msgid ""
@ -152,6 +153,7 @@ msgid "History for the looking glass dialog"
msgstr "Historia näyttölasi-ikkunalle"
#: ../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."
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 "
"to see. Valid options are 'off' (disable location tracking), 'country', "
"'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 "
"using network resources (albeit with street-level accuracy at best)."
msgstr ""
@ -322,7 +324,7 @@ msgstr "Valitse muokattava laajennus alta."
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
#: ../js/ui/status/network.js:873
#: ../js/ui/status/network.js:883
msgid "Cancel"
msgstr "Peru"
@ -380,6 +382,7 @@ msgstr "Komentoa ei voi jäsentää:"
#: ../js/misc/util.js:156
#, javascript-format
#| msgid "Execution of '%s' failed:"
msgid "Execution of “%s” failed:"
msgstr "Kohteen ”%s” suorittaminen epäonnistui:"
@ -555,35 +558,35 @@ msgid "Next month"
msgstr "Seuraava kuukausi"
#. Translators: Text to show if there are no events */
#: ../js/ui/calendar.js:763
#: ../js/ui/calendar.js:762
msgid "Nothing Scheduled"
msgstr "Ei merkintöjä"
#. 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"
msgid "%A, %B %d"
msgstr "%A, %e. %Bta"
#. 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"
msgid "%A, %B %d, %Y"
msgstr "%A, %e. %Bta %Y"
#: ../js/ui/calendar.js:795
#: ../js/ui/calendar.js:794
msgid "Today"
msgstr "Tänään"
#: ../js/ui/calendar.js:799
#: ../js/ui/calendar.js:798
msgid "Tomorrow"
msgstr "Huomenna"
#: ../js/ui/calendar.js:810
#: ../js/ui/calendar.js:809
msgid "This week"
msgstr "Tällä viikolla"
#: ../js/ui/calendar.js:818
#: ../js/ui/calendar.js:817
msgid "Next week"
msgstr "Ensi viikolla"
@ -616,8 +619,8 @@ msgstr "Salasana:"
msgid "Type again:"
msgstr "Uudelleen:"
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
#: ../js/ui/status/network.js:317 ../js/ui/status/network.js:876
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
msgid "Connect"
msgstr "Yhdistä"
@ -651,6 +654,9 @@ msgstr "Langaton verkko vaatii tunnistautumisen"
#: ../js/ui/components/networkAgent.js:312
#, javascript-format
#| msgid ""
#| "Passwords or encryption keys are required to access the wireless network "
#| "'%s'."
msgid ""
"Passwords or encryption keys are required to access the wireless network "
"“%s”."
@ -686,6 +692,7 @@ msgstr "Mobiililaajakaistan verkkosalasana"
#: ../js/ui/components/networkAgent.js:339
#, javascript-format
#| 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."
@ -735,18 +742,23 @@ msgstr "Vaimenna"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:955
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%H%M"
msgstr "%H%M"
#. Translators: this is the word "Yesterday" followed by a
#. time string in 24h format. i.e. "Yesterday, 14:30" */
#: ../js/ui/components/telepathyClient.js:962
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
msgid "Yesterday, %H%M"
msgstr "Eilen, %H%M"
#. Translators: this is the week day name followed by a time
#. string in 24h format. i.e. "Monday, 14:30" */
#: ../js/ui/components/telepathyClient.js:969
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%A, %H%M"
msgstr "%A, %H%M"
@ -754,6 +766,8 @@ msgstr "%A, %H%M"
#. followed by a time string in 24h format.
#. i.e. "May 25, 14:30" */
#: ../js/ui/components/telepathyClient.js:976
#| msgctxt "event list time"
#| msgid "%H%M"
msgid "%B %d, %H%M"
msgstr "%e. %Bta, %H%M"
@ -766,6 +780,8 @@ msgstr "%e. %Bta %Y, %H%M"
#. Translators: Time in 24h format */
#: ../js/ui/components/telepathyClient.js:991
#| msgctxt "event list time"
#| msgid "%l%M%p"
msgid "%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
#. string in 12h format. i.e. "Monday, 2:30 pm" */
#: ../js/ui/components/telepathyClient.js:1005
#| msgid "%a %l:%M %p"
msgid "%A, %l%M %p"
msgstr "%A, %l%M %p"
@ -995,22 +1012,22 @@ msgstr "Näytä sovellukset"
msgid "Dash"
msgstr "Pikavalikko"
#: ../js/ui/dateMenu.js:91
#: ../js/ui/dateMenu.js:86
msgid "Open Calendar"
msgstr "Avaa kalenteri"
#: ../js/ui/dateMenu.js:95
#: ../js/ui/dateMenu.js:90
msgid "Open Clocks"
msgstr "Avaa kellot"
#: ../js/ui/dateMenu.js:102
#: ../js/ui/dateMenu.js:97
msgid "Date & Time Settings"
msgstr "Ajan & päiväyksen asetukset"
#. 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").
#. */
#: ../js/ui/dateMenu.js:192
#: ../js/ui/dateMenu.js:187
msgid "%A %B %e, %Y"
msgstr "%A, %e. %Bta %Y"
@ -1108,6 +1125,8 @@ msgstr[1] ""
"sekunnin kuluttua."
#: ../js/ui/endSessionDialog.js:129
#| msgctxt "button"
#| msgid "Restart & Install"
msgctxt "button"
msgid "Restart &amp; Install"
msgstr "Käynnistä uudelleen ja asenna"
@ -1154,6 +1173,7 @@ msgstr "Asenna"
#: ../js/ui/extensionDownloader.js:204
#, javascript-format
#| msgid "Download and install '%s' from extensions.gnome.org?"
msgid "Download and install “%s” from extensions.gnome.org?"
msgstr "Ladataanko ja asennetaanko ”%s” sivustolta extensions.gnome.org?"
@ -1187,7 +1207,7 @@ msgstr "Käytössä"
#. because it's disabled by rfkill (airplane mode) */
#. translators:
#. * 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
msgid "Disabled"
msgstr "Ei käytössä"
@ -1212,39 +1232,39 @@ msgstr "Näytä lähde"
msgid "Web Page"
msgstr "Verkkosivusto"
#: ../js/ui/messageTray.js:1326
#: ../js/ui/messageTray.js:1324
msgid "Open"
msgstr "Avaa"
#: ../js/ui/messageTray.js:1333
#: ../js/ui/messageTray.js:1331
msgid "Remove"
msgstr "Poista"
#: ../js/ui/messageTray.js:1630
#: ../js/ui/messageTray.js:1628
msgid "Notifications"
msgstr "Ilmoitukset"
#: ../js/ui/messageTray.js:1637
#: ../js/ui/messageTray.js:1635
msgid "Clear Messages"
msgstr "Tyhjennä viestit"
#: ../js/ui/messageTray.js:1656
#: ../js/ui/messageTray.js:1654
msgid "Notification Settings"
msgstr "Ilmoitusasetukset"
#: ../js/ui/messageTray.js:1709
#: ../js/ui/messageTray.js:1707
msgid "Tray Menu"
msgstr "Viestialuevalikko"
#: ../js/ui/messageTray.js:1926
#: ../js/ui/messageTray.js:1924
msgid "No Messages"
msgstr "Ei viestejä"
#: ../js/ui/messageTray.js:1964
#: ../js/ui/messageTray.js:1962
msgid "Message Tray"
msgstr "Viestialue"
#: ../js/ui/messageTray.js:2948
#: ../js/ui/messageTray.js:2946
msgid "System Information"
msgstr "Järjestelmän tiedot"
@ -1411,10 +1431,10 @@ msgstr "Suuri tekstin koko"
msgid "Bluetooth"
msgstr "Bluetooth"
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:59
#: ../js/ui/status/location.js:159 ../js/ui/status/network.js:151
#: ../js/ui/status/network.js:318 ../js/ui/status/network.js:1225
#: ../js/ui/status/network.js:1336 ../js/ui/status/rfkill.js:85
#: ../js/ui/status/bluetooth.js:50 ../js/ui/status/location.js:62
#: ../js/ui/status/location.js:162 ../js/ui/status/network.js:151
#: ../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
msgid "Turn Off"
msgstr "Sammuta"
@ -1430,7 +1450,7 @@ msgid_plural "%d Connected Devices"
msgstr[0] "%d yhdistetty laite"
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"
msgstr "Ei yhdistetty"
@ -1443,20 +1463,21 @@ msgid "Show Keyboard Layout"
msgstr "Näytä näppäimistön asettelu"
#: ../js/ui/status/location.js:52
#| msgid "Notifications"
msgid "Location"
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
msgid "On"
msgstr "Päällä"
#: ../js/ui/status/location.js:155 ../js/ui/status/network.js:415
#: ../js/ui/status/network.js:1251 ../js/ui/status/network.js:1455
#: ../js/ui/status/location.js:158 ../js/ui/status/network.js:246
#: ../js/ui/status/network.js:425 ../js/ui/status/network.js:1261
msgid "Off"
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"
msgstr "Ota käyttöön"
@ -1464,127 +1485,130 @@ msgstr "Ota käyttöön"
msgid "<unknown>"
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
#. 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"
msgstr "ei hallinnassa"
#: ../js/ui/status/network.js:423
#: ../js/ui/status/network.js:433
msgid "disconnecting..."
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..."
msgstr "yhdistetään…"
#. 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"
msgstr "tunnistautuminen vaaditaan"
#. Translators: this is for devices that require some kind of firmware or kernel
#. module, which is missing */
#: ../js/ui/status/network.js:440
#: ../js/ui/status/network.js:450
msgid "firmware missing"
msgstr "laiteohjelmisto puuttuu"
#. Translators: this is for a network device that cannot be activated (for example it
#. is disabled by rfkill, or it has no coverage */
#: ../js/ui/status/network.js:444
#: ../js/ui/status/network.js:454
msgid "unavailable"
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"
msgstr "yhteys katkesi"
#: ../js/ui/status/network.js:462
#: ../js/ui/status/network.js:472
#| msgid "Wi-Fi Settings"
msgid "Wired Settings"
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"
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"
msgstr "Laite on pois käytöstä"
#: ../js/ui/status/network.js:590
#: ../js/ui/status/network.js:600
msgid "Use as Internet connection"
msgstr "Käytä internetyhteytenä"
#: ../js/ui/status/network.js:771
#: ../js/ui/status/network.js:781
#| msgid "Airplane Mode"
msgid "Airplane Mode is On"
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."
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"
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"
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."
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"
msgstr "Ota wifi käyttöön"
#: ../js/ui/status/network.js:809
#: ../js/ui/status/network.js:819
msgid "Wi-Fi Networks"
msgstr "Wifi-verkot"
#: ../js/ui/status/network.js:811
#: ../js/ui/status/network.js:821
msgid "Select a network"
msgstr "Valitse verkko"
#: ../js/ui/status/network.js:840
#: ../js/ui/status/network.js:850
msgid "No Networks"
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"
msgstr "Käytä laitepainiketta sammuttaaksesi"
msgstr ""
#: ../js/ui/status/network.js:1131
#: ../js/ui/status/network.js:1141
msgid "Select Network"
msgstr "Valitse verkko"
#: ../js/ui/status/network.js:1137
#: ../js/ui/status/network.js:1147
msgid "Wi-Fi Settings"
msgstr "Wifin asetukset"
#: ../js/ui/status/network.js:1242
#: ../js/ui/status/network.js:1252
msgid "Hotspot Active"
msgstr "Yhteyspiste aktiivisena"
#: ../js/ui/status/network.js:1245
#: ../js/ui/status/network.js:1255
#| msgid "Connection"
msgid "Connecting"
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"
msgstr "Verkkoasetukset"
#: ../js/ui/status/network.js:1426
#: ../js/ui/status/network.js:1436
#| msgid "Settings"
msgid "VPN Settings"
msgstr "VPN-asetukset"
#: ../js/ui/status/network.js:1445
#: ../js/ui/status/network.js:1455
msgid "VPN"
msgstr "VPN"
@ -1684,6 +1708,7 @@ msgstr "Haku"
#: ../js/ui/windowAttentionHandler.js:19
#, javascript-format
#| msgid "'%s' is ready"
msgid "“%s” is ready"
msgstr "“%s” on valmis"
@ -1753,6 +1778,7 @@ msgstr "Listaa mahdolliset tilat"
#: ../src/shell-app.c:666
#, c-format
#| msgid "Failed to launch '%s'"
msgid "Failed to launch “%s”"
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

832
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