Compare commits
239 Commits
wip/quadbu
...
3.13.4
Author | SHA1 | Date | |
---|---|---|---|
c9f6d5e2a1 | |||
eba2b999ed | |||
cceac0d8fb | |||
14eedf8651 | |||
9c6180afa2 | |||
f1b1dbcb00 | |||
ee23b8dbe0 | |||
c9e00bee08 | |||
9970671bb1 | |||
bb4502dca8 | |||
d77c7a407c | |||
554001c0ed | |||
4d153bc96f | |||
476394809a | |||
b6f3e15037 | |||
46c86e093c | |||
c6350aa557 | |||
4e56af39da | |||
9fff972946 | |||
e30925995f | |||
f0d4260c81 | |||
a7f82745c6 | |||
a6fa6519d5 | |||
a944dca60e | |||
fdc443aebe | |||
7e08e1e0e7 | |||
bd7938e02f | |||
a583f45cc6 | |||
1071ac5d25 | |||
45793d0e47 | |||
ea3866a07a | |||
e41879a5c4 | |||
24dc926660 | |||
932b895127 | |||
9c4ffc4bf3 | |||
1ea2e2bcab | |||
a8b15dd2cf | |||
b1b8147ab8 | |||
39c210abed | |||
4bb2a364d3 | |||
6d3ebdcb5e | |||
e865db57e0 | |||
19ba9a98b8 | |||
4a39af7f98 | |||
c326aad9d7 | |||
dc94f7b9f5 | |||
e5be41b667 | |||
775bd961b6 | |||
3c67d012e7 | |||
2fbd8f063e | |||
f285f2c69f | |||
e375e1a857 | |||
910c95fa9b | |||
b95c0682b0 | |||
9f460a36f6 | |||
41a3f10938 | |||
d850c8599e | |||
ec288d0e68 | |||
0b92cd0772 | |||
c7f5f172dd | |||
84bc445593 | |||
365bfcae12 | |||
47c9243271 | |||
8c67a70db0 | |||
5f4591e24c | |||
37ef0e4bed | |||
7d7b92419f | |||
309d40a92b | |||
02718357da | |||
cfef107114 | |||
b742b1eed2 | |||
d58be565a1 | |||
522ed3c21d | |||
2fb8781f30 | |||
2bda6db30f | |||
8abd18363c | |||
256bb532a2 | |||
6077e28f95 | |||
83cb26d70e | |||
6d66afc14e | |||
88faee4c79 | |||
66f5e4b44d | |||
772d8692e7 | |||
17f481f6fe | |||
b057e786a4 | |||
8b9904b6d0 | |||
43ae3b8140 | |||
f76dd4d6b2 | |||
079cc39166 | |||
bf0c7f731d | |||
5a8a293614 | |||
c768ee6175 | |||
75c2a723d9 | |||
32240df141 | |||
c532e3f1a5 | |||
b04c79643d | |||
4eca992db8 | |||
c36ca625e6 | |||
238466b3d6 | |||
4f28840a59 | |||
d98c1ba522 | |||
9bbb3e9c85 | |||
2710c56827 | |||
e22ff0e42d | |||
8c74a4fee0 | |||
234b90ac86 | |||
ce46b06f36 | |||
585930123d | |||
5d00c1a5ee | |||
f288c43e6e | |||
b981a591c7 | |||
3b7756b610 | |||
292f87caf7 | |||
ae2751a68b | |||
589becbc79 | |||
4c7fcf272c | |||
e51aecee03 | |||
d98e7dbd4a | |||
1b97778925 | |||
829e7623df | |||
89675c9061 | |||
f9df83802d | |||
e51eb723fc | |||
5b61f2d642 | |||
094669baee | |||
f6b5385495 | |||
524e2df708 | |||
9f887d9a28 | |||
214a41793f | |||
2e40ffc558 | |||
3584887938 | |||
0d6c002b8e | |||
ec714864f2 | |||
1b77149ec9 | |||
93c9e031e3 | |||
3ff4277f86 | |||
2a63267be0 | |||
2b365627ed | |||
b8f0d0f0dc | |||
df1bed941d | |||
604085fdb9 | |||
2d3c81390b | |||
516b8f6bf8 | |||
75fdca0b47 | |||
9f366118f0 | |||
c228a9a89a | |||
e747fcb16f | |||
a72a24ebff | |||
8811ba2ec0 | |||
38d8e465b3 | |||
5b3fb024be | |||
521f5f2b6b | |||
e1b30b2924 | |||
dd85670f8b | |||
625f3a5113 | |||
58c4a6c847 | |||
752aca811c | |||
a4cf0501ee | |||
4c7b992c36 | |||
264a51de3f | |||
625280bcd6 | |||
4f8265f82e | |||
ff07d3a46a | |||
5d11941638 | |||
f1f659571b | |||
c60d13b33e | |||
33060d382b | |||
4b1e412ac3 | |||
659730ab09 | |||
7c3a99b7ed | |||
e7af257814 | |||
c9190294bc | |||
e070e3c44a | |||
fe87de7cec | |||
2519e4f08d | |||
fe304d3c94 | |||
1f4e6872ab | |||
5ade2e7418 | |||
3e7d325e77 | |||
ef04a9d1ed | |||
011fef4b2b | |||
caf6389f79 | |||
c7306449ae | |||
8c45e6fa43 | |||
9504d21297 | |||
0832ca544a | |||
a000a1f76e | |||
ea8b02ff7f | |||
3cc7112283 | |||
50f0fc4e23 | |||
0a4ad01d8a | |||
19afabe2a1 | |||
103027a446 | |||
28c1f81f4a | |||
82ec6c08b8 | |||
551e57406d | |||
1c8036b863 | |||
f8bac5c197 | |||
6ece67b654 | |||
96411dfed5 | |||
24897169a9 | |||
05ddece9a0 | |||
df08ae7996 | |||
a244c1e987 | |||
bc182f78b1 | |||
2d18b06b3f | |||
61852df9a1 | |||
3969be38bd | |||
92f9aff784 | |||
815cfe6c20 | |||
052b5176d2 | |||
bccbcd8e4a | |||
90589fabee | |||
5947111f14 | |||
c8c56a5443 | |||
a83b9ed6d7 | |||
f9c83bccb6 | |||
2f720e22fc | |||
329028d3b9 | |||
5c3f9f6999 | |||
4a6b89d44c | |||
7fa1834ab6 | |||
c7bc9f8925 | |||
70d75ca311 | |||
9830b3b8f7 | |||
525c8780fd | |||
76c4ec8ee4 | |||
b4a48a7644 | |||
5087f0930c | |||
398cc5af85 | |||
f073945d31 | |||
c36abcb905 | |||
e2ccbe5528 | |||
68b2d5fcf0 | |||
cd2bd7685a | |||
85f811f147 | |||
e8fd8b58d0 | |||
2aa12e8f4b | |||
ee0c76c2b9 |
6
.gitignore
vendored
6
.gitignore
vendored
@ -28,6 +28,8 @@ data/org.gnome.shell.gschema.xml
|
||||
data/org.gnome.shell.gschema.valid
|
||||
data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
||||
data/org.gnome.Shell.PortalHelper.desktop
|
||||
data/org.gnome.Shell.PortalHelper.service
|
||||
docs/reference/*/*.args
|
||||
docs/reference/*/*.bak
|
||||
docs/reference/*/*.hierarchy
|
||||
@ -78,11 +80,9 @@ 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/gnome-shell-portal-helper
|
||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||
src/run-js-test
|
||||
src/test-recorder
|
||||
|
114
NEWS
114
NEWS
@ -1,3 +1,117 @@
|
||||
3.13.4
|
||||
======
|
||||
* Handle portal login requests [Giovanni; #704416]
|
||||
* Scale fonts on wayland on hiDPI devices [Adel; #732537]
|
||||
* Fix default ibus candidate index labels [Rui; #702944]
|
||||
* Add gestures for various system actions [Carlos G.]
|
||||
* Add performance test script for the perf.gnome.org [Owen; #732350]
|
||||
* Use new restart framework to improve restart visuals [Owen; #733026]
|
||||
* Improve keynav in app folder popups [Carlos S.; #731477]
|
||||
* Fix truncation of app search results [Carlos S.; #732416]
|
||||
* Automatically update renamed desktop files in favorites [Kalev; #729429]
|
||||
* Misc. bug fixes and cleanups [Giovanni, Yosef, Owen, Bastien, Javier;
|
||||
#729823, #726401, #732301, #732348, #732349, #733498, #733540]
|
||||
|
||||
Contributors:
|
||||
Giovanni Campagna, Adel Gadllah, Carlos Garnacho, Javier Hernández,
|
||||
Kalev Lember, Rui Matos, Florian Müllner, Bastien Nocera, Yosef Or Boczko,
|
||||
Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
|
||||
|
||||
Translations:
|
||||
Yuri Myasoedov [ru], Daniel Mustieles [es], Fran Diéguez [gl],
|
||||
Cheng-Chia Tseng [zh_TW], A S Alam [pa], Benjamin Steinwender [de],
|
||||
Enrico Nicoletto [pt_BR], MarMav [el], Yosef Or Boczko [he],
|
||||
Kjartan Maraas [nb]
|
||||
|
||||
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]
|
||||
|
19
configure.ac
19
configure.ac
@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.12.0],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||
AC_INIT([gnome-shell],[3.13.4],[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.12.0
|
||||
MUTTER_MIN_VERSION=3.13.4
|
||||
GTK_MIN_VERSION=3.7.9
|
||||
GIO_MIN_VERSION=2.37.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
@ -112,13 +112,6 @@ 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)
|
||||
@ -230,6 +223,14 @@ 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])
|
||||
|
@ -1,9 +1,23 @@
|
||||
desktopdir=$(datadir)/applications
|
||||
desktop_DATA = gnome-shell.desktop gnome-shell-extension-prefs.desktop
|
||||
if HAVE_MUTTER_WAYLAND
|
||||
desktop_DATA += gnome-shell-wayland.desktop
|
||||
endif HAVE_MUTTER_WAYLAND
|
||||
CLEANFILES =
|
||||
|
||||
desktopdir=$(datadir)/applications
|
||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
||||
|
||||
if HAVE_NETWORKMANAGER
|
||||
desktop_DATA += org.gnome.Shell.PortalHelper.desktop
|
||||
|
||||
servicedir = $(datadir)/dbus-1/services
|
||||
service_DATA = org.gnome.Shell.PortalHelper.service
|
||||
|
||||
CLEANFILES += \
|
||||
org.gnome.Shell.PortalHelper.service \
|
||||
org.gnome.Shell.PortalHelper.desktop
|
||||
|
||||
endif
|
||||
|
||||
%.service: %.service.in
|
||||
$(AM_V_GEN) sed -e "s|@libexecdir[@]|$(libexecdir)|" \
|
||||
$< > $@ || rm $@
|
||||
|
||||
# We substitute in bindir so it works as an autostart
|
||||
# file when built in a non-system prefix
|
||||
@ -39,7 +53,6 @@ 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 \
|
||||
@ -93,9 +106,11 @@ EXTRA_DIST = \
|
||||
$(menu_DATA) \
|
||||
$(convert_DATA) \
|
||||
$(keys_in_files) \
|
||||
org.gnome.Shell.PortalHelper.desktop.in \
|
||||
org.gnome.Shell.PortalHelper.service.in \
|
||||
org.gnome.shell.gschema.xml.in.in
|
||||
|
||||
CLEANFILES = \
|
||||
CLEANFILES += \
|
||||
gnome-shell.desktop.in \
|
||||
gnome-shell-wayland.desktop.in \
|
||||
gnome-shell-extension-prefs.in \
|
||||
|
@ -1,5 +1,4 @@
|
||||
[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
|
||||
|
@ -2,7 +2,7 @@
|
||||
Type=Application
|
||||
_Name=GNOME Shell (wayland compositor)
|
||||
_Comment=Window management and application launching
|
||||
Exec=@bindir@/mutter-launch -- gnome-shell-wayland --wayland --display-server
|
||||
Exec=@bindir@/gnome-shell --wayland --display-server
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-shell
|
||||
X-GNOME-Bugzilla-Component=general
|
||||
|
9
data/org.gnome.Shell.PortalHelper.desktop.in
Normal file
9
data/org.gnome.Shell.PortalHelper.desktop.in
Normal file
@ -0,0 +1,9 @@
|
||||
[Desktop Entry]
|
||||
_Name=Captive Portal
|
||||
Type=Application
|
||||
Exec=gapplication launch org.gnome.Shell.PortalHelper
|
||||
DBusActivatable=true
|
||||
NoDisplay=true
|
||||
Icon=network-workgroup
|
||||
StartupNotify=true
|
||||
OnlyShowIn=GNOME;
|
3
data/org.gnome.Shell.PortalHelper.service.in
Normal file
3
data/org.gnome.Shell.PortalHelper.service.in
Normal file
@ -0,0 +1,3 @@
|
||||
[D-BUS Service]
|
||||
Name=org.gnome.Shell.PortalHelper
|
||||
Exec=@libexecdir@/gnome-shell-portal-helper
|
@ -38,7 +38,6 @@
|
||||
<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>
|
||||
|
@ -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', 'nautilus.desktop', 'gnome-documents.desktop' ]</default>
|
||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.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,15 +221,6 @@
|
||||
</_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>
|
||||
|
@ -45,7 +45,7 @@ stage {
|
||||
/* small bold */
|
||||
.dash-label,
|
||||
.window-caption,
|
||||
.switcher-list,
|
||||
.switcher-list,
|
||||
.app-well-app > .overview-icon,
|
||||
.show-apps > .overview-icon,
|
||||
.grid-search-result .overview-icon {
|
||||
@ -153,6 +153,21 @@ 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;
|
||||
}
|
||||
@ -166,6 +181,15 @@ 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);
|
||||
@ -173,6 +197,20 @@ 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;
|
||||
}
|
||||
@ -221,7 +259,29 @@ StScrollBar StButton#vhandle:active {
|
||||
color: #9f9f9f;
|
||||
}
|
||||
|
||||
.popup-image-menu-item {
|
||||
.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-separator-menu-item {
|
||||
@ -233,8 +293,15 @@ StScrollBar StButton#vhandle:active {
|
||||
padding: 8px 0px;
|
||||
}
|
||||
|
||||
.popup-alternating-menu-item:alternate {
|
||||
font-weight: bold;
|
||||
.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-status-menu-item {
|
||||
@ -336,6 +403,14 @@ StScrollBar StButton#vhandle:active {
|
||||
icon-size: 16px;
|
||||
}
|
||||
|
||||
.no-networks-label {
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.no-networks-box {
|
||||
spacing: 12px;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.candidate-page-button,
|
||||
@ -582,11 +657,6 @@ StScrollBar StButton#vhandle:active {
|
||||
app-icon-bottom-clip: 2px;
|
||||
}
|
||||
|
||||
.app-menu-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.panel-button {
|
||||
-natural-hpadding: 12px;
|
||||
-minimum-hpadding: 6px;
|
||||
@ -1157,11 +1227,6 @@ 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;
|
||||
@ -1241,14 +1306,8 @@ 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 {
|
||||
@ -1444,11 +1503,8 @@ StScrollBar StButton#vhandle:active {
|
||||
padding-right: 8pt;
|
||||
}
|
||||
|
||||
.url-highlighter {
|
||||
link-color: #ccccff;
|
||||
}
|
||||
|
||||
/* Message Tray */
|
||||
|
||||
#message-tray {
|
||||
background: #2e3436 url(message-tray-background.png);
|
||||
background-repeat: repeat;
|
||||
@ -1471,13 +1527,12 @@ StScrollBar StButton#vhandle:active {
|
||||
color: #eeeeee;
|
||||
}
|
||||
|
||||
.no-messages-label,
|
||||
.no-networks-label {
|
||||
color: #999999;
|
||||
.url-highlighter {
|
||||
link-color: #ccccff;
|
||||
}
|
||||
|
||||
.no-networks-box {
|
||||
spacing: 12px;
|
||||
.no-messages-label {
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.notification {
|
||||
@ -1773,26 +1828,6 @@ 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;
|
||||
@ -2057,15 +2092,16 @@ StScrollBar StButton#vhandle:active {
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
/* Restart message */
|
||||
.restart-message {
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
/* ShellMountOperation Dialogs */
|
||||
.shell-mount-operation-icon {
|
||||
icon-size: 48px;
|
||||
}
|
||||
|
||||
.mount-password-reask {
|
||||
color: red;
|
||||
}
|
||||
|
||||
.show-processes-dialog,
|
||||
.mount-question-dialog {
|
||||
spacing: 24px;
|
||||
@ -2361,13 +2397,6 @@ 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;
|
||||
@ -2416,10 +2445,6 @@ 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;
|
||||
|
@ -1,90 +0,0 @@
|
||||
<?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>
|
Before Width: | Height: | Size: 2.5 KiB |
@ -66,6 +66,7 @@ IGNORE_HFILES= \
|
||||
gactionmuxer.h \
|
||||
gactionobservable.h \
|
||||
gactionobserver.h \
|
||||
shell-network-agent.h \
|
||||
shell-recorder-src.h
|
||||
|
||||
if !BUILD_RECORDER
|
||||
|
@ -50,7 +50,6 @@
|
||||
<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>
|
||||
|
@ -13,7 +13,7 @@ misc/config.js: misc/config.js.in Makefile
|
||||
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
||||
$< > $@
|
||||
|
||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
||||
js-resources.h: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||
$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --sourcedir=$(builddir) --generate --c-name shell_js_resources $<
|
||||
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||
|
@ -23,6 +23,11 @@ const GnomeShellIface = '<node> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const customCss = '.prefs-button { \
|
||||
padding: 8px; \
|
||||
border-radius: 20px; \
|
||||
}';
|
||||
|
||||
const GnomeShellProxy = Gio.DBusProxy.makeProxyWrapper(GnomeShellIface);
|
||||
|
||||
function stripPrefix(string, prefix) {
|
||||
@ -46,22 +51,20 @@ const Application = new Lang.Class({
|
||||
|
||||
this._extensionPrefsModules = {};
|
||||
|
||||
this._extensionIters = {};
|
||||
this._startupUuid = null;
|
||||
},
|
||||
|
||||
_buildModel: function() {
|
||||
this._model = new Gtk.ListStore();
|
||||
this._model.set_column_types([GObject.TYPE_STRING, GObject.TYPE_STRING]);
|
||||
this._loaded = false;
|
||||
this._skipMainWindow = false;
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||
},
|
||||
|
||||
_extensionAvailable: function(uuid) {
|
||||
let extension = ExtensionUtils.extensions[uuid];
|
||||
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||
|
||||
if (!extension)
|
||||
return false;
|
||||
|
||||
if (ExtensionUtils.isOutOfDate(extension))
|
||||
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
|
||||
return false;
|
||||
|
||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
||||
@ -70,11 +73,6 @@ 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;
|
||||
|
||||
@ -104,21 +102,23 @@ const Application = new Lang.Class({
|
||||
widget = this._buildErrorUI(extension, e);
|
||||
}
|
||||
|
||||
// Destroy the current prefs widget, if it exists
|
||||
if (this._extensionPrefsBin.get_child())
|
||||
this._extensionPrefsBin.get_child().destroy();
|
||||
let dialog = new Gtk.Dialog({ use_header_bar: true,
|
||||
modal: true,
|
||||
title: extension.metadata.name });
|
||||
|
||||
this._extensionPrefsBin.add(widget);
|
||||
this._extensionSelector.set_active_iter(this._extensionIters[uuid]);
|
||||
},
|
||||
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;
|
||||
}
|
||||
|
||||
_extensionSelected: function() {
|
||||
let [success, iter] = this._extensionSelector.get_active_iter();
|
||||
if (!success)
|
||||
return;
|
||||
|
||||
let uuid = this._model.get_value(iter, 0);
|
||||
this._selectExtension(uuid);
|
||||
dialog.set_default_size(600, 400);
|
||||
dialog.get_content_area().add(widget);
|
||||
dialog.show();
|
||||
},
|
||||
|
||||
_buildErrorUI: function(extension, exc) {
|
||||
@ -151,48 +151,26 @@ const Application = new Lang.Class({
|
||||
|
||||
_buildUI: function(app) {
|
||||
this._window = new Gtk.ApplicationWindow({ application: app,
|
||||
window_position: Gtk.WindowPosition.CENTER,
|
||||
title: _("GNOME Shell Extension Preferences") });
|
||||
window_position: Gtk.WindowPosition.CENTER });
|
||||
|
||||
this._window.set_size_request(600, 400);
|
||||
this._window.set_size_request(800, 500);
|
||||
|
||||
let vbox = new Gtk.Box({ orientation: Gtk.Orientation.VERTICAL });
|
||||
this._window.add(vbox);
|
||||
this._titlebar = new Gtk.HeaderBar({ show_close_button: true,
|
||||
title: _("GNOME Shell Extensions") });
|
||||
this._window.set_titlebar(this._titlebar);
|
||||
|
||||
let toolbar = new Gtk.Toolbar();
|
||||
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_PRIMARY_TOOLBAR);
|
||||
vbox.add(toolbar);
|
||||
let toolitem;
|
||||
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 label = new Gtk.Label({ label: '<b>' + _("Extension") + '</b>',
|
||||
use_markup: true });
|
||||
toolitem = new Gtk.ToolItem({ child: label });
|
||||
toolbar.add(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));
|
||||
|
||||
this._extensionSelector = new Gtk.ComboBox({ model: this._model,
|
||||
margin_left: 8,
|
||||
hexpand: true });
|
||||
this._extensionSelector.get_style_context().add_class(Gtk.STYLE_CLASS_RAISED);
|
||||
scroll.add(this._extensionSelector);
|
||||
|
||||
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]) {
|
||||
@ -203,6 +181,35 @@ 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));
|
||||
@ -211,15 +218,24 @@ const Application = new Lang.Class({
|
||||
},
|
||||
|
||||
_extensionFound: function(finder, extension) {
|
||||
let iter = this._model.append();
|
||||
this._model.set(iter, [0, 1], [extension.uuid, extension.metadata.name]);
|
||||
this._extensionIters[extension.uuid] = iter;
|
||||
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);
|
||||
},
|
||||
|
||||
_extensionsLoaded: function() {
|
||||
if (this._startupUuid && this._extensionAvailable(this._startupUuid))
|
||||
this._selectExtension(this._startupUuid);
|
||||
this._startupUuid = null;
|
||||
this._skipMainWindow = false;
|
||||
this._loaded = true;
|
||||
},
|
||||
|
||||
_onActivate: function() {
|
||||
@ -227,29 +243,125 @@ 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
|
||||
else if (!this._loaded)
|
||||
this._startupUuid = uuid;
|
||||
else
|
||||
this._skipMainWindow = false;
|
||||
}
|
||||
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.
|
||||
|
@ -48,8 +48,6 @@ 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',
|
||||
|
||||
@ -384,7 +382,7 @@ const LoginDialog = new Lang.Class({
|
||||
Lang.bind(this, this._onTimedLoginRequested));
|
||||
}
|
||||
|
||||
this._settings = new Gio.Settings({ schema: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: GdmUtil.LOGIN_SCREEN_SCHEMA });
|
||||
|
||||
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||
Lang.bind(this, this._updateBanner));
|
||||
@ -483,7 +481,7 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
|
||||
_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) {
|
||||
@ -492,8 +490,10 @@ const LoginDialog = new Lang.Class({
|
||||
this._userManagerLoadedId = 0;
|
||||
}
|
||||
}));
|
||||
else
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList));
|
||||
} else {
|
||||
let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, this._loadUserList));
|
||||
GLib.Source.set_name_by_id(id, '[gnome-shell] _loadUserList');
|
||||
}
|
||||
},
|
||||
|
||||
_updateDisableUserList: function() {
|
||||
@ -686,10 +686,11 @@ const LoginDialog = new Lang.Class({
|
||||
},
|
||||
onUpdateScope: this,
|
||||
onComplete: function() {
|
||||
Mainloop.idle_add(Lang.bind(this, function() {
|
||||
let id = 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 });
|
||||
},
|
||||
@ -745,6 +746,7 @@ 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;
|
||||
},
|
||||
|
||||
|
@ -128,7 +128,7 @@ const ShellUserVerifier = new Lang.Class({
|
||||
|
||||
this._client = client;
|
||||
|
||||
this._settings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||
this._settings.connect('changed',
|
||||
Lang.bind(this, this._updateDefaultService));
|
||||
this._updateDefaultService();
|
||||
@ -252,6 +252,7 @@ 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) {
|
||||
|
@ -25,6 +25,9 @@
|
||||
<file>misc/util.js</file>
|
||||
|
||||
<file>perf/core.js</file>
|
||||
<file>perf/hwtest.js</file>
|
||||
|
||||
<file>portalHelper/main.js</file>
|
||||
|
||||
<file>ui/altTab.js</file>
|
||||
<file>ui/animation.js</file>
|
||||
@ -84,6 +87,7 @@
|
||||
<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>
|
||||
|
@ -46,32 +46,6 @@ const SystemdLoginSessionIface = '<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;
|
||||
}
|
||||
@ -101,7 +75,7 @@ function canLock() {
|
||||
-1, null);
|
||||
|
||||
let version = result.deep_unpack()[0].deep_unpack();
|
||||
return versionCompare('3.5.91', version);
|
||||
return haveSystemd() && versionCompare('3.5.91', version);
|
||||
} catch(e) {
|
||||
return false;
|
||||
}
|
||||
@ -119,7 +93,7 @@ function getLoginManager() {
|
||||
if (haveSystemd())
|
||||
_loginManager = new LoginManagerSystemd();
|
||||
else
|
||||
_loginManager = new LoginManagerConsoleKit();
|
||||
_loginManager = new LoginManagerDummy();
|
||||
}
|
||||
|
||||
return _loginManager;
|
||||
@ -136,9 +110,6 @@ 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);
|
||||
@ -191,7 +162,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(outVariant.deep_unpack())[0];
|
||||
fd = fdList.steal_fds()[0];
|
||||
callback(new Gio.UnixInputStream({ fd: fd }));
|
||||
} catch(e) {
|
||||
logError(e, "Error getting systemd inhibitor");
|
||||
@ -206,35 +177,13 @@ const LoginManagerSystemd = new Lang.Class({
|
||||
});
|
||||
Signals.addSignalMethods(LoginManagerSystemd.prototype);
|
||||
|
||||
const LoginManagerConsoleKit = new Lang.Class({
|
||||
Name: 'LoginManagerConsoleKit',
|
||||
const LoginManagerDummy = new Lang.Class({
|
||||
Name: 'LoginManagerDummy',
|
||||
|
||||
_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) {
|
||||
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);
|
||||
}
|
||||
}));
|
||||
// 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
|
||||
},
|
||||
|
||||
canSuspend: function(asyncCallback) {
|
||||
@ -254,4 +203,4 @@ const LoginManagerConsoleKit = new Lang.Class({
|
||||
callback(null);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(LoginManagerConsoleKit.prototype);
|
||||
Signals.addSignalMethods(LoginManagerDummy.prototype);
|
||||
|
@ -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 () {}, null);
|
||||
GLib.child_watch_add(GLib.PRIORITY_DEFAULT, pid, function () {});
|
||||
}
|
||||
|
||||
// trySpawnCommandLine:
|
||||
|
@ -72,6 +72,9 @@ function run() {
|
||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||
|
||||
// Enable recording of timestamps for different points in the frame cycle
|
||||
global.frame_timestamps = true;
|
||||
|
||||
Main.overview.connect('shown', function() {
|
||||
Scripting.scriptEvent('overviewShowDone');
|
||||
});
|
||||
@ -87,7 +90,10 @@ function run() {
|
||||
yield Scripting.destroyTestWindows();
|
||||
|
||||
for (let k = 0; k < config.count; k++)
|
||||
yield Scripting.createTestWindow(config.width, config.height, config.alpha, config.maximized);
|
||||
yield Scripting.createTestWindow({ width: config.width,
|
||||
height: config.height,
|
||||
alpha: config.alpha,
|
||||
maximized: config.maximized });
|
||||
|
||||
yield Scripting.waitTestWindows();
|
||||
yield Scripting.sleep(1000);
|
||||
|
308
js/perf/hwtest.js
Normal file
308
js/perf/hwtest.js
Normal file
@ -0,0 +1,308 @@
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Main = imports.ui.main;
|
||||
const Scripting = imports.ui.scripting;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
let METRICS = {
|
||||
timeToDesktop:
|
||||
{ description: "Time from starting graphical.target to desktop showing",
|
||||
units: "us" },
|
||||
|
||||
overviewShowTime:
|
||||
{ description: "Time to switch to overview view, first time",
|
||||
units: "us" },
|
||||
|
||||
applicationsShowTime:
|
||||
{ description: "Time to switch to applications view, first time",
|
||||
units: "us" },
|
||||
|
||||
mainViewRedrawTime:
|
||||
{ description: "Time to redraw the main view, full screen",
|
||||
units: "us" },
|
||||
|
||||
overviewRedrawTime:
|
||||
{ description: "Time to redraw the overview, full screen, 5 windows",
|
||||
units: "us" },
|
||||
|
||||
applicationRedrawTime:
|
||||
{ description: "Time to redraw frame with a maximized application update",
|
||||
units: "us" },
|
||||
|
||||
geditStartTime:
|
||||
{ description: "Time from gedit launch to window drawn",
|
||||
units: "us" },
|
||||
}
|
||||
|
||||
function waitAndDraw(milliseconds) {
|
||||
let cb;
|
||||
|
||||
let timeline = new Clutter.Timeline({ duration: milliseconds });
|
||||
timeline.start();
|
||||
|
||||
timeline.connect('new-frame',
|
||||
function(timeline, frame) {
|
||||
global.stage.queue_redraw();
|
||||
});
|
||||
|
||||
timeline.connect('completed',
|
||||
function() {
|
||||
timeline.stop();
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
}
|
||||
|
||||
function waitSignal(object, signal) {
|
||||
let cb;
|
||||
|
||||
let id = object.connect(signal, function() {
|
||||
object.disconnect(id);
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
}
|
||||
|
||||
function extractBootTimestamp() {
|
||||
let sp = Gio.Subprocess.new(['journalctl', '-b',
|
||||
'MESSAGE_ID=7d4958e842da4a758f6c1cdc7b36dcc5',
|
||||
'UNIT=graphical.target',
|
||||
'-o',
|
||||
'json'],
|
||||
Gio.SubprocessFlags.STDOUT_PIPE);
|
||||
let result = null;
|
||||
|
||||
let datastream = Gio.DataInputStream.new(sp.get_stdout_pipe());
|
||||
while (true) {
|
||||
let [line, length] = datastream.read_line_utf8(null);
|
||||
if (line === null)
|
||||
break;
|
||||
|
||||
let fields = JSON.parse(line);
|
||||
result = Number(fields['__MONOTONIC_TIMESTAMP']);
|
||||
}
|
||||
datastream.close(null);
|
||||
return result;
|
||||
}
|
||||
|
||||
function run() {
|
||||
Scripting.defineScriptEvent("desktopShown", "Finished initial animation");
|
||||
Scripting.defineScriptEvent("overviewShowStart", "Starting to show the overview");
|
||||
Scripting.defineScriptEvent("overviewShowDone", "Overview finished showing");
|
||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching to applications view");
|
||||
Scripting.defineScriptEvent("mainViewDrawStart", "Drawing main view");
|
||||
Scripting.defineScriptEvent("mainViewDrawDone", "Ending timing main view drawing");
|
||||
Scripting.defineScriptEvent("overviewDrawStart", "Drawing overview");
|
||||
Scripting.defineScriptEvent("overviewDrawDone", "Ending timing overview drawing");
|
||||
Scripting.defineScriptEvent("redrawTestStart", "Drawing application window");
|
||||
Scripting.defineScriptEvent("redrawTestDone", "Ending timing application window drawing");
|
||||
Scripting.defineScriptEvent("collectTimings", "Accumulate frame timings from redraw tests");
|
||||
Scripting.defineScriptEvent("geditLaunch", "gedit application launch");
|
||||
Scripting.defineScriptEvent("geditFirstFrame", "first frame of gedit window drawn");
|
||||
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('desktopShown');
|
||||
|
||||
Gtk.Settings.get_default().gtk_enable_animations = false;
|
||||
|
||||
Scripting.scriptEvent('overviewShowStart');
|
||||
Main.overview.show();
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('overviewShowDone');
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Scripting.scriptEvent('applicationsShowStart');
|
||||
Main.overview._dash.showAppsButton.checked = true;
|
||||
|
||||
yield Scripting.waitLeisure();
|
||||
Scripting.scriptEvent('applicationsShowDone');
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Main.overview.hide();
|
||||
yield Scripting.waitLeisure();
|
||||
|
||||
////////////////////////////////////////
|
||||
// Tests of redraw speed
|
||||
////////////////////////////////////////
|
||||
|
||||
global.frame_timestamps = true;
|
||||
global.frame_finish_timestamp = true;
|
||||
|
||||
for (let k = 0; k < 5; k++)
|
||||
yield Scripting.createTestWindow(640, 480,
|
||||
{ maximized: true });
|
||||
yield Scripting.waitTestWindows();
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Scripting.scriptEvent('mainViewDrawStart');
|
||||
yield waitAndDraw(1000);
|
||||
Scripting.scriptEvent('mainViewDrawDone');
|
||||
|
||||
Main.overview.show();
|
||||
Scripting.waitLeisure();
|
||||
|
||||
yield Scripting.sleep(1500);
|
||||
|
||||
Scripting.scriptEvent('overviewDrawStart');
|
||||
yield waitAndDraw(1000);
|
||||
Scripting.scriptEvent('overviewDrawDone');
|
||||
|
||||
yield Scripting.destroyTestWindows();
|
||||
Main.overview.hide();
|
||||
|
||||
yield Scripting.createTestWindow(640, 480,
|
||||
{ maximized: true,
|
||||
redraws: true});
|
||||
yield Scripting.waitTestWindows();
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Scripting.scriptEvent('redrawTestStart');
|
||||
yield Scripting.sleep(1000);
|
||||
Scripting.scriptEvent('redrawTestDone');
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
Scripting.scriptEvent('collectTimings');
|
||||
|
||||
yield Scripting.destroyTestWindows();
|
||||
|
||||
global.frame_timestamps = false;
|
||||
global.frame_finish_timestamp = false;
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
////////////////////////////////////////
|
||||
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let app = appSys.lookup_app('gedit.desktop');
|
||||
|
||||
Scripting.scriptEvent('geditLaunch');
|
||||
app.activate();
|
||||
|
||||
let windows = app.get_windows();
|
||||
if (windows.length > 0)
|
||||
throw new Error('gedit was already running');
|
||||
|
||||
while (windows.length == 0) {
|
||||
yield waitSignal(global.display, 'window-created');
|
||||
windows = app.get_windows();
|
||||
}
|
||||
|
||||
let actor = windows[0].get_compositor_private();
|
||||
yield waitSignal(actor, 'first-frame');
|
||||
Scripting.scriptEvent('geditFirstFrame');
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
windows[0].delete(global.get_current_time());
|
||||
|
||||
yield Scripting.sleep(1000);
|
||||
|
||||
Gtk.Settings.get_default().gtk_enable_animations = true;
|
||||
}
|
||||
|
||||
let overviewShowStart;
|
||||
let applicationsShowStart;
|
||||
let stagePaintStart;
|
||||
let redrawTiming;
|
||||
let redrawTimes = {};
|
||||
let geditLaunchTime;
|
||||
|
||||
function script_desktopShown(time) {
|
||||
let bootTimestamp = extractBootTimestamp();
|
||||
METRICS.timeToDesktop.value = time - bootTimestamp;
|
||||
}
|
||||
|
||||
function script_overviewShowStart(time) {
|
||||
overviewShowStart = time;
|
||||
}
|
||||
|
||||
function script_overviewShowDone(time) {
|
||||
METRICS.overviewShowTime.value = time - overviewShowStart;
|
||||
}
|
||||
|
||||
function script_applicationsShowStart(time) {
|
||||
applicationsShowStart = time;
|
||||
}
|
||||
|
||||
function script_applicationsShowDone(time) {
|
||||
METRICS.applicationsShowTime.value = time - applicationsShowStart;
|
||||
}
|
||||
|
||||
function script_mainViewDrawStart(time) {
|
||||
redrawTiming = 'mainView';
|
||||
}
|
||||
|
||||
function script_mainViewDrawDone(time) {
|
||||
redrawTiming = null;
|
||||
}
|
||||
|
||||
function script_overviewDrawStart(time) {
|
||||
redrawTiming = 'overview';
|
||||
}
|
||||
|
||||
function script_overviewDrawDone(time) {
|
||||
redrawTiming = null;
|
||||
}
|
||||
|
||||
function script_redrawTestStart(time) {
|
||||
redrawTiming = 'application';
|
||||
}
|
||||
|
||||
function script_redrawTestDone(time) {
|
||||
redrawTiming = null;
|
||||
}
|
||||
|
||||
function script_collectTimings(time) {
|
||||
for (let timing in redrawTimes) {
|
||||
let times = redrawTimes[timing];
|
||||
times.sort();
|
||||
|
||||
let len = times.length;
|
||||
let median;
|
||||
|
||||
if (len == 0)
|
||||
median = -1;
|
||||
else if (len % 2 == 1)
|
||||
median = times[(len - 1)/ 2];
|
||||
else
|
||||
median = Math.round((times[len / 2 - 1] + times[len / 2]) / 2);
|
||||
|
||||
METRICS[timing + 'RedrawTime'].value = median;
|
||||
}
|
||||
}
|
||||
|
||||
function script_geditLaunch(time) {
|
||||
geditLaunchTime = time;
|
||||
}
|
||||
|
||||
function script_geditFirstFrame(time) {
|
||||
METRICS.geditStartTime.value = time - geditLaunchTime;
|
||||
}
|
||||
|
||||
function clutter_stagePaintStart(time) {
|
||||
stagePaintStart = time;
|
||||
}
|
||||
|
||||
function clutter_paintCompletedTimestamp(time) {
|
||||
if (redrawTiming != null && stagePaintStart != null) {
|
||||
if (!(redrawTiming in redrawTimes))
|
||||
redrawTimes[redrawTiming] = [];
|
||||
redrawTimes[redrawTiming].push(time - stagePaintStart);
|
||||
}
|
||||
stagePaintStart = null;
|
||||
}
|
248
js/portalHelper/main.js
Normal file
248
js/portalHelper/main.js
Normal file
@ -0,0 +1,248 @@
|
||||
const Format = imports.format;
|
||||
const Gettext = imports.gettext;
|
||||
const GLib = imports.gi.GLib;
|
||||
const GObject = imports.gi.GObject;
|
||||
const Gio = imports.gi.Gio;
|
||||
const Gtk = imports.gi.Gtk;
|
||||
const Lang = imports.lang;
|
||||
const Pango = imports.gi.Pango;
|
||||
const Soup = imports.gi.Soup;
|
||||
const WebKit = imports.gi.WebKit2;
|
||||
|
||||
const _ = Gettext.gettext;
|
||||
|
||||
const Config = imports.misc.config;
|
||||
|
||||
const PortalHelperResult = {
|
||||
CANCELLED: 0,
|
||||
COMPLETED: 1,
|
||||
RECHECK: 2
|
||||
};
|
||||
|
||||
const INACTIVITY_TIMEOUT = 30000; //ms
|
||||
const CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT = 30 * GLib.USEC_PER_SEC;
|
||||
|
||||
const HelperDBusInterface = '<node> \
|
||||
<interface name="org.gnome.Shell.PortalHelper"> \
|
||||
<method name="Authenticate"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
<arg type="s" direction="in" name="url" /> \
|
||||
<arg type="u" direction="in" name="timestamp" /> \
|
||||
</method> \
|
||||
<method name="Close"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
</method> \
|
||||
<method name="Refresh"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
</method> \
|
||||
<signal name="Done"> \
|
||||
<arg type="o" name="connection" /> \
|
||||
<arg type="u" name="result" /> \
|
||||
</signal> \
|
||||
</interface> \
|
||||
</node>';
|
||||
|
||||
const PortalWindow = new Lang.Class({
|
||||
Name: 'PortalWindow',
|
||||
Extends: Gtk.ApplicationWindow,
|
||||
|
||||
_init: function(application, url, timestamp, doneCallback) {
|
||||
this.parent({ application: application });
|
||||
|
||||
if (url) {
|
||||
this._uri = new Soup.URI(uri);
|
||||
} else {
|
||||
url = 'http://www.gnome.org';
|
||||
this._uri = null;
|
||||
this._everSeenRedirect = false;
|
||||
}
|
||||
this._originalUrl = url;
|
||||
this._doneCallback = doneCallback;
|
||||
this._lastRecheck = 0;
|
||||
this._recheckAtExit = false;
|
||||
|
||||
this._webView = new WebKit.WebView();
|
||||
this._webView.connect('decide-policy', Lang.bind(this, this._onDecidePolicy));
|
||||
this._webView.load_uri(url);
|
||||
this._webView.connect('notify::title', Lang.bind(this, this._syncTitle));
|
||||
this._syncTitle();
|
||||
|
||||
this.add(this._webView);
|
||||
this._webView.show();
|
||||
this.maximize();
|
||||
this.present_with_time(timestamp);
|
||||
},
|
||||
|
||||
_syncTitle: function() {
|
||||
let title = this._webView.title;
|
||||
|
||||
if (title) {
|
||||
this.title = title;
|
||||
} else {
|
||||
// TRANSLATORS: this is the title of the wifi captive portal login
|
||||
// window, until we know the title of the actual login page
|
||||
this.title = _("Web Authentication Redirect");
|
||||
}
|
||||
},
|
||||
|
||||
refresh: function() {
|
||||
this._everSeenRedirect = false;
|
||||
this._webView.load_uri(this._originalUrl);
|
||||
},
|
||||
|
||||
vfunc_delete_event: function(event) {
|
||||
if (this._recheckAtExit)
|
||||
this._doneCallback(PortalHelperResult.RECHECK);
|
||||
else
|
||||
this._doneCallback(PortalHelperResult.CANCELLED);
|
||||
return false;
|
||||
},
|
||||
|
||||
_onDecidePolicy: function(view, decision, type) {
|
||||
if (type == WebKit.PolicyDecisionType.NEW_WINDOW_ACTION) {
|
||||
decision.ignore();
|
||||
return true;
|
||||
}
|
||||
|
||||
if (type != WebKit.PolicyDecisionType.NAVIGATION_ACTION)
|
||||
return false;
|
||||
|
||||
let request = decision.get_request();
|
||||
let uri = new Soup.URI(request.get_uri());
|
||||
|
||||
if (this._uri != null) {
|
||||
if (!uri.host_equal(uri, this._uri)) {
|
||||
// We *may* have finished here, but we don't know for
|
||||
// sure. Tell gnome-shell to run another connectivity check
|
||||
// (but ratelimit the checks, we don't want to spam
|
||||
// gnome.org for portals that have 10 or more internal
|
||||
// redirects - and unfortunately they exist)
|
||||
// If we hit the rate limit, we also queue a recheck
|
||||
// when the window is closed, just in case we miss the
|
||||
// final check and don't realize we're connected
|
||||
// This should not be a problem in the cancelled logic,
|
||||
// because if the user doesn't want to start the login,
|
||||
// we should not see any redirect at all, outside this._uri
|
||||
|
||||
let now = GLib.get_monotonic_time();
|
||||
let shouldRecheck = (now - this._lastRecheck) >
|
||||
CONNECTIVITY_RECHECK_RATELIMIT_TIMEOUT;
|
||||
|
||||
if (shouldRecheck) {
|
||||
this._lastRecheck = now;
|
||||
this._recheckAtExit = false;
|
||||
this._doneCallback(PortalHelperResult.RECHECK);
|
||||
} else {
|
||||
this._recheckAtExit = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Update the URI, in case of chained redirects, so we still
|
||||
// think we're doing the login until gnome-shell kills us
|
||||
this._uri = uri;
|
||||
} else {
|
||||
if (uri.get_host() == 'www.gnome.org' && this._everSeenRedirect) {
|
||||
// Yay, we got to gnome!
|
||||
decision.ignore();
|
||||
this._doneCallback(PortalHelperResult.COMPLETED);
|
||||
return true;
|
||||
} else if (uri.get_host() != 'www.gnome.org') {
|
||||
this._everSeenRedirect = true;
|
||||
}
|
||||
}
|
||||
|
||||
decision.use();
|
||||
return true;
|
||||
},
|
||||
});
|
||||
|
||||
const WebPortalHelper = new Lang.Class({
|
||||
Name: 'WebPortalHelper',
|
||||
Extends: Gtk.Application,
|
||||
|
||||
_init: function() {
|
||||
this.parent({ application_id: 'org.gnome.Shell.PortalHelper',
|
||||
flags: Gio.ApplicationFlags.IS_SERVICE,
|
||||
inactivity_timeout: 30000 });
|
||||
|
||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(HelperDBusInterface, this);
|
||||
this._queue = [];
|
||||
},
|
||||
|
||||
vfunc_dbus_register: function(connection, path) {
|
||||
this._dbusImpl.export(connection, path);
|
||||
this.parent(connection, path);
|
||||
return true;
|
||||
},
|
||||
|
||||
vfunc_dbus_unregister: function(connection, path) {
|
||||
this._dbusImpl.unexport_from_connection(connection);
|
||||
this.parent(connection, path);
|
||||
},
|
||||
|
||||
vfunc_activate: function() {
|
||||
// If launched manually (for example for testing), force a dummy authentication
|
||||
// session with the default url
|
||||
this.Authenticate('/org/gnome/dummy', '', 0);
|
||||
},
|
||||
|
||||
Authenticate: function(connection, url, timestamp) {
|
||||
this._queue.push({ connection: connection, url: url, timestamp: timestamp });
|
||||
|
||||
this._processQueue();
|
||||
},
|
||||
|
||||
Close: function(connection) {
|
||||
for (let i = 0; i < this._queue.length; i++) {
|
||||
let obj = this._queue[i];
|
||||
|
||||
if (obj.connection == connection) {
|
||||
if (obj.window)
|
||||
obj.window.destroy();
|
||||
this._queue.splice(i, 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this._processQueue();
|
||||
},
|
||||
|
||||
Refresh: function(connection) {
|
||||
for (let i = 0; i < this._queue.length; i++) {
|
||||
let obj = this._queue[i];
|
||||
|
||||
if (obj.connection == connection) {
|
||||
if (obj.window)
|
||||
obj.window.refresh();
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
_processQueue: function() {
|
||||
if (this._queue.length == 0)
|
||||
return;
|
||||
|
||||
let top = this._queue[0];
|
||||
if (top.window != null)
|
||||
return;
|
||||
|
||||
top.window = new PortalWindow(this, top.uri, top.timestamp, Lang.bind(this, function(result) {
|
||||
this._dbusImpl.emit_signal('Done', new GLib.Variant('(ou)', [top.connection, result]));
|
||||
}));
|
||||
},
|
||||
});
|
||||
|
||||
function initEnvironment() {
|
||||
String.prototype.format = Format.format;
|
||||
}
|
||||
|
||||
function main(argv) {
|
||||
initEnvironment();
|
||||
|
||||
Gettext.bindtextdomain(Config.GETTEXT_PACKAGE, Config.LOCALEDIR);
|
||||
Gettext.textdomain(Config.GETTEXT_PACKAGE);
|
||||
|
||||
let app = new WebPortalHelper();
|
||||
return app.run(argv);
|
||||
}
|
@ -167,6 +167,8 @@ 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());
|
||||
@ -174,7 +176,11 @@ 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) {
|
||||
@ -305,6 +311,7 @@ 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');
|
||||
}
|
||||
},
|
||||
|
||||
@ -360,12 +367,12 @@ const WindowSwitcherPopup = new Lang.Class({
|
||||
|
||||
_init: function(items) {
|
||||
this.parent(items);
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.window-switcher' });
|
||||
this._settings = new Gio.Settings({ schema_id: '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, global.screen, workspace);
|
||||
return global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||
},
|
||||
|
||||
_createSwitcher: function() {
|
||||
@ -403,7 +410,11 @@ 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() {
|
||||
@ -445,11 +456,10 @@ const AppSwitcher = new Lang.Class({
|
||||
this._arrows = [];
|
||||
|
||||
let windowTracker = Shell.WindowTracker.get_default();
|
||||
let settings = new Gio.Settings({ schema: 'org.gnome.shell.app-switcher' });
|
||||
let settings = new Gio.Settings({ schema_id: '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,
|
||||
global.screen, workspace);
|
||||
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||
|
||||
// Construct the AppIcons, add to the popup
|
||||
for (let i = 0; i < apps.length; i++) {
|
||||
@ -556,6 +566,7 @@ 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);
|
||||
},
|
||||
|
@ -34,6 +34,7 @@ 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;
|
||||
|
@ -16,6 +16,7 @@ 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;
|
||||
@ -41,9 +42,7 @@ 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;
|
||||
@ -81,6 +80,10 @@ 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,
|
||||
@ -368,7 +371,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: 'org.gnome.desktop.app-folders' });
|
||||
this._folderSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.app-folders' });
|
||||
this._folderSettings.connect('changed::folder-children', Lang.bind(this, function() {
|
||||
Main.queueDeferredWork(this._redisplayWorkId);
|
||||
}));
|
||||
@ -439,8 +442,8 @@ const AllView = new Lang.Class({
|
||||
},
|
||||
|
||||
goToPage: function(pageNumber) {
|
||||
if(pageNumber < 0 || pageNumber > this._grid.nPages() - 1)
|
||||
return;
|
||||
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
|
||||
|
||||
if (this._currentPage == pageNumber && this._displayingPopup && this._currentPopup)
|
||||
return;
|
||||
if (this._displayingPopup && this._currentPopup)
|
||||
@ -472,14 +475,12 @@ const AllView = new Lang.Class({
|
||||
// longer than PAGE_SWITCH_TIME
|
||||
time = Math.min(time, PAGE_SWITCH_TIME);
|
||||
|
||||
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);
|
||||
}
|
||||
this._currentPage = pageNumber;
|
||||
Tweener.addTween(this._adjustment,
|
||||
{ value: this._grid.getPageY(this._currentPage),
|
||||
time: time,
|
||||
transition: 'easeOutQuad' });
|
||||
this._pageIndicators.setCurrentPage(pageNumber);
|
||||
},
|
||||
|
||||
_diffToPage: function (pageNumber) {
|
||||
@ -526,15 +527,19 @@ const AllView = new Lang.Class({
|
||||
_onPanEnd: function(action) {
|
||||
if (this._displayingPopup)
|
||||
return;
|
||||
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);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
this._panning = false;
|
||||
},
|
||||
|
||||
@ -736,7 +741,7 @@ const AppDisplay = new Lang.Class({
|
||||
Name: 'AppDisplay',
|
||||
|
||||
_init: function() {
|
||||
this._privacySettings = new Gio.Settings({ schema: 'org.gnome.desktop.privacy' });
|
||||
this._privacySettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.privacy' });
|
||||
this._privacySettings.connect('changed::remember-app-usage',
|
||||
Lang.bind(this, this._updateFrequentVisibility));
|
||||
|
||||
@ -764,7 +769,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, { expand: true });
|
||||
this.actor.add_actor(this._viewStack);
|
||||
let layout = new ControlsBoxLayout({ homogeneous: true });
|
||||
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
||||
layout_manager: layout });
|
||||
@ -948,6 +953,7 @@ const FolderView = new Lang.Class({
|
||||
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) {
|
||||
@ -956,7 +962,7 @@ const FolderView = new Lang.Class({
|
||||
} else {
|
||||
bin = new St.Bin({ width: subSize, height: subSize });
|
||||
}
|
||||
layout.pack(bin, i % 2, Math.floor(i / 2));
|
||||
layout.pack(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2));
|
||||
}
|
||||
|
||||
return icon;
|
||||
@ -1245,18 +1251,53 @@ 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)
|
||||
if (global.stage.get_key_focus() != actor)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
|
||||
if (event.get_key_symbol() != Clutter.KEY_Escape)
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
// Since we need to only grab focus on one item child when the user
|
||||
// actually press a key we don't use navigate_focus when opening
|
||||
// the popup.
|
||||
// Instead of that, grab the focus on the AppFolderPopup actor
|
||||
// and actually moves the focus to a child only when the user
|
||||
// actually press a key.
|
||||
// It should work with just grab_key_focus on the AppFolderPopup
|
||||
// actor, but since the arrow keys are not wrapping_around the focus
|
||||
// is not grabbed by a child when the widget that has the current focus
|
||||
// is the same that is requesting focus, so to make it works with arrow
|
||||
// keys we need to connect to the key-press-event and navigate_focus
|
||||
// when that happens using TAB_FORWARD or TAB_BACKWARD instead of arrow
|
||||
// keys
|
||||
|
||||
this.popdown();
|
||||
return Clutter.EVENT_STOP;
|
||||
// Use TAB_FORWARD for down key and right key
|
||||
// and TAB_BACKWARD for up key and left key on ltr
|
||||
// languages
|
||||
let direction;
|
||||
let isLtr = Clutter.get_default_text_direction() == Clutter.TextDirection.LTR;
|
||||
switch (event.get_key_symbol()) {
|
||||
case Clutter.Down:
|
||||
direction = Gtk.DirectionType.TAB_FORWARD;
|
||||
break;
|
||||
case Clutter.Right:
|
||||
direction = isLtr ? Gtk.DirectionType.TAB_FORWARD :
|
||||
Gtk.DirectionType.TAB_BACKWARD;
|
||||
break;
|
||||
case Clutter.Up:
|
||||
direction = Gtk.DirectionType.TAB_BACKWARD;
|
||||
break;
|
||||
case Clutter.Left:
|
||||
direction = isLtr ? Gtk.DirectionType.TAB_BACKWARD :
|
||||
Gtk.DirectionType.TAB_FORWARD;
|
||||
break;
|
||||
default:
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
}
|
||||
return actor.navigate_focus(null, direction, false);
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
@ -1270,15 +1311,18 @@ 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);
|
||||
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
||||
BoxPointer.PopupAnimation.SLIDE);
|
||||
|
||||
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
|
||||
this._isOpen = true;
|
||||
this.emit('open-state-changed', true);
|
||||
},
|
||||
|
||||
@ -1286,6 +1330,8 @@ 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;
|
||||
@ -1402,6 +1448,7 @@ 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;
|
||||
@ -1597,6 +1644,26 @@ 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();
|
||||
});
|
||||
}));
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -6,6 +6,26 @@ const Signals = imports.signals;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
|
||||
const RENAMED_DESKTOP_IDS = {
|
||||
'baobab.desktop': 'org.gnome.baobab.desktop',
|
||||
'cheese.desktop': 'org.gnome.Cheese.desktop',
|
||||
'dconf-editor.desktop': 'ca.desrt.dconf-editor.desktop',
|
||||
'file-roller.desktop': 'org.gnome.FileRoller.desktop',
|
||||
'gcalctool.desktop': 'gnome-calculator.desktop',
|
||||
'gedit.desktop': 'org.gnome.gedit.desktop',
|
||||
'glchess.desktop': 'gnome-chess.desktop',
|
||||
'gnome-clocks.desktop': 'org.gnome.clocks.desktop',
|
||||
'gnome-documents.desktop': 'org.gnome.Documents.desktop',
|
||||
'gnome-font-viewer.desktop': 'org.gnome.font-viewer.desktop',
|
||||
'gnome-photos.desktop': 'org.gnome.Photos.desktop',
|
||||
'gnome-screenshot.desktop': 'org.gnome.Screenshot.desktop',
|
||||
'gnome-software.desktop': 'org.gnome.Software.desktop',
|
||||
'gnome-weather.desktop': 'org.gnome.Weather.Application.desktop',
|
||||
'gnomine.desktop': 'gnome-mines.desktop',
|
||||
'nautilus.desktop': 'org.gnome.Nautilus.desktop',
|
||||
'polari.desktop': 'org.gnome.Polari.desktop',
|
||||
};
|
||||
|
||||
const AppFavorites = new Lang.Class({
|
||||
Name: 'AppFavorites',
|
||||
|
||||
@ -24,6 +44,21 @@ const AppFavorites = new Lang.Class({
|
||||
|
||||
reload: function() {
|
||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
||||
|
||||
// Map old desktop file names to the current ones
|
||||
let updated = false;
|
||||
ids = ids.map(function (id) {
|
||||
let newId = RENAMED_DESKTOP_IDS[id];
|
||||
if (newId !== undefined) {
|
||||
updated = true;
|
||||
return newId;
|
||||
}
|
||||
return id;
|
||||
});
|
||||
// ... and write back the updated desktop file names
|
||||
if (updated)
|
||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||
|
||||
let appSys = Shell.AppSystem.get_default();
|
||||
let apps = ids.map(function (id) {
|
||||
return appSys.lookup_app(id);
|
||||
|
@ -271,10 +271,11 @@ const BackgroundCache = new Lang.Class({
|
||||
|
||||
if (this._animationFilename == params.filename) {
|
||||
if (params.onLoaded) {
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||
let id = 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');
|
||||
}
|
||||
}
|
||||
|
||||
@ -286,10 +287,11 @@ const BackgroundCache = new Lang.Class({
|
||||
this._animation = animation;
|
||||
|
||||
if (params.onLoaded) {
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||
let id = 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');
|
||||
}
|
||||
}));
|
||||
}
|
||||
@ -386,10 +388,11 @@ const Background = new Lang.Class({
|
||||
|
||||
this.isLoaded = true;
|
||||
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this, function() {
|
||||
let id = 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() {
|
||||
@ -445,7 +448,7 @@ const Background = new Lang.Class({
|
||||
|
||||
let image = this._images[index];
|
||||
if (image.content)
|
||||
this._cache.removeImageContent(content);
|
||||
this._cache.removeImageContent(image.content);
|
||||
image.content = content;
|
||||
this._watchCacheFile(filename);
|
||||
},
|
||||
@ -532,6 +535,7 @@ 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) {
|
||||
@ -655,7 +659,10 @@ const SystemBackground = new Lang.Class({
|
||||
},
|
||||
|
||||
_onDestroy: function() {
|
||||
this._cache.removeImageContent(this.actor.content);
|
||||
let content = this.actor.content;
|
||||
|
||||
if (content)
|
||||
this._cache.removeImageContent(content);
|
||||
},
|
||||
});
|
||||
Signals.addSignalMethods(SystemBackground.prototype);
|
||||
@ -721,7 +728,7 @@ const BackgroundManager = new Lang.Class({
|
||||
controlPosition: true,
|
||||
settingsSchema: BACKGROUND_SCHEMA });
|
||||
|
||||
this._settings = new Gio.Settings({ schema: params.settingsSchema });
|
||||
this._settings = new Gio.Settings({ schema_id: params.settingsSchema });
|
||||
this._container = params.container;
|
||||
this._layoutManager = params.layoutManager;
|
||||
this._effects = params.effects;
|
||||
|
@ -35,7 +35,7 @@ function addBackgroundMenu(actor, layoutManager) {
|
||||
|
||||
function openMenu() {
|
||||
let [x, y] = global.get_pointer();
|
||||
Main.layoutManager.setDummyCursorPosition(x, y);
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
||||
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
|
||||
}
|
||||
|
||||
@ -55,9 +55,14 @@ function addBackgroundMenu(actor, layoutManager) {
|
||||
});
|
||||
actor.add_action(clickAction);
|
||||
|
||||
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
|
||||
clickAction.release();
|
||||
});
|
||||
|
||||
actor.connect('destroy', function() {
|
||||
actor._backgroundMenu.destroy();
|
||||
actor._backgroundMenu = null;
|
||||
actor._backgroundManager = null;
|
||||
global.display.disconnect(grabOpBeginId);
|
||||
});
|
||||
}
|
||||
|
@ -14,6 +14,9 @@ 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';
|
||||
|
||||
@ -380,14 +383,14 @@ const Calendar = new Lang.Class({
|
||||
|
||||
_init: function() {
|
||||
this._weekStart = Shell.util_get_week_start();
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.calendar' });
|
||||
this._settings = new Gio.Settings({ schema_id: '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 (Gettext_gtk30.gettext('calendar:MY')) {
|
||||
switch (gtk30_('calendar:MY')) {
|
||||
case 'calendar:MY':
|
||||
this._headerFormat = '%B %Y';
|
||||
break;
|
||||
@ -405,9 +408,9 @@ const Calendar = new Lang.Class({
|
||||
|
||||
this._shouldDateGrabFocus = false;
|
||||
|
||||
this.actor = new St.Table({ homogeneous: false,
|
||||
style_class: 'calendar',
|
||||
reactive: true });
|
||||
this.actor = new St.Widget({ style_class: 'calendar',
|
||||
layout_manager: new Clutter.TableLayout(),
|
||||
reactive: true });
|
||||
|
||||
this.actor.connect('scroll-event',
|
||||
Lang.bind(this, this._onScroll));
|
||||
@ -438,13 +441,14 @@ 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();
|
||||
this.actor.add(this._topBox,
|
||||
{ row: 0, col: 0, col_span: offsetCols + 7 });
|
||||
layout.pack(this._topBox, 0, 0);
|
||||
layout.set_span(this._topBox, offsetCols + 7, 1);
|
||||
|
||||
this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
|
||||
accessible_name: _("Previous month"),
|
||||
@ -476,10 +480,12 @@ 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 });
|
||||
this.actor.add(label,
|
||||
{ row: 1,
|
||||
col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7,
|
||||
x_fill: false, x_align: St.Align.MIDDLE });
|
||||
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);
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
}
|
||||
|
||||
@ -598,6 +604,7 @@ 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
|
||||
@ -645,16 +652,19 @@ const Calendar = new Lang.Class({
|
||||
button.style_class = styleClass;
|
||||
|
||||
let offsetCols = this._useWeekdate ? 1 : 0;
|
||||
this.actor.add(button,
|
||||
{ row: row, col: offsetCols + (7 + iter.getDay() - this._weekStart) % 7 });
|
||||
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._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'});
|
||||
this.actor.add(label,
|
||||
{ row: row, col: 0, y_align: St.Align.MIDDLE });
|
||||
layout.pack(label, rtl ? 7 : 0, row);
|
||||
}
|
||||
|
||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||
@ -697,9 +707,12 @@ const EventsList = new Lang.Class({
|
||||
Name: 'EventsList',
|
||||
|
||||
_init: function() {
|
||||
this.actor = new St.Table({ style_class: 'events-table' });
|
||||
let layout = new Clutter.TableLayout();
|
||||
this.actor = new St.Widget({ style_class: 'events-table',
|
||||
layout_manager: layout });
|
||||
layout.hookup_style(this.actor);
|
||||
this._date = new Date();
|
||||
this._desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
||||
this._desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
this._desktopSettings.connect('changed', Lang.bind(this, this._update));
|
||||
this._weekStart = Shell.util_get_week_start();
|
||||
},
|
||||
@ -721,9 +734,13 @@ const EventsList = new Lang.Class({
|
||||
dayLabel.clutter_text.line_wrap = false;
|
||||
dayLabel.clutter_text.ellipsize = false;
|
||||
|
||||
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 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 });
|
||||
|
||||
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
||||
let timeString = _formatEventTime(event, clockFormat);
|
||||
@ -732,18 +749,17 @@ const EventsList = new Lang.Class({
|
||||
timeLabel.clutter_text.line_wrap = false;
|
||||
timeLabel.clutter_text.ellipsize = false;
|
||||
|
||||
this.actor.add(timeLabel, { row: index, col: 1,
|
||||
x_expand: false, x_align: St.Align.MIDDLE,
|
||||
y_fill: false, y_align: St.Align.START });
|
||||
layout.pack(timeLabel, 1, index);
|
||||
layout.child_set(timeLabel, { x_expand: false,
|
||||
y_align: Clutter.TableAlignment.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;
|
||||
|
||||
this.actor.add(titleLabel, { row: index, col: 2,
|
||||
x_expand: true, x_align: St.Align.START,
|
||||
y_fill: false, y_align: St.Align.START });
|
||||
layout.pack(titleLabel, rtl ? 0 : 2, index);
|
||||
layout.child_set(titleLabel, { x_expand: true });
|
||||
},
|
||||
|
||||
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
|
||||
@ -752,13 +768,10 @@ const EventsList = new Lang.Class({
|
||||
if (events.length == 0 && !showNothingScheduled)
|
||||
return index;
|
||||
|
||||
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 });
|
||||
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 });
|
||||
index++;
|
||||
|
||||
for (let n = 0; n < events.length; n++) {
|
||||
|
@ -23,7 +23,7 @@ const AutomountManager = new Lang.Class({
|
||||
Name: 'AutomountManager',
|
||||
|
||||
_init: function() {
|
||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
||||
this._volumeQueue = [];
|
||||
this._session = new GnomeSession.SessionManager();
|
||||
this._session.connectSignal('InhibitorAdded',
|
||||
@ -43,6 +43,7 @@ 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() {
|
||||
@ -234,10 +235,11 @@ const AutomountManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_allowAutorunExpire: function(volume) {
|
||||
Mainloop.timeout_add_seconds(AUTORUN_EXPIRE_TIMEOUT_SECS, function() {
|
||||
let id = 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;
|
||||
|
@ -96,7 +96,7 @@ const ContentTypeDiscoverer = new Lang.Class({
|
||||
|
||||
_init: function(callback) {
|
||||
this._callback = callback;
|
||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: 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: SETTINGS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
||||
},
|
||||
|
||||
_getAutorunSettingForType: function(contentType) {
|
||||
|
@ -77,6 +77,7 @@ 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++) {
|
||||
@ -116,10 +117,15 @@ const NetworkSecretDialog = new Lang.Class({
|
||||
} else
|
||||
secret.valid = true;
|
||||
|
||||
layout.pack(label, 0, pos);
|
||||
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.child_set(label, { x_expand: false, y_fill: false,
|
||||
x_align: Clutter.TableAlignment.START });
|
||||
layout.pack(secret.entry, 1, pos);
|
||||
pos++;
|
||||
|
||||
if (secret.password)
|
||||
@ -510,10 +516,12 @@ const VPNRequestHandler = new Lang.Class({
|
||||
|
||||
_showNewStyleDialog: function() {
|
||||
let keyfile = new GLib.KeyFile();
|
||||
let data;
|
||||
let contentOverride;
|
||||
|
||||
try {
|
||||
let data = this._dataStdout.peek_buffer();
|
||||
data = this._dataStdout.peek_buffer();
|
||||
|
||||
keyfile.load_from_data(data.toString(), data.length,
|
||||
GLib.KeyFileFlags.NONE);
|
||||
|
||||
@ -546,13 +554,16 @@ const VPNRequestHandler = new Lang.Class({
|
||||
}
|
||||
}
|
||||
} catch(e) {
|
||||
logError(e, 'error while reading VPN plugin output keyfile');
|
||||
// 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');
|
||||
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||
return;
|
||||
this._agent.respond(this._requestId, Shell.NetworkAgentResponse.INTERNAL_ERROR);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (contentOverride.secrets.length) {
|
||||
if (contentOverride && 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());
|
||||
|
@ -681,6 +681,7 @@ 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() {
|
||||
@ -782,7 +783,6 @@ 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,14 +924,16 @@ 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();
|
||||
@ -944,80 +946,76 @@ const ChatNotification = new Lang.Class({
|
||||
|
||||
let format;
|
||||
|
||||
let desktopSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
||||
let desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
let clockFormat = desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
||||
let hasAmPm = date.toLocaleFormat('%p') != '';
|
||||
|
||||
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");
|
||||
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");
|
||||
|
||||
} 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 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 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;
|
||||
} 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");
|
||||
}
|
||||
}
|
||||
return date.toLocaleFormat(format);
|
||||
},
|
||||
@ -1100,6 +1098,7 @@ 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);
|
||||
}
|
||||
|
@ -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, screen.get_active_workspace ());
|
||||
let windows = display.get_tab_list(Meta.TabList.DOCKS, 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,6 +165,10 @@ 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) {
|
||||
|
@ -582,6 +582,7 @@ 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;
|
||||
@ -599,6 +600,7 @@ const Dash = new Lang.Class({
|
||||
this._resetHoverTimeoutId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
GLib.Source.set_name_by_id(this._resetHoverTimeoutId, '[gnome-shell] this._labelShowing');
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -18,8 +18,7 @@ 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();
|
||||
@ -33,7 +32,7 @@ function _onVertSepRepaint (area)
|
||||
cr.setLineWidth(stippleWidth);
|
||||
cr.stroke();
|
||||
cr.$dispose();
|
||||
};
|
||||
}
|
||||
|
||||
const DateMenuButton = new Lang.Class({
|
||||
Name: 'DateMenuButton',
|
||||
@ -63,8 +62,11 @@ 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',
|
||||
can_focus: true,
|
||||
reactive: false
|
||||
});
|
||||
this._date.connect('clicked',
|
||||
Lang.bind(this, function() {
|
||||
@ -82,6 +84,9 @@ 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);
|
||||
|
||||
@ -132,6 +137,13 @@ 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();
|
||||
|
@ -395,6 +395,7 @@ 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) {
|
||||
|
@ -551,6 +551,7 @@ const EndSessionDialog = new Lang.Class({
|
||||
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
GLib.Source.set_name_by_id(this._timerId, '[gnome-shell] this._confirm');
|
||||
},
|
||||
|
||||
_stopTimer: function() {
|
||||
|
@ -47,8 +47,11 @@ 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)
|
||||
this[prop] = node.get_length(styleProps[prop]);
|
||||
for (let prop in styleProps) {
|
||||
let [found, length] = node.lookup_length(styleProps[prop], false);
|
||||
if (found)
|
||||
this[prop] = length;
|
||||
}
|
||||
}));
|
||||
};
|
||||
layoutClass.prototype.child_set = function(actor, props) {
|
||||
|
@ -32,11 +32,9 @@ 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;
|
||||
},
|
||||
@ -48,12 +46,20 @@ 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;
|
||||
|
||||
// Ignore the return value, we get an exception if they fail
|
||||
// And they should never fail
|
||||
this._initAtspi();
|
||||
|
||||
this._atspiListener.register(STATECHANGED + ':focused');
|
||||
this._atspiListener.register(STATECHANGED + ':selected');
|
||||
this._focusListenerRegistered = true;
|
||||
@ -63,6 +69,8 @@ const FocusCaretTracker = new Lang.Class({
|
||||
if (this._caretListenerRegistered)
|
||||
return;
|
||||
|
||||
this._initAtspi();
|
||||
|
||||
this._atspiListener.register(CARETMOVED);
|
||||
this._caretListenerRegistered = true;
|
||||
},
|
||||
|
@ -11,6 +11,9 @@ const Main = imports.ui.main;
|
||||
|
||||
const MAX_CANDIDATES_PER_PAGE = 16;
|
||||
|
||||
const DEFAULT_INDEX_LABELS = [ '1', '2', '3', '4', '5', '6', '7', '8',
|
||||
'9', '0', 'a', 'b', 'c', 'd', 'e', 'f' ];
|
||||
|
||||
const CandidateArea = new Lang.Class({
|
||||
Name: 'CandidateArea',
|
||||
|
||||
@ -89,7 +92,7 @@ const CandidateArea = new Lang.Class({
|
||||
if (!visible)
|
||||
continue;
|
||||
|
||||
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : '%x'.format(i + 1));
|
||||
box._indexLabel.text = ((indexes && indexes[i]) ? indexes[i] : DEFAULT_INDEX_LABELS[i]);
|
||||
box._candidateLabel.text = candidates[i];
|
||||
}
|
||||
|
||||
@ -155,7 +158,7 @@ const CandidatePopup = new Lang.Class({
|
||||
|
||||
panelService.connect('set-cursor-location',
|
||||
Lang.bind(this, function(ps, x, y, w, h) {
|
||||
Main.layoutManager.setDummyCursorPosition(x, y);
|
||||
Main.layoutManager.setDummyCursorGeometry(x, y, w, h);
|
||||
if (this._boxPointer.actor.visible)
|
||||
this._boxPointer.setPosition(Main.layoutManager.dummyCursor, 0);
|
||||
}));
|
||||
|
@ -522,11 +522,6 @@ 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);
|
||||
@ -535,8 +530,8 @@ 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);
|
||||
}
|
||||
}
|
||||
@ -645,6 +640,10 @@ const PaginatedIconGrid = new Lang.Class({
|
||||
return this._nPages;
|
||||
},
|
||||
|
||||
getPageHeight: function() {
|
||||
return this._availableHeightPerPageForItems();
|
||||
},
|
||||
|
||||
getPageY: function(pageNumber) {
|
||||
if (!this._nPages)
|
||||
return 0;
|
||||
|
@ -161,9 +161,9 @@ const Keyboard = new Lang.Class({
|
||||
|
||||
this._timestamp = global.display.get_current_time_roundtrip();
|
||||
|
||||
this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
|
||||
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA });
|
||||
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
|
||||
this._a11yApplicationsSettings = new Gio.Settings({ schema: A11Y_APPLICATIONS_SCHEMA });
|
||||
this._a11yApplicationsSettings = new Gio.Settings({ schema_id: A11Y_APPLICATIONS_SCHEMA });
|
||||
this._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._settingsChanged));
|
||||
this._settingsChanged();
|
||||
|
||||
@ -266,12 +266,14 @@ 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;
|
||||
}));
|
||||
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');
|
||||
}
|
||||
},
|
||||
|
||||
_createLayersForGroup: function (gname) {
|
||||
@ -500,6 +502,7 @@ 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) {
|
||||
@ -526,6 +529,7 @@ 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() {
|
||||
|
@ -163,7 +163,7 @@ const LayoutManager = new Lang.Class({
|
||||
// Normally, the stage is always covered so Clutter doesn't need to clear
|
||||
// it; however it becomes visible during the startup animation
|
||||
// See the comment below for a longer explanation
|
||||
global.stage.color = DEFAULT_BACKGROUND_COLOR;
|
||||
global.stage.background_color = DEFAULT_BACKGROUND_COLOR;
|
||||
|
||||
// Set up stage hierarchy to group all UI actors under one container.
|
||||
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
||||
@ -223,8 +223,8 @@ const LayoutManager = new Lang.Class({
|
||||
this._keyboardHeightNotifyId = 0;
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position set in setDummyCursorPosition.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0 });
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0, visible: false });
|
||||
this.uiGroup.add_actor(this.dummyCursor);
|
||||
|
||||
global.stage.remove_actor(global.top_window_group);
|
||||
@ -597,13 +597,15 @@ const LayoutManager = new Lang.Class({
|
||||
reactive: true });
|
||||
this.addChrome(this._coverPane);
|
||||
|
||||
if (Main.sessionMode.isGreeter) {
|
||||
if (Meta.is_restart()) {
|
||||
// On restart, we don't do an animation
|
||||
} else if (Main.sessionMode.isGreeter) {
|
||||
this.panelBox.translation_y = -this.panelBox.height;
|
||||
} else {
|
||||
this._updateBackgrounds();
|
||||
|
||||
// We need to force an update of the regions now before we scale
|
||||
// the UI group to get the coorect allocation for the struts.
|
||||
// the UI group to get the correct allocation for the struts.
|
||||
this._updateRegions();
|
||||
|
||||
this.trayBox.hide();
|
||||
@ -628,14 +630,17 @@ 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
|
||||
GLib.idle_add(GLib.PRIORITY_LOW, Lang.bind(this, function() {
|
||||
let id = 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() {
|
||||
if (Main.sessionMode.isGreeter)
|
||||
if (Meta.is_restart())
|
||||
this._startupAnimationComplete();
|
||||
else if (Main.sessionMode.isGreeter)
|
||||
this._startupAnimationGreeter();
|
||||
else
|
||||
this._startupAnimationSession();
|
||||
@ -728,7 +733,7 @@ const LayoutManager = new Lang.Class({
|
||||
this._updateRegions();
|
||||
},
|
||||
|
||||
// setDummyCursorPosition:
|
||||
// setDummyCursorGeometry:
|
||||
//
|
||||
// The cursor dummy is a standard widget commonly used for popup
|
||||
// menus and box pointers to track, as the box pointer API only
|
||||
@ -737,9 +742,10 @@ 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.
|
||||
setDummyCursorPosition: function(x, y) {
|
||||
// position and has the right size.
|
||||
setDummyCursorGeometry: function(x, y, w, h) {
|
||||
this.dummyCursor.set_position(Math.round(x), Math.round(y));
|
||||
this.dummyCursor.set_size(Math.round(w), Math.round(h));
|
||||
},
|
||||
|
||||
// addChrome:
|
||||
@ -1015,23 +1021,6 @@ 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);
|
||||
|
@ -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: 'org.gnome.desktop.interface' });
|
||||
this._interfaceSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||
this._interfaceSettings.connect('changed::monospace-font-name',
|
||||
Lang.bind(this, this._updateFont));
|
||||
this._updateFont();
|
||||
@ -843,9 +843,10 @@ const LookingGlass = new Lang.Class({
|
||||
System.gc();
|
||||
this._timeoutId = Mainloop.timeout_add(500, Lang.bind(this, function () {
|
||||
gcIcon.icon_name = 'gnome-fs-trash-full';
|
||||
Mainloop.source_remove(this._timeoutId);
|
||||
this._timeoutId = 0;
|
||||
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;
|
||||
}));
|
||||
|
||||
|
@ -441,8 +441,8 @@ const Magnifier = new Lang.Class({
|
||||
},
|
||||
|
||||
_settingsInit: function(zoomRegion) {
|
||||
this._appSettings = new Gio.Settings({ schema: APPLICATIONS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema: MAGNIFIER_SCHEMA });
|
||||
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||
|
||||
if (zoomRegion) {
|
||||
// Mag factor is accurate to two decimal places.
|
||||
|
@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem;
|
||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||
const Keyboard = imports.ui.keyboard;
|
||||
const MessageTray = imports.ui.messageTray;
|
||||
const ModalDialog = imports.ui.modalDialog;
|
||||
const OsdWindow = imports.ui.osdWindow;
|
||||
const Overview = imports.ui.overview;
|
||||
const Panel = imports.ui.panel;
|
||||
@ -43,6 +44,7 @@ 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;
|
||||
@ -55,7 +57,7 @@ let screenShield = null;
|
||||
let notificationDaemon = null;
|
||||
let windowAttentionHandler = null;
|
||||
let ctrlAltTabManager = null;
|
||||
let osdWindow = null;
|
||||
let osdWindowManager = null;
|
||||
let sessionMode = null;
|
||||
let shellDBusService = null;
|
||||
let shellMountOpDBusService = null;
|
||||
@ -73,7 +75,6 @@ let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
let _a11ySettings = null;
|
||||
let dynamicWorkspacesSchema = null;
|
||||
|
||||
function _sessionUpdated() {
|
||||
_loadDefaultStylesheet();
|
||||
@ -103,9 +104,6 @@ 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); });
|
||||
|
||||
@ -113,7 +111,6 @@ function start() {
|
||||
|
||||
sessionMode = new SessionMode.SessionMode();
|
||||
sessionMode.connect('updated', _sessionUpdated);
|
||||
_initializePrefs();
|
||||
_initializeUI();
|
||||
|
||||
shellDBusService = new ShellDBus.GnomeShell();
|
||||
@ -122,17 +119,6 @@ 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
|
||||
@ -158,7 +144,7 @@ function _initializeUI() {
|
||||
screencastService = new Screencast.ScreencastService();
|
||||
xdndHandler = new XdndHandler.XdndHandler();
|
||||
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
|
||||
osdWindow = new OsdWindow.OsdWindow();
|
||||
osdWindowManager = new OsdWindow.OsdWindowManager();
|
||||
overview = new Overview.Overview();
|
||||
wm = new WindowManager.WindowManager();
|
||||
magnifier = new Magnifier.Magnifier();
|
||||
@ -175,13 +161,23 @@ function _initializeUI() {
|
||||
layoutManager.init();
|
||||
overview.init();
|
||||
|
||||
_a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
|
||||
_a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||
|
||||
global.display.connect('overlay-key', Lang.bind(overview, function () {
|
||||
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
|
||||
overview.toggle();
|
||||
}));
|
||||
|
||||
global.display.connect('show-restart-message', function(display, message) {
|
||||
showRestartMessage(message);
|
||||
return true;
|
||||
});
|
||||
|
||||
global.display.connect('restart', function() {
|
||||
global.reexec_self();
|
||||
return true;
|
||||
});
|
||||
|
||||
// Provide the bus object for gnome-session to
|
||||
// initiate logouts.
|
||||
EndSessionDialog.init();
|
||||
@ -191,8 +187,6 @@ 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");
|
||||
@ -216,6 +210,17 @@ 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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@ -239,8 +244,7 @@ function _loadDefaultStylesheet() {
|
||||
* Returns: A file path that contains the theme CSS,
|
||||
* null if using the default
|
||||
*/
|
||||
function getThemeStylesheet()
|
||||
{
|
||||
function getThemeStylesheet() {
|
||||
return _cssStylesheet;
|
||||
}
|
||||
|
||||
@ -251,8 +255,7 @@ function getThemeStylesheet()
|
||||
*
|
||||
* Set the theme CSS file that the shell will load
|
||||
*/
|
||||
function setThemeStylesheet(cssStylesheet)
|
||||
{
|
||||
function setThemeStylesheet(cssStylesheet) {
|
||||
_cssStylesheet = cssStylesheet;
|
||||
}
|
||||
|
||||
@ -611,5 +614,31 @@ function queueDeferredWork(workId) {
|
||||
_deferredTimeoutId = 0;
|
||||
return GLib.SOURCE_REMOVE;
|
||||
});
|
||||
GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork');
|
||||
}
|
||||
}
|
||||
|
||||
const RestartMessage = new Lang.Class({
|
||||
Name: 'RestartMessage',
|
||||
Extends: ModalDialog.ModalDialog,
|
||||
|
||||
_init : function(message) {
|
||||
this.parent({ shellReactive: true,
|
||||
styleClass: 'restart-message',
|
||||
shouldFadeIn: false,
|
||||
destroyOnClose: true });
|
||||
|
||||
let label = new St.Label({ text: message });
|
||||
|
||||
this.contentLayout.add(label, { x_fill: false,
|
||||
y_fill: false,
|
||||
x_align: St.Align.MIDDLE,
|
||||
y_align: St.Align.MIDDLE });
|
||||
this.buttonLayout.hide();
|
||||
}
|
||||
});
|
||||
|
||||
function showRestartMessage(message) {
|
||||
let restartMessage = new RestartMessage(message);
|
||||
restartMessage.open();
|
||||
}
|
||||
|
@ -111,7 +111,6 @@ 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));
|
||||
@ -316,7 +315,7 @@ const NotificationGenericPolicy = new Lang.Class({
|
||||
|
||||
this.id = 'generic';
|
||||
|
||||
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
|
||||
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
|
||||
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||
},
|
||||
|
||||
@ -366,8 +365,8 @@ const NotificationApplicationPolicy = new Lang.Class({
|
||||
this.id = id;
|
||||
this._canonicalId = this._canonicalizeId(id);
|
||||
|
||||
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
|
||||
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
|
||||
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
|
||||
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
|
||||
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
|
||||
|
||||
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||
@ -504,7 +503,6 @@ 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;
|
||||
@ -643,10 +641,11 @@ 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)
|
||||
this._titleDirection = Clutter.TextDirection.RTL;
|
||||
titleDirection = Clutter.TextDirection.RTL;
|
||||
else
|
||||
this._titleDirection = Clutter.TextDirection.LTR;
|
||||
titleDirection = Clutter.TextDirection.LTR;
|
||||
|
||||
// Let the title's text direction control the overall direction
|
||||
// of the notification - in case where different scripts are used
|
||||
@ -654,7 +653,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(this._titleDirection);
|
||||
this._table.set_text_direction(titleDirection);
|
||||
|
||||
// Unless the notification has custom content, we save this.bannerBodyText
|
||||
// to add it to the content of the notification if the notification is
|
||||
@ -1901,14 +1900,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: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: 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: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.MESSAGE_TRAY |
|
||||
@ -1987,6 +1986,7 @@ 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 {
|
||||
@ -2267,6 +2267,16 @@ 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;
|
||||
@ -2276,14 +2286,7 @@ const MessageTray = new Lang.Class({
|
||||
// No dwell inside notifications at the bottom of the screen
|
||||
this._cancelTrayDwell();
|
||||
|
||||
this._useLongerNotificationLeftTimeout = false;
|
||||
if (this._notificationLeftTimeoutId) {
|
||||
Mainloop.source_remove(this._notificationLeftTimeoutId);
|
||||
this._notificationLeftTimeoutId = 0;
|
||||
this._notificationLeftMouseX = -1;
|
||||
this._notificationLeftMouseY = -1;
|
||||
return;
|
||||
}
|
||||
this._resetNotificationLeftTimeout();
|
||||
|
||||
if (this._showNotificationMouseX >= 0) {
|
||||
let actorAtShowNotificationPosition =
|
||||
@ -2300,6 +2303,7 @@ const MessageTray = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this._pointerInNotification = true;
|
||||
this._updateState();
|
||||
} else {
|
||||
@ -2316,6 +2320,7 @@ 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');
|
||||
}
|
||||
},
|
||||
|
||||
@ -2351,6 +2356,7 @@ 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;
|
||||
@ -2624,6 +2630,8 @@ const MessageTray = new Lang.Class({
|
||||
// the mouse is moving towards it or within it.
|
||||
this._lastSeenMouseX = x;
|
||||
this._lastSeenMouseY = y;
|
||||
|
||||
this._resetNotificationLeftTimeout();
|
||||
},
|
||||
|
||||
_updateShowingNotification: function() {
|
||||
@ -2668,10 +2676,12 @@ 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() {
|
||||
@ -2714,13 +2724,7 @@ const MessageTray = new Lang.Class({
|
||||
this._notificationUnfocusedId = 0;
|
||||
}
|
||||
|
||||
this._useLongerNotificationLeftTimeout = false;
|
||||
if (this._notificationLeftTimeoutId) {
|
||||
Mainloop.source_remove(this._notificationLeftTimeoutId);
|
||||
this._notificationLeftTimeoutId = 0;
|
||||
this._notificationLeftMouseX = -1;
|
||||
this._notificationLeftMouseY = -1;
|
||||
}
|
||||
this._resetNotificationLeftTimeout();
|
||||
|
||||
if (animate) {
|
||||
this._tween(this._notificationWidget, '_notificationState', State.HIDDEN,
|
||||
|
@ -43,6 +43,7 @@ const ModalDialog = new Lang.Class({
|
||||
styleClass: null,
|
||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||
shouldFadeIn: true,
|
||||
shouldFadeOut: true,
|
||||
destroyOnClose: true });
|
||||
|
||||
this.state = State.CLOSED;
|
||||
@ -50,6 +51,7 @@ const ModalDialog = new Lang.Class({
|
||||
this._keybindingMode = params.keybindingMode;
|
||||
this._shellReactive = params.shellReactive;
|
||||
this._shouldFadeIn = params.shouldFadeIn;
|
||||
this._shouldFadeOut = params.shouldFadeOut;
|
||||
this._destroyOnClose = params.destroyOnClose;
|
||||
|
||||
this._group = new St.Widget({ visible: false,
|
||||
@ -307,6 +309,15 @@ const ModalDialog = new Lang.Class({
|
||||
return true;
|
||||
},
|
||||
|
||||
_closeComplete: function() {
|
||||
this.state = State.CLOSED;
|
||||
this._group.hide();
|
||||
this.emit('closed');
|
||||
|
||||
if (this._destroyOnClose)
|
||||
this.destroy();
|
||||
},
|
||||
|
||||
close: function(timestamp) {
|
||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||
return;
|
||||
@ -315,20 +326,16 @@ const ModalDialog = new Lang.Class({
|
||||
this.popModal(timestamp);
|
||||
this._savedKeyFocus = null;
|
||||
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: OPEN_AND_CLOSE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
this.state = State.CLOSED;
|
||||
this._group.hide();
|
||||
this.emit('closed');
|
||||
|
||||
if (this._destroyOnClose)
|
||||
this.destroy();
|
||||
})
|
||||
});
|
||||
if (this._shouldFadeOut)
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: OPEN_AND_CLOSE_TIME,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
this._closeComplete)
|
||||
})
|
||||
else
|
||||
this._closeComplete();
|
||||
},
|
||||
|
||||
// Drop modal status without closing the dialog; this makes the
|
||||
|
@ -120,15 +120,12 @@ const FdoNotificationDaemon = new Lang.Class({
|
||||
|
||||
this._nextNotificationId = 1;
|
||||
|
||||
Shell.WindowTracker.get_default().connect('notify::focus-app', Lang.bind(this, this._onFocusAppChanged));
|
||||
Main.overview.connect('hidden', Lang.bind(this, this._onFocusAppChanged));
|
||||
|
||||
this._trayManager = new Shell.TrayManager();
|
||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||
|
||||
Shell.WindowTracker.get_default().connect('notify::focus-app',
|
||||
Lang.bind(this, this._onFocusAppChanged));
|
||||
Main.overview.connect('hidden',
|
||||
Lang.bind(this, this._onFocusAppChanged));
|
||||
|
||||
this._trayManager.manage_screen(global.screen, Main.messageTray.actor);
|
||||
},
|
||||
|
||||
@ -244,11 +241,12 @@ const FdoNotificationDaemon = new Lang.Class({
|
||||
// Ignore replacesId since we already sent back a
|
||||
// NotificationClosed for that id.
|
||||
id = this._nextNotificationId++;
|
||||
Mainloop.idle_add(Lang.bind(this,
|
||||
function () {
|
||||
this._emitNotificationClosed(id, NotificationClosedReason.DISMISSED);
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
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');
|
||||
return invocation.return_value(GLib.Variant.new('(u)', [id]));
|
||||
}
|
||||
|
||||
@ -691,6 +689,12 @@ const FdoNotificationDaemonSource = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const PRIORITY_URGENCY_MAP = {
|
||||
low: MessageTray.Urgency.LOW,
|
||||
normal: MessageTray.Urgency.NORMAL,
|
||||
high: MessageTray.Urgency.HIGH,
|
||||
urgent: MessageTray.Urgency.CRITICAL
|
||||
};
|
||||
|
||||
const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
Name: 'GtkNotificationDaemonNotification',
|
||||
@ -704,12 +708,20 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
||||
"body": body,
|
||||
"icon": gicon,
|
||||
"urgent": urgent,
|
||||
"priority": priority,
|
||||
"buttons": buttons,
|
||||
"default-action": defaultAction,
|
||||
"default-action-target": defaultActionTarget } = notification;
|
||||
|
||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||
: MessageTray.Urgency.NORMAL);
|
||||
if (priority) {
|
||||
let urgency = PRIORITY_URGENCY_MAP[priority.unpack()];
|
||||
this.setUrgency(urgency != undefined ? urgency : MessageTray.Urgency.NORMAL);
|
||||
} else if (urgent) {
|
||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
||||
: MessageTray.Urgency.NORMAL);
|
||||
} else {
|
||||
this.setUrgency(MessageTray.Urgency.NORMAL);
|
||||
}
|
||||
|
||||
if (buttons) {
|
||||
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
||||
|
@ -73,14 +73,17 @@ const LevelBar = new Lang.Class({
|
||||
const OsdWindow = new Lang.Class({
|
||||
Name: 'OsdWindow',
|
||||
|
||||
_init: function() {
|
||||
_init: function(monitorIndex) {
|
||||
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._currentMonitor = undefined;
|
||||
this.setMonitor (-1);
|
||||
|
||||
this._monitorIndex = monitorIndex;
|
||||
let constraint = new Layout.MonitorConstraint({ index: monitorIndex });
|
||||
this.actor.add_constraint(constraint);
|
||||
|
||||
this._box = new St.BoxLayout({ style_class: 'osd-window',
|
||||
vertical: true });
|
||||
this.actor.add_actor(this._box);
|
||||
@ -109,7 +112,6 @@ const OsdWindow = new Lang.Class({
|
||||
Main.layoutManager.connect('monitors-changed',
|
||||
Lang.bind(this, this._monitorsChanged));
|
||||
this._monitorsChanged();
|
||||
|
||||
Main.uiGroup.add_child(this.actor);
|
||||
},
|
||||
|
||||
@ -125,7 +127,7 @@ const OsdWindow = new Lang.Class({
|
||||
|
||||
setLevel: function(level) {
|
||||
this._level.actor.visible = (level != undefined);
|
||||
if (level) {
|
||||
if (level != undefined) {
|
||||
if (this.actor.visible)
|
||||
Tweener.addTween(this._level,
|
||||
{ level: level,
|
||||
@ -156,6 +158,7 @@ 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() {
|
||||
@ -188,12 +191,9 @@ const OsdWindow = new Lang.Class({
|
||||
|
||||
_monitorsChanged: function() {
|
||||
/* assume 110x110 on a 640x480 display and scale from there */
|
||||
let monitor;
|
||||
|
||||
if (this._currentMonitor >= 0)
|
||||
monitor = Main.layoutManager.monitors[this._currentMonitor];
|
||||
else
|
||||
monitor = Main.layoutManager.primaryMonitor;
|
||||
let monitor = Main.layoutManager.monitors[this._monitorIndex];
|
||||
if (!monitor)
|
||||
return; // we are about to be removed
|
||||
|
||||
let scalew = monitor.width / 640.0;
|
||||
let scaleh = monitor.height / 480.0;
|
||||
@ -222,23 +222,56 @@ 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);
|
||||
},
|
||||
|
||||
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;
|
||||
}
|
||||
});
|
||||
|
||||
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();
|
||||
}
|
||||
});
|
||||
|
@ -365,6 +365,7 @@ 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;
|
||||
@ -424,8 +425,6 @@ const Overview = new Lang.Class({
|
||||
this.emit('windows-restacked', stackIndices);
|
||||
},
|
||||
|
||||
//// Public methods ////
|
||||
|
||||
beginItemDrag: function(source) {
|
||||
this.emit('item-drag-begin');
|
||||
this._inDrag = true;
|
||||
@ -454,23 +453,6 @@ const Overview = new Lang.Class({
|
||||
this._inDrag = false;
|
||||
},
|
||||
|
||||
// show:
|
||||
//
|
||||
// Animates the overview visible and grabs mouse and keyboard input
|
||||
show: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
if (this._shown)
|
||||
return;
|
||||
this._shown = true;
|
||||
|
||||
if (!this._syncGrab())
|
||||
return;
|
||||
|
||||
Main.layoutManager.showOverview();
|
||||
this._animateVisible();
|
||||
},
|
||||
|
||||
focusSearch: function() {
|
||||
this.show();
|
||||
this._searchEntry.grab_key_focus();
|
||||
@ -503,69 +485,6 @@ const Overview = new Lang.Class({
|
||||
});
|
||||
},
|
||||
|
||||
_animateVisible: function() {
|
||||
if (this.visible || this.animationInProgress)
|
||||
return;
|
||||
|
||||
this.visible = true;
|
||||
this.animationInProgress = true;
|
||||
this.visibleTarget = true;
|
||||
this._activationTime = Date.now() / 1000;
|
||||
|
||||
Meta.disable_unredirect_for_screen(global.screen);
|
||||
this.viewSelector.show();
|
||||
|
||||
this._stack.opacity = 0;
|
||||
Tweener.addTween(this._stack,
|
||||
{ opacity: 255,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME,
|
||||
onComplete: this._showDone,
|
||||
onCompleteScope: this
|
||||
});
|
||||
this._shadeBackgrounds();
|
||||
|
||||
this._coverPane.raise_top();
|
||||
this._coverPane.show();
|
||||
this.emit('showing');
|
||||
},
|
||||
|
||||
// hide:
|
||||
//
|
||||
// Reverses the effect of show()
|
||||
hide: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
if (!this._shown)
|
||||
return;
|
||||
|
||||
let event = Clutter.get_current_event();
|
||||
if (event) {
|
||||
let type = event.type();
|
||||
let button = (type == Clutter.EventType.BUTTON_PRESS ||
|
||||
type == Clutter.EventType.BUTTON_RELEASE);
|
||||
let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0;
|
||||
if (button && ctrl)
|
||||
return;
|
||||
}
|
||||
|
||||
this._animateNotVisible();
|
||||
|
||||
this._shown = false;
|
||||
this._syncGrab();
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
if (this.visible)
|
||||
this.hide();
|
||||
else
|
||||
this.show();
|
||||
},
|
||||
|
||||
// Checks if the Activities button is currently sensitive to
|
||||
// clicks. The first call to this function within the
|
||||
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
||||
@ -582,8 +501,6 @@ const Overview = new Lang.Class({
|
||||
return false;
|
||||
},
|
||||
|
||||
//// Private methods ////
|
||||
|
||||
_syncGrab: function() {
|
||||
// We delay grab changes during animation so that when removing the
|
||||
// overview we don't have a problem with the release of a press/release
|
||||
@ -613,6 +530,92 @@ const Overview = new Lang.Class({
|
||||
return true;
|
||||
},
|
||||
|
||||
// show:
|
||||
//
|
||||
// Animates the overview visible and grabs mouse and keyboard input
|
||||
show: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
if (this._shown)
|
||||
return;
|
||||
this._shown = true;
|
||||
|
||||
if (!this._syncGrab())
|
||||
return;
|
||||
|
||||
Main.layoutManager.showOverview();
|
||||
this._animateVisible();
|
||||
},
|
||||
|
||||
|
||||
_animateVisible: function() {
|
||||
if (this.visible || this.animationInProgress)
|
||||
return;
|
||||
|
||||
this.visible = true;
|
||||
this.animationInProgress = true;
|
||||
this.visibleTarget = true;
|
||||
this._activationTime = Date.now() / 1000;
|
||||
|
||||
Meta.disable_unredirect_for_screen(global.screen);
|
||||
this.viewSelector.show();
|
||||
|
||||
this._stack.opacity = 0;
|
||||
Tweener.addTween(this._stack,
|
||||
{ opacity: 255,
|
||||
transition: 'easeOutQuad',
|
||||
time: ANIMATION_TIME,
|
||||
onComplete: this._showDone,
|
||||
onCompleteScope: this
|
||||
});
|
||||
this._shadeBackgrounds();
|
||||
|
||||
this._coverPane.raise_top();
|
||||
this._coverPane.show();
|
||||
this.emit('showing');
|
||||
},
|
||||
|
||||
_showDone: function() {
|
||||
this.animationInProgress = false;
|
||||
this._desktopFade.hide();
|
||||
this._coverPane.hide();
|
||||
|
||||
this.emit('shown');
|
||||
// Handle any calls to hide* while we were showing
|
||||
if (!this._shown)
|
||||
this._animateNotVisible();
|
||||
|
||||
this._syncGrab();
|
||||
global.sync_pointer();
|
||||
},
|
||||
|
||||
// hide:
|
||||
//
|
||||
// Reverses the effect of show()
|
||||
hide: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
if (!this._shown)
|
||||
return;
|
||||
|
||||
let event = Clutter.get_current_event();
|
||||
if (event) {
|
||||
let type = event.type();
|
||||
let button = (type == Clutter.EventType.BUTTON_PRESS ||
|
||||
type == Clutter.EventType.BUTTON_RELEASE);
|
||||
let ctrl = (event.get_state() & Clutter.ModifierType.CONTROL_MASK) != 0;
|
||||
if (button && ctrl)
|
||||
return;
|
||||
}
|
||||
|
||||
this._animateNotVisible();
|
||||
|
||||
this._shown = false;
|
||||
this._syncGrab();
|
||||
},
|
||||
|
||||
|
||||
_animateNotVisible: function() {
|
||||
if (!this.visible || this.animationInProgress)
|
||||
return;
|
||||
@ -637,20 +640,6 @@ const Overview = new Lang.Class({
|
||||
this.emit('hiding');
|
||||
},
|
||||
|
||||
_showDone: function() {
|
||||
this.animationInProgress = false;
|
||||
this._desktopFade.hide();
|
||||
this._coverPane.hide();
|
||||
|
||||
this.emit('shown');
|
||||
// Handle any calls to hide* while we were showing
|
||||
if (!this._shown)
|
||||
this._animateNotVisible();
|
||||
|
||||
this._syncGrab();
|
||||
global.sync_pointer();
|
||||
},
|
||||
|
||||
_hideDone: function() {
|
||||
// Re-enable unredirection
|
||||
Meta.enable_unredirect_for_screen(global.screen);
|
||||
@ -676,6 +665,16 @@ const Overview = new Lang.Class({
|
||||
this._fakePointerEvent();
|
||||
this._needsFakePointerEvent = false;
|
||||
}
|
||||
},
|
||||
|
||||
toggle: function() {
|
||||
if (this.isDummy)
|
||||
return;
|
||||
|
||||
if (this.visible)
|
||||
this.hide();
|
||||
else
|
||||
this.show();
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(Overview.prototype);
|
||||
|
@ -259,13 +259,18 @@ 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 more than one
|
||||
let alwaysZoomOut = this.actor.hover || this._inDrag || !Meta.prefs_get_dynamic_workspaces() || global.screen.n_workspaces > 2;
|
||||
// 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;
|
||||
|
||||
if (!alwaysZoomOut) {
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
|
@ -14,7 +14,6 @@ const St = imports.gi.St;
|
||||
const Signals = imports.signals;
|
||||
const Atk = imports.gi.Atk;
|
||||
|
||||
|
||||
const Animation = imports.ui.animation;
|
||||
const Config = imports.misc.config;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
@ -595,6 +594,7 @@ 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;
|
||||
},
|
||||
|
@ -41,8 +41,7 @@ const ButtonBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||
let children = actor.get_children();
|
||||
let child = children.length > 0 ? children[0] : null;
|
||||
let child = actor.get_first_child();
|
||||
|
||||
if (child) {
|
||||
[alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1);
|
||||
@ -55,8 +54,7 @@ const ButtonBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||
let children = actor.get_children();
|
||||
let child = children.length > 0 ? children[0] : null;
|
||||
let child = actor.get_first_child();
|
||||
|
||||
if (child) {
|
||||
[alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1);
|
||||
@ -66,13 +64,11 @@ const ButtonBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_allocate: function(actor, box, flags) {
|
||||
let children = actor.get_children();
|
||||
if (children.length == 0)
|
||||
let child = actor.get_first_child();
|
||||
if (!child)
|
||||
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;
|
||||
|
@ -107,6 +107,7 @@ 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() {
|
||||
|
@ -46,33 +46,28 @@ function isPopupMenuItemVisible(child) {
|
||||
* @side Side to which the arrow points.
|
||||
*/
|
||||
function arrowIcon(side) {
|
||||
let rotation;
|
||||
let iconName;
|
||||
switch (side) {
|
||||
case St.Side.TOP:
|
||||
rotation = 180;
|
||||
iconName = 'pan-up-symbolic';
|
||||
break;
|
||||
case St.Side.RIGHT:
|
||||
rotation = - 90;
|
||||
iconName = 'pan-end-symbolic';
|
||||
break;
|
||||
case St.Side.BOTTOM:
|
||||
rotation = 0;
|
||||
iconName = 'pan-down-symbolic';
|
||||
break;
|
||||
case St.Side.LEFT:
|
||||
rotation = 90;
|
||||
iconName = 'pan-start-symbolic';
|
||||
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',
|
||||
gicon: gicon,
|
||||
icon_name: iconName,
|
||||
accessible_role: Atk.Role.ARROW,
|
||||
y_expand: true,
|
||||
y_align: Clutter.ActorAlign.CENTER });
|
||||
|
||||
arrow.rotation_angle_z = rotation;
|
||||
|
||||
return arrow;
|
||||
}
|
||||
|
||||
@ -251,8 +246,16 @@ 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 != '';
|
||||
}
|
||||
});
|
||||
|
||||
@ -375,9 +378,9 @@ const PopupImageMenuItem = new Lang.Class({
|
||||
this.parent(params);
|
||||
|
||||
this.label = new St.Label({ text: text });
|
||||
this.addActor(this.label);
|
||||
this.actor.add_child(this.label);
|
||||
this._icon = new St.Icon({ style_class: 'popup-menu-icon' });
|
||||
this.addActor(this._icon, { align: St.Align.END });
|
||||
this.actor.add_child(this._icon, { align: St.Align.END });
|
||||
|
||||
this.setIcon(iconName);
|
||||
},
|
||||
|
@ -117,7 +117,7 @@ function loadRemoteSearchProviders(callback) {
|
||||
}
|
||||
}
|
||||
|
||||
let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||
let searchSettings = new Gio.Settings({ schema_id: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||
if (searchSettings.get_boolean('disable-external')) {
|
||||
callback([]);
|
||||
return;
|
||||
|
@ -38,8 +38,8 @@ const RunDialog = new Lang.Class({
|
||||
this.parent({ styleClass: 'run-dialog',
|
||||
destroyOnClose: false });
|
||||
|
||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
||||
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
|
||||
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
|
||||
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
||||
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
||||
}));
|
||||
@ -50,14 +50,10 @@ const RunDialog = new Lang.Class({
|
||||
Main.createLookingGlass().open();
|
||||
}),
|
||||
|
||||
'r': Lang.bind(this, function() {
|
||||
global.reexec_self();
|
||||
}),
|
||||
'r': Lang.bind(this, this._restart),
|
||||
|
||||
// Developer brain backwards compatibility
|
||||
'restart': Lang.bind(this, function() {
|
||||
global.reexec_self();
|
||||
}),
|
||||
'restart': Lang.bind(this, this._restart),
|
||||
|
||||
'debugexit': Lang.bind(this, function() {
|
||||
Meta.quit(Meta.ExitCode.ERROR);
|
||||
@ -271,6 +267,12 @@ const RunDialog = new Lang.Class({
|
||||
}
|
||||
},
|
||||
|
||||
_restart: function() {
|
||||
this._shouldFadeOut = false;
|
||||
this.close();
|
||||
Meta.restart(_("Restarting…"));
|
||||
},
|
||||
|
||||
open: function() {
|
||||
this._history.lastItem();
|
||||
this._errorBox.hide();
|
||||
|
@ -563,7 +563,7 @@ const ScreenShield = new Lang.Class({
|
||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
||||
}));
|
||||
|
||||
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
|
||||
|
||||
this._isModal = false;
|
||||
this._hasLockScreen = false;
|
||||
@ -850,6 +850,7 @@ 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);
|
||||
@ -1041,6 +1042,7 @@ 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();
|
||||
}
|
||||
|
||||
@ -1108,10 +1110,11 @@ const ScreenShield = new Lang.Class({
|
||||
if (params.fadeToBlack && params.animateFade) {
|
||||
// Take a beat
|
||||
|
||||
Mainloop.timeout_add(1000 * MANUAL_FADE_TIME, Lang.bind(this, function() {
|
||||
let id = 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);
|
||||
|
@ -11,6 +11,7 @@ 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;
|
||||
@ -67,6 +68,13 @@ 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);
|
||||
@ -77,13 +85,31 @@ 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;
|
||||
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");
|
||||
[x, y, width, height] = this._scaleArea(x, y, width, height);
|
||||
if (!this._checkArea(x, y, width, height)) {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum,
|
||||
Gio.IOErrorEnum.CANCELLED,
|
||||
"Invalid params");
|
||||
return;
|
||||
}
|
||||
let screenshot = new Shell.Screenshot();
|
||||
@ -114,9 +140,9 @@ const ScreenshotService = new Lang.Class({
|
||||
selectArea.connect('finished', Lang.bind(this,
|
||||
function(selectArea, areaRectangle) {
|
||||
if (areaRectangle) {
|
||||
let retval = GLib.Variant.new('(iiii)',
|
||||
[areaRectangle.x, areaRectangle.y,
|
||||
areaRectangle.width, areaRectangle.height]);
|
||||
let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
|
||||
areaRectangle.width, areaRectangle.height);
|
||||
let retval = GLib.Variant.new('(iiii)', retRectangle);
|
||||
invocation.return_value(retval);
|
||||
} else {
|
||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||
@ -125,9 +151,18 @@ const ScreenshotService = new Lang.Class({
|
||||
}));
|
||||
},
|
||||
|
||||
FlashArea: function(x, y, width, height) {
|
||||
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;
|
||||
}
|
||||
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
|
||||
flashspot.fire();
|
||||
invocation.return_value(null);
|
||||
}
|
||||
});
|
||||
|
||||
@ -139,6 +174,7 @@ const SelectArea = new Lang.Class({
|
||||
this._startY = -1;
|
||||
this._lastX = 0;
|
||||
this._lastY = 0;
|
||||
this._result = null;
|
||||
|
||||
this._initRubberbandColors();
|
||||
|
||||
@ -148,12 +184,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));
|
||||
|
||||
@ -169,10 +205,12 @@ const SelectArea = new Lang.Class({
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if (!Main.pushModal(this._group) || this._group.visible)
|
||||
if (!this._grabHelper.grab({ actor: this._group,
|
||||
onUngrab: Lang.bind(this, this._onUngrab) }))
|
||||
return;
|
||||
|
||||
global.screen.set_cursor(Meta.Cursor.CROSSHAIR);
|
||||
Main.uiGroup.set_child_above_sibling(this._group, null);
|
||||
this._group.visible = true;
|
||||
},
|
||||
|
||||
@ -202,13 +240,6 @@ 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;
|
||||
@ -230,24 +261,28 @@ const SelectArea = new Lang.Class({
|
||||
},
|
||||
|
||||
_onButtonRelease: function(actor, event) {
|
||||
this._destroy(this._getGeometry(), true);
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_destroy: function(geometry, fade) {
|
||||
this._result = this._getGeometry();
|
||||
Tweener.addTween(this._group,
|
||||
{ opacity: 0,
|
||||
time: fade ? 0.2 : 0,
|
||||
time: 0.2,
|
||||
transition: 'easeOutQuad',
|
||||
onComplete: Lang.bind(this,
|
||||
function() {
|
||||
Main.popModal(this._group);
|
||||
this._group.destroy();
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
|
||||
this.emit('finished', geometry);
|
||||
this._grabHelper.ungrab();
|
||||
})
|
||||
});
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
},
|
||||
|
||||
_onUngrab: function() {
|
||||
global.screen.set_cursor(Meta.Cursor.DEFAULT);
|
||||
this.emit('finished', this._result);
|
||||
|
||||
GLib.idle_add(GLib.PRIORITY_DEFAULT, Lang.bind(this,
|
||||
function() {
|
||||
this._group.destroy();
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(SelectArea.prototype);
|
||||
|
@ -7,6 +7,7 @@ const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
|
||||
const Main = imports.ui.main;
|
||||
const Params = imports.misc.params;
|
||||
|
||||
// This module provides functionality for driving the shell user interface
|
||||
// in an automated fashion. The primary current use case for this is
|
||||
@ -39,11 +40,12 @@ const Main = imports.ui.main;
|
||||
function sleep(milliseconds) {
|
||||
let cb;
|
||||
|
||||
Mainloop.timeout_add(milliseconds, function() {
|
||||
let id = 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;
|
||||
@ -77,6 +79,7 @@ const PerfHelperIface = '<node> \
|
||||
<arg type="i" direction="in" /> \
|
||||
<arg type="b" direction="in" /> \
|
||||
<arg type="b" direction="in" /> \
|
||||
<arg type="b" direction="in" /> \
|
||||
</method> \
|
||||
<method name="WaitWindows" /> \
|
||||
<method name="DestroyWindows" /> \
|
||||
@ -96,11 +99,36 @@ function _getPerfHelper() {
|
||||
return _perfHelper;
|
||||
}
|
||||
|
||||
function _callRemote(obj, method, ...args) {
|
||||
let cb;
|
||||
let errcb;
|
||||
|
||||
args.push(function(result, excp) {
|
||||
if (excp) {
|
||||
if (errcb)
|
||||
errcb(excp);
|
||||
} else {
|
||||
if (cb)
|
||||
cb();
|
||||
}
|
||||
});
|
||||
|
||||
method.apply(obj, args);
|
||||
|
||||
return function(callback, error_callback) {
|
||||
cb = callback;
|
||||
errcb = error_callback;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* createTestWindow:
|
||||
* @width: width of window, in pixels
|
||||
* @height: height of window, in pixels
|
||||
* @alpha: whether the window should be alpha transparent
|
||||
* @params: options for window creation.
|
||||
* width - width of window, in pixels (default 640)
|
||||
* height - height of window, in pixels (default 480)
|
||||
* alpha - whether the window should have an alpha channel (default false)
|
||||
* maximized - whether the window should be created maximized (default false)
|
||||
* redraws - whether the window should continually redraw itself (default false)
|
||||
* @maximized: whethe the window should be created maximized
|
||||
*
|
||||
* Creates a window using gnome-shell-perf-helper for testing purposes.
|
||||
@ -109,19 +137,17 @@ function _getPerfHelper() {
|
||||
* because of the normal X asynchronous mapping process, to actually wait
|
||||
* until the window has been mapped and exposed, use waitTestWindows().
|
||||
*/
|
||||
function createTestWindow(width, height, alpha, maximized) {
|
||||
let cb;
|
||||
function createTestWindow(width, height, params) {
|
||||
params = Params.parse(params, { width: 640,
|
||||
height: 480,
|
||||
alpha: false,
|
||||
maximized: false,
|
||||
redraws: false });
|
||||
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
|
||||
function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
|
||||
params.width, params.height,
|
||||
params.alpha, params.maximized, params.redraws);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -131,17 +157,8 @@ function createTestWindow(width, height, alpha, maximized) {
|
||||
* created with createTestWindow have been mapped and exposed.
|
||||
*/
|
||||
function waitTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.WaitWindowsRemote(function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.WaitWindowsRemote);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -154,17 +171,8 @@ function waitTestWindows() {
|
||||
* process because of normal X asynchronicity.
|
||||
*/
|
||||
function destroyTestWindows() {
|
||||
let cb;
|
||||
let perfHelper = _getPerfHelper();
|
||||
|
||||
perfHelper.DestroyWindowsRemote(function(result, excp) {
|
||||
if (cb)
|
||||
cb();
|
||||
});
|
||||
|
||||
return function(callback) {
|
||||
cb = callback;
|
||||
};
|
||||
return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -207,6 +215,10 @@ function _step(g, finish, onError) {
|
||||
let waitFunction = g.next();
|
||||
waitFunction(function() {
|
||||
_step(g, finish, onError);
|
||||
},
|
||||
function(err) {
|
||||
if (onError)
|
||||
onError(err);
|
||||
});
|
||||
} catch (err if err instanceof StopIteration) {
|
||||
if (finish)
|
||||
@ -305,8 +317,8 @@ function _collect(scriptModule, outputFile) {
|
||||
print ('------------------------------------------------------------');
|
||||
for (let i = 0; i < metrics.length; i++) {
|
||||
let metric = metrics[i];
|
||||
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
|
||||
print (metric + ': ' + scriptModule.METRICS[metric]);
|
||||
print ('# ' + scriptModule.METRICS[metric].description);
|
||||
print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
|
||||
}
|
||||
print ('------------------------------------------------------------');
|
||||
}
|
||||
@ -359,7 +371,12 @@ function runPerfScript(scriptModule, outputFile) {
|
||||
|
||||
_step(g,
|
||||
function() {
|
||||
_collect(scriptModule, outputFile);
|
||||
try {
|
||||
_collect(scriptModule, outputFile);
|
||||
} catch (err) {
|
||||
log("Script failed: " + err + "\n" + err.stack);
|
||||
Meta.exit(Meta.ExitCode.ERROR);
|
||||
}
|
||||
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||
},
|
||||
function(err) {
|
||||
|
@ -31,7 +31,7 @@ const SearchSystem = new Lang.Class({
|
||||
|
||||
this._registerProvider(new AppDisplay.AppSearchProvider());
|
||||
|
||||
this._searchSettings = new Gio.Settings({ schema: SEARCH_PROVIDERS_SCHEMA });
|
||||
this._searchSettings = new Gio.Settings({ schema_id: 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,6 +68,9 @@ 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() {
|
||||
@ -462,8 +465,14 @@ const GridSearchResults = new Lang.Class({
|
||||
Name: 'GridSearchResults',
|
||||
Extends: SearchResultsBase,
|
||||
|
||||
_init: function(provider) {
|
||||
_init: function(provider, parentContainer) {
|
||||
this.parent(provider);
|
||||
// We need to use the parent container to know how much results we can show.
|
||||
// None of the actors in this class can be used for that, since the main actor
|
||||
// goes hidden when no results are displayed, and then it lost its allocation.
|
||||
// Then on the next use of _getMaxDisplayedResults allocation is 0, en therefore
|
||||
// it doesn't show any result although we have some.
|
||||
this._parentContainer = parentContainer;
|
||||
|
||||
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
|
||||
xAlign: St.Align.START });
|
||||
@ -474,7 +483,9 @@ const GridSearchResults = new Lang.Class({
|
||||
},
|
||||
|
||||
_getMaxDisplayedResults: function() {
|
||||
return this._grid.columnsForWidth(this._bin.width) * this._grid.getRowLimit();
|
||||
let parentThemeNode = this._parentContainer.get_theme_node();
|
||||
let availableWidth = parentThemeNode.adjust_for_width(this._parentContainer.width);
|
||||
return this._grid.columnsForWidth(availableWidth) * this._grid.getRowLimit();
|
||||
},
|
||||
|
||||
_renderResults: function(metas) {
|
||||
@ -574,7 +585,7 @@ const SearchResults = new Lang.Class({
|
||||
if (provider.appInfo)
|
||||
providerDisplay = new ListSearchResults(provider);
|
||||
else
|
||||
providerDisplay = new GridSearchResults(provider);
|
||||
providerDisplay = new GridSearchResults(provider, this._content);
|
||||
|
||||
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||
this._content.add(providerDisplay.actor);
|
||||
|
@ -18,7 +18,6 @@ const _modes = {
|
||||
'restrictive': {
|
||||
parentMode: null,
|
||||
stylesheetName: 'gnome-shell.css',
|
||||
overridesSchema: 'org.gnome.shell.overrides',
|
||||
hasOverview: false,
|
||||
showCalendarEvents: false,
|
||||
allowSettings: false,
|
||||
@ -140,13 +139,14 @@ function _loadModes() {
|
||||
|
||||
function listModes() {
|
||||
_loadModes();
|
||||
Mainloop.idle_add(function() {
|
||||
let id = 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');
|
||||
}
|
||||
|
||||
|
@ -141,12 +141,7 @@ const GnomeShell = new Lang.Class({
|
||||
if (params['icon'])
|
||||
icon = Gio.Icon.new_for_string(params['icon']);
|
||||
|
||||
Main.osdWindow.setIcon(icon);
|
||||
Main.osdWindow.setMonitor (monitorIndex);
|
||||
Main.osdWindow.setLabel(params['label']);
|
||||
Main.osdWindow.setLevel(params['level']);
|
||||
|
||||
Main.osdWindow.show();
|
||||
Main.osdWindowManager.show(monitorIndex, icon, params['label'], params['level']);
|
||||
},
|
||||
|
||||
FocusApp: function(id) {
|
||||
|
@ -48,7 +48,7 @@ const ATIndicator = new Lang.Class({
|
||||
|
||||
this.actor.add_child(this._hbox);
|
||||
|
||||
this._a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
|
||||
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, Lang.bind(this, this._queueSyncMenuVisibility));
|
||||
|
||||
let highContrast = this._buildHCItem();
|
||||
@ -103,6 +103,7 @@ 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) {
|
||||
@ -117,7 +118,7 @@ const ATIndicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_buildItem: function(string, schema, key) {
|
||||
let settings = new Gio.Settings({ schema: schema });
|
||||
let settings = new Gio.Settings({ schema_id: schema });
|
||||
let widget = this._buildItemExtended(string,
|
||||
settings.get_boolean(key),
|
||||
settings.is_writable(key),
|
||||
@ -133,8 +134,8 @@ const ATIndicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_buildHCItem: function() {
|
||||
let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
|
||||
let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
|
||||
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
let wmSettings = new Gio.Settings({ schema_id: 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);
|
||||
@ -185,7 +186,7 @@ const ATIndicator = new Lang.Class({
|
||||
},
|
||||
|
||||
_buildFontItem: function() {
|
||||
let settings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
|
||||
let settings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||
|
||||
let factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||
let initial_setting = (factor > 1.0);
|
||||
|
@ -292,6 +292,10 @@ 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() {
|
||||
@ -361,18 +365,18 @@ const InputSourceIndicator = new Lang.Class({
|
||||
this._mruSources = [];
|
||||
this._keybindingAction =
|
||||
Main.wm.addKeybinding('switch-input-source',
|
||||
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
|
||||
new Gio.Settings({ schema_id: "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: "org.gnome.desktop.wm.keybindings" }),
|
||||
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
|
||||
Meta.KeyBindingFlags.REVERSES |
|
||||
Meta.KeyBindingFlags.REVERSED,
|
||||
Meta.KeyBindingFlags.IS_REVERSED,
|
||||
Shell.KeyBindingMode.ALL,
|
||||
Lang.bind(this, this._switchInputSource));
|
||||
this._settings = new Gio.Settings({ schema: DESKTOP_INPUT_SOURCES_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: 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));
|
||||
|
||||
|
@ -43,7 +43,7 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
this._settings = new Gio.Settings({ schema: LOCATION_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA });
|
||||
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
|
||||
Lang.bind(this, this._onMaxAccuracyLevelChanged));
|
||||
|
||||
@ -191,8 +191,12 @@ const Indicator = new Lang.Class({
|
||||
let unpacked = properties.deep_unpack();
|
||||
if ("InUse" in unpacked)
|
||||
this._syncIndicator();
|
||||
if ("AvailableAccuracyLevel" in unpacked)
|
||||
if ("AvailableAccuracyLevel" in unpacked) {
|
||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
||||
|
||||
if (this._getMaxAccuracyLevel() != 0)
|
||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -44,6 +44,33 @@ const NM80211Mode = NetworkManager['80211Mode'];
|
||||
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
||||
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
||||
|
||||
const PortalHelperResult = {
|
||||
CANCELLED: 0,
|
||||
COMPLETED: 1,
|
||||
RECHECK: 2
|
||||
};
|
||||
|
||||
const PortalHelperIface = '<node> \
|
||||
<interface name="org.gnome.Shell.PortalHelper"> \
|
||||
<method name="Authenticate"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
<arg type="s" direction="in" name="url" /> \
|
||||
<arg type="u" direction="in" name="timestamp" /> \
|
||||
</method> \
|
||||
<method name="Close"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
</method> \
|
||||
<method name="Refresh"> \
|
||||
<arg type="o" direction="in" name="connection" /> \
|
||||
</method> \
|
||||
<signal name="Done"> \
|
||||
<arg type="o" name="connection" /> \
|
||||
<arg type="u" name="result" /> \
|
||||
</signal> \
|
||||
</interface> \
|
||||
</node>';
|
||||
const PortalHelperProxy = Gio.DBusProxy.makeProxyWrapper(PortalHelperIface);
|
||||
|
||||
function ssidCompare(one, two) {
|
||||
if (!one || !two)
|
||||
return false;
|
||||
@ -207,13 +234,23 @@ const NMConnectionSection = new Lang.Class({
|
||||
this.item.menu.addMenuItem(this._labelSection);
|
||||
this.item.menu.addMenuItem(this._radioSection);
|
||||
|
||||
this.connect('icon-changed', Lang.bind(this, this._sync));
|
||||
this._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._notifyConnectivityId != 0) {
|
||||
this._client.disconnect(this._notifyConnectivityId);
|
||||
this._notifyConnectivityId = 0;
|
||||
}
|
||||
|
||||
this.item.destroy();
|
||||
},
|
||||
|
||||
_iconChanged: function() {
|
||||
this._sync();
|
||||
this.emit('icon-changed');
|
||||
},
|
||||
|
||||
_sync: function() {
|
||||
let nItems = this._connectionItems.size;
|
||||
|
||||
@ -278,7 +315,7 @@ const NMConnectionSection = new Lang.Class({
|
||||
return;
|
||||
|
||||
item.connect('icon-changed', Lang.bind(this, function() {
|
||||
this.emit('icon-changed');
|
||||
this._iconChanged();
|
||||
}));
|
||||
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
||||
this.emit('activation-failed', reason);
|
||||
@ -423,18 +460,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 +479,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';
|
||||
@ -523,7 +560,7 @@ const NMDeviceModem = new Lang.Class({
|
||||
if (this._mobileDevice) {
|
||||
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync));
|
||||
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
||||
this.emit('icon-changed');
|
||||
this._iconChanged();
|
||||
}));
|
||||
}
|
||||
},
|
||||
@ -1145,10 +1182,16 @@ const NMDeviceWireless = new Lang.Class({
|
||||
this._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._sync));
|
||||
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
||||
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||
this._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||
|
||||
this._sync();
|
||||
},
|
||||
|
||||
_iconChanged: function() {
|
||||
this._sync();
|
||||
this.emit('icon-changed');
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
if (this._activeApChangedId) {
|
||||
GObject.Object.prototype.disconnect.call(this._device, this._activeApChangedId);
|
||||
@ -1174,6 +1217,10 @@ const NMDeviceWireless = new Lang.Class({
|
||||
this._dialog.destroy();
|
||||
this._dialog = null;
|
||||
}
|
||||
if (this._notifyConnectivityId) {
|
||||
this._client.disconnect(this._notifyConnectivityId);
|
||||
this._notifyConnectivityId = 0;
|
||||
}
|
||||
|
||||
this.item.destroy();
|
||||
},
|
||||
@ -1211,7 +1258,7 @@ const NMDeviceWireless = new Lang.Class({
|
||||
},
|
||||
|
||||
_strengthChanged: function() {
|
||||
this.emit('icon-changed');
|
||||
this._iconChanged();
|
||||
},
|
||||
|
||||
_activeApChanged: function() {
|
||||
@ -1561,6 +1608,7 @@ const NMApplet = new Lang.Class({
|
||||
|
||||
this._activeConnections = [ ];
|
||||
this._connections = [ ];
|
||||
this._connectivityQueue = [ ];
|
||||
|
||||
this._mainConnection = null;
|
||||
this._mainConnectionIconChangedId = 0;
|
||||
@ -1589,6 +1637,7 @@ const NMApplet = new Lang.Class({
|
||||
this._client.connect('notify::primary-connection', Lang.bind(this, this._syncMainConnection));
|
||||
this._client.connect('notify::activating-connection', Lang.bind(this, this._syncMainConnection));
|
||||
this._client.connect('notify::active-connections', Lang.bind(this, this._syncVPNConnections));
|
||||
this._client.connect('notify::connectivity', Lang.bind(this, this._syncConnectivity));
|
||||
this._client.connect('device-added', Lang.bind(this, this._deviceAdded));
|
||||
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||
@ -1757,6 +1806,7 @@ const NMApplet = new Lang.Class({
|
||||
}
|
||||
|
||||
this._updateIcon();
|
||||
this._syncConnectivity();
|
||||
},
|
||||
|
||||
_syncVPNConnections: function() {
|
||||
@ -1862,6 +1912,97 @@ const NMApplet = new Lang.Class({
|
||||
_syncNMState: function() {
|
||||
this.indicators.visible = this._client.manager_running;
|
||||
this.menu.actor.visible = this._client.networking_enabled;
|
||||
|
||||
this._syncConnectivity();
|
||||
},
|
||||
|
||||
_flushConnectivityQueue: function() {
|
||||
if (this._portalHelperProxy) {
|
||||
for (let item of this._connectivityQueue)
|
||||
this._portalHelperProxy.CloseRemote(item);
|
||||
}
|
||||
|
||||
this._connectivityQueue = [];
|
||||
},
|
||||
|
||||
_closeConnectivityCheck: function(path) {
|
||||
let index = this._connectivityQueue.indexOf(path);
|
||||
|
||||
if (index >= 0) {
|
||||
if (this._portalHelperProxy)
|
||||
this._portalHelperProxy.CloseRemote(path);
|
||||
|
||||
this._connectivityQueue.splice(index, 1);
|
||||
}
|
||||
},
|
||||
|
||||
_portalHelperDone: function(proxy, emitter, parameters) {
|
||||
let [path, result] = parameters;
|
||||
|
||||
if (result == PortalHelperResult.CANCELLED) {
|
||||
// Keep the connection in the queue, so the user is not
|
||||
// spammed with more logins until we next flush the queue,
|
||||
// which will happen once he chooses a better connection
|
||||
// or we get to full connectivity through other means
|
||||
} else if (result == PortalHelperResult.COMPLETED) {
|
||||
this._closeConnectivityCheck(path);
|
||||
return;
|
||||
} else if (result == PortalHelperResult.RECHECK) {
|
||||
this._client.check_connectivity_async(null, Lang.bind(this, function(client, result) {
|
||||
try {
|
||||
let state = client.check_connectivity_finish(result);
|
||||
if (state >= NetworkManager.ConnectivityState.FULL)
|
||||
this._closeConnectivityCheck(path);
|
||||
} catch(e) { }
|
||||
}));
|
||||
} else {
|
||||
log('Invalid result from portal helper: ' + result);
|
||||
}
|
||||
},
|
||||
|
||||
_syncConnectivity: function() {
|
||||
if (this._mainConnection == null ||
|
||||
this._mainConnection.state != NetworkManager.ActiveConnectionState.ACTIVATED) {
|
||||
this._flushConnectivityQueue();
|
||||
return;
|
||||
}
|
||||
|
||||
let isPortal = this._client.connectivity == NetworkManager.ConnectivityState.PORTAL;
|
||||
// For testing, allow interpreting any value != FULL as PORTAL, because
|
||||
// LIMITED (no upstream route after the default gateway) is easy to obtain
|
||||
// with a tethered phone
|
||||
// NONE is also possible, with a connection configured to force no default route
|
||||
// (but in general we should only prompt a portal if we know there is a portal)
|
||||
if (GLib.getenv('GNOME_SHELL_CONNECTIVITY_TEST') != null)
|
||||
isPortal = isPortal || this._client.connectivity < NetworkManager.ConnectivityState.FULL;
|
||||
if (!isPortal)
|
||||
return;
|
||||
|
||||
let path = this._mainConnection.get_path();
|
||||
for (let item of this._connectivityQueue) {
|
||||
if (item == path)
|
||||
return;
|
||||
}
|
||||
|
||||
let timestamp = global.get_current_time();
|
||||
if (this._portalHelperProxy) {
|
||||
this._portalHelperProxy.AuthenticateRemote(path, '', timestamp);
|
||||
} else {
|
||||
new PortalHelperProxy(Gio.DBus.session, 'org.gnome.Shell.PortalHelper',
|
||||
'/org/gnome/Shell/PortalHelper', Lang.bind(this, function (proxy, error) {
|
||||
if (error) {
|
||||
log('Error launching the portal helper: ' + error);
|
||||
return;
|
||||
}
|
||||
|
||||
this._portalHelperProxy = proxy;
|
||||
proxy.connectSignal('Done', Lang.bind(this, this._portalHelperDone));
|
||||
|
||||
proxy.AuthenticateRemote(path, '', timestamp);
|
||||
}));
|
||||
}
|
||||
|
||||
this._connectivityQueue.push(path);
|
||||
},
|
||||
|
||||
_updateIcon: function() {
|
||||
|
@ -4,6 +4,7 @@ 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;
|
||||
|
||||
@ -83,10 +84,18 @@ 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._proxy.AirplaneMode = false;
|
||||
this._manager.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() {
|
||||
|
@ -56,7 +56,10 @@ 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.
|
||||
@ -92,11 +95,11 @@ const Indicator = new Lang.Class({
|
||||
_init: function() {
|
||||
this.parent();
|
||||
|
||||
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._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._session = new GnomeSession.SessionManager();
|
||||
this._loginManager = LoginManager.getLoginManager();
|
||||
@ -148,11 +151,11 @@ const Indicator = new Lang.Class({
|
||||
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
||||
Gio.BusNameWatcherFlags.NONE,
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = true;
|
||||
this._orientationExists = true;
|
||||
this._updateOrientationLock();
|
||||
}),
|
||||
Lang.bind(this, function() {
|
||||
this._orentationExists = false;
|
||||
this._orientationExists = false;
|
||||
this._updateOrientationLock();
|
||||
}));
|
||||
this._updateOrientationLock();
|
||||
|
@ -161,11 +161,12 @@ const SwitcherPopup = new Lang.Class({
|
||||
// disturbed by the popup briefly flashing.
|
||||
this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
|
||||
Lang.bind(this, function () {
|
||||
Main.osdWindow.cancel();
|
||||
Main.osdWindowManager.hideAll();
|
||||
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;
|
||||
},
|
||||
|
||||
@ -189,10 +190,11 @@ 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;
|
||||
},
|
||||
@ -250,6 +252,7 @@ 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() {
|
||||
|
@ -62,7 +62,7 @@ const UnlockDialog = new Lang.Class({
|
||||
|
||||
this.allowCancel = false;
|
||||
|
||||
let screenSaverSettings = new Gio.Settings({ schema: 'org.gnome.desktop.screensaver' });
|
||||
let screenSaverSettings = new Gio.Settings({ schema_id: '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' });
|
||||
|
@ -49,6 +49,139 @@ function getTermsForSearchString(searchString) {
|
||||
return terms;
|
||||
}
|
||||
|
||||
const EDGE_THRESHOLD = 20;
|
||||
const DRAG_DISTANCE = 80;
|
||||
|
||||
const EdgeDragAction = new Lang.Class({
|
||||
Name: 'EdgeDragAction',
|
||||
Extends: Clutter.GestureAction,
|
||||
|
||||
_init : function(side) {
|
||||
this.parent();
|
||||
this._side = side;
|
||||
this.set_n_touch_points(1);
|
||||
|
||||
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}));
|
||||
},
|
||||
|
||||
_getMonitorRect : function (x, y) {
|
||||
let rect = new Meta.Rectangle({ x: x - 1, y: y - 1, width: 1, height: 1 });
|
||||
let monitorIndex = global.screen.get_monitor_index_for_rect(rect);
|
||||
|
||||
return global.screen.get_monitor_geometry(monitorIndex);
|
||||
},
|
||||
|
||||
vfunc_gesture_prepare : function(action, actor) {
|
||||
if (this.get_n_current_points() == 0)
|
||||
return false;
|
||||
|
||||
let [x, y] = this.get_press_coords(0);
|
||||
let monitorRect = this._getMonitorRect(x, y);
|
||||
|
||||
return ((this._side == St.Side.LEFT && x < monitorRect.x + EDGE_THRESHOLD) ||
|
||||
(this._side == St.Side.RIGHT && x > monitorRect.x + monitorRect.width - EDGE_THRESHOLD) ||
|
||||
(this._side == St.Side.TOP && y < monitorRect.y + EDGE_THRESHOLD) ||
|
||||
(this._side == St.Side.BOTTOM && y > monitorRect.y + monitorRect.height - EDGE_THRESHOLD));
|
||||
},
|
||||
|
||||
vfunc_gesture_progress : function (action, actor) {
|
||||
let [startX, startY] = this.get_press_coords(0);
|
||||
let [x, y] = this.get_motion_coords(0);
|
||||
let offsetX = Math.abs (x - startX);
|
||||
let offsetY = Math.abs (y - startY);
|
||||
|
||||
if (offsetX < EDGE_THRESHOLD && offsetY < EDGE_THRESHOLD)
|
||||
return true;
|
||||
|
||||
if ((offsetX > offsetY &&
|
||||
(this._side == St.Side.TOP || this._side == St.Side.BOTTOM)) ||
|
||||
(offsetY > offsetX &&
|
||||
(this._side == St.Side.LEFT || this._side == St.Side.RIGHT))) {
|
||||
this.cancel();
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
vfunc_gesture_end : function (action, actor) {
|
||||
let [startX, startY] = this.get_press_coords(0);
|
||||
let [x, y] = this.get_motion_coords(0);
|
||||
let monitorRect = this._getMonitorRect(startX, startY);
|
||||
|
||||
if ((this._side == St.Side.TOP && y > monitorRect.y + DRAG_DISTANCE) ||
|
||||
(this._side == St.Side.BOTTOM && y < monitorRect.y + monitorRect.height - DRAG_DISTANCE) ||
|
||||
(this._side == St.Side.LEFT && x > monitorRect.x + DRAG_DISTANCE) ||
|
||||
(this._side == St.Side.RIGHT && x < monitorRect.x + monitorRect.width - DRAG_DISTANCE))
|
||||
this.emit('activated');
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(EdgeDragAction.prototype);
|
||||
|
||||
const ShowOverviewAction = new Lang.Class({
|
||||
Name: 'ShowOverviewAction',
|
||||
Extends: Clutter.GestureAction,
|
||||
|
||||
_init : function() {
|
||||
this.parent();
|
||||
this.set_n_touch_points(3);
|
||||
|
||||
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}));
|
||||
},
|
||||
|
||||
vfunc_gesture_prepare : function(action, actor) {
|
||||
return this.get_n_current_points() == this.get_n_touch_points();
|
||||
},
|
||||
|
||||
_getBoundingRect : function(motion) {
|
||||
let minX, minY, maxX, maxY;
|
||||
|
||||
for (let i = 0; i < this.get_n_current_points(); i++) {
|
||||
let x, y;
|
||||
|
||||
if (motion == true) {
|
||||
[x, y] = this.get_motion_coords(i);
|
||||
} else {
|
||||
[x, y] = this.get_press_coords(i);
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
minX = maxX = x;
|
||||
minY = maxY = y;
|
||||
} else {
|
||||
minX = Math.min(minX, x);
|
||||
minY = Math.min(minY, y);
|
||||
maxX = Math.max(maxX, x);
|
||||
maxY = Math.max(maxY, y);
|
||||
}
|
||||
}
|
||||
|
||||
return new Meta.Rectangle({ x: minX,
|
||||
y: minY,
|
||||
width: maxX - minX,
|
||||
height: maxY - minY });
|
||||
},
|
||||
|
||||
vfunc_gesture_begin : function(action, actor) {
|
||||
this._initialRect = this._getBoundingRect(false);
|
||||
return true;
|
||||
},
|
||||
|
||||
vfunc_gesture_end : function(action, actor) {
|
||||
let rect = this._getBoundingRect(true);
|
||||
let oldArea = this._initialRect.width * this._initialRect.height;
|
||||
let newArea = rect.width * rect.height;
|
||||
let areaDiff = newArea / oldArea;
|
||||
|
||||
this.emit('activated', areaDiff);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(ShowOverviewAction.prototype);
|
||||
|
||||
const ViewSelector = new Lang.Class({
|
||||
Name: 'ViewSelector',
|
||||
|
||||
@ -83,10 +216,10 @@ const ViewSelector = new Lang.Class({
|
||||
icon_name: 'edit-find-symbolic' }));
|
||||
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear-rtl-symbolic' });
|
||||
icon_name: 'edit-clear-symbolic-rtl' });
|
||||
else
|
||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||
icon_name: 'edit-clear-symbolic' });
|
||||
icon_name: 'edit-clear-symbolic-ltr' });
|
||||
|
||||
this._iconClickedId = 0;
|
||||
this._capturedEventId = 0;
|
||||
@ -132,19 +265,36 @@ const ViewSelector = new Lang.Class({
|
||||
}));
|
||||
|
||||
Main.wm.addKeybinding('toggle-application-view',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: 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: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.OVERVIEW,
|
||||
Lang.bind(Main.overview, Main.overview.toggle));
|
||||
|
||||
let gesture;
|
||||
|
||||
gesture = new EdgeDragAction(St.Side.LEFT);
|
||||
gesture.connect('activated', Lang.bind(this, function() {
|
||||
if (Main.overview.visible)
|
||||
Main.overview.hide();
|
||||
else
|
||||
this.showApps();
|
||||
}));
|
||||
global.stage.add_action(gesture);
|
||||
|
||||
gesture = new ShowOverviewAction();
|
||||
gesture.connect('activated', Lang.bind(this, function(action, areaDiff) {
|
||||
if (areaDiff < 0.7)
|
||||
Main.overview.show();
|
||||
}));
|
||||
global.stage.add_action(gesture);
|
||||
},
|
||||
|
||||
_toggleAppsPage: function() {
|
||||
@ -282,13 +432,13 @@ const ViewSelector = new Lang.Class({
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (this._shouldTriggerSearch(symbol)) {
|
||||
this.startSearch(event);
|
||||
} else if (!this._searchActive) {
|
||||
} else if (!this._searchActive && !global.stage.key_focus) {
|
||||
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||
return true;
|
||||
return Clutter.EVENT_STOP;
|
||||
} else if (symbol == Clutter.ISO_Left_Tab) {
|
||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
|
||||
return true;
|
||||
return Clutter.EVENT_STOP;
|
||||
}
|
||||
}
|
||||
return Clutter.EVENT_PROPAGATE;
|
||||
@ -358,7 +508,10 @@ const ViewSelector = new Lang.Class({
|
||||
|
||||
startSearch: function(event) {
|
||||
global.stage.set_key_focus(this._text);
|
||||
this._text.event(event, true);
|
||||
|
||||
let synthEvent = event.copy();
|
||||
synthEvent.set_source(this._text);
|
||||
this._text.event(synthEvent, true);
|
||||
},
|
||||
|
||||
// the entry does not show the hint
|
||||
@ -383,9 +536,11 @@ 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);
|
||||
|
@ -9,12 +9,14 @@ const Meta = imports.gi.Meta;
|
||||
const Pango = imports.gi.Pango;
|
||||
const St = imports.gi.St;
|
||||
const Shell = imports.gi.Shell;
|
||||
const Signals = imports.signals;
|
||||
|
||||
const AltTab = imports.ui.altTab;
|
||||
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;
|
||||
@ -82,6 +84,7 @@ 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) {
|
||||
@ -197,12 +200,19 @@ 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 = new Gio.Settings({ schema: Main.dynamicWorkspacesSchema });
|
||||
this._workspaceSettings = this._getWorkspaceSettings();
|
||||
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 = [];
|
||||
@ -271,18 +281,20 @@ 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();
|
||||
Mainloop.timeout_add(LAST_WINDOW_GRACE_TIME, Lang.bind(this, function() {
|
||||
let id = 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) {
|
||||
@ -445,6 +457,115 @@ const TilePreview = new Lang.Class({
|
||||
}
|
||||
});
|
||||
|
||||
const WorkspaceSwitchAction = new Lang.Class({
|
||||
Name: 'WorkspaceSwitchAction',
|
||||
Extends: Clutter.GestureAction,
|
||||
|
||||
_init : function() {
|
||||
this.parent();
|
||||
this.set_n_touch_points(4);
|
||||
|
||||
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}));
|
||||
},
|
||||
|
||||
vfunc_gesture_prepare : function(action, actor) {
|
||||
return this.get_n_current_points() == this.get_n_touch_points();
|
||||
},
|
||||
|
||||
vfunc_gesture_end : function(action, actor) {
|
||||
const MOTION_THRESHOLD = 50;
|
||||
|
||||
// Just check one touchpoint here
|
||||
let [startX, startY] = this.get_press_coords(0);
|
||||
let [x, y] = this.get_motion_coords(0);
|
||||
let offsetX = x - startX;
|
||||
let offsetY = y - startY;
|
||||
let direction;
|
||||
|
||||
if (Math.abs(offsetX) < MOTION_THRESHOLD &&
|
||||
Math.abs(offsetY) < MOTION_THRESHOLD)
|
||||
return;
|
||||
|
||||
if (Math.abs(offsetY) > Math.abs(offsetX)) {
|
||||
if (offsetY > 0)
|
||||
direction = Meta.MotionDirection.UP;
|
||||
else
|
||||
direction = Meta.MotionDirection.DOWN;
|
||||
} else {
|
||||
if (offsetX > 0)
|
||||
direction = Meta.MotionDirection.LEFT;
|
||||
else
|
||||
direction = Meta.MotionDirection.RIGHT;
|
||||
}
|
||||
|
||||
this.emit('activated', direction);
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(WorkspaceSwitchAction.prototype);
|
||||
|
||||
const AppSwitchAction = new Lang.Class({
|
||||
Name: 'AppSwitchAction',
|
||||
Extends: Clutter.GestureAction,
|
||||
|
||||
_init : function() {
|
||||
this.parent();
|
||||
this.set_n_touch_points(3);
|
||||
|
||||
global.display.connect('grab-op-begin', Lang.bind(this, function() {
|
||||
this.cancel();
|
||||
}));
|
||||
},
|
||||
|
||||
vfunc_gesture_prepare : function(action, actor) {
|
||||
return this.get_n_current_points() <= 4;
|
||||
},
|
||||
|
||||
vfunc_gesture_begin : function(action, actor) {
|
||||
// in milliseconds
|
||||
const LONG_PRESS_TIMEOUT = 250;
|
||||
|
||||
let nPoints = this.get_n_current_points();
|
||||
let event = this.get_last_event (nPoints - 1);
|
||||
|
||||
if (nPoints == 3)
|
||||
this._longPressStartTime = event.get_time();
|
||||
else if (nPoints == 4) {
|
||||
// Check whether the 4th finger press happens after a 3-finger long press,
|
||||
// this only needs to be checked on the first 4th finger press
|
||||
if (this._longPressStartTime != null &&
|
||||
event.get_time() < this._longPressStartTime + LONG_PRESS_TIMEOUT)
|
||||
this.cancel();
|
||||
else {
|
||||
this._longPressStartTime = null;
|
||||
this.emit('activated');
|
||||
}
|
||||
}
|
||||
|
||||
return this.get_n_current_points() <= 4;
|
||||
},
|
||||
|
||||
vfunc_gesture_progress : function(action, actor) {
|
||||
const MOTION_THRESHOLD = 30;
|
||||
|
||||
if (this.get_n_current_points() == 3) {
|
||||
for (let i = 0; i < this.get_n_current_points(); i++) {
|
||||
[startX, startY] = this.get_press_coords(i);
|
||||
[x, y] = this.get_motion_coords(i);
|
||||
|
||||
if (Math.abs(x - startX) > MOTION_THRESHOLD ||
|
||||
Math.abs(y - startY) > MOTION_THRESHOLD)
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
});
|
||||
Signals.addSignalMethods(AppSwitchAction.prototype);
|
||||
|
||||
const WindowManager = new Lang.Class({
|
||||
Name: 'WindowManager',
|
||||
|
||||
@ -460,8 +581,6 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
this._dimmedWindows = [];
|
||||
|
||||
this._animationBlockCount = 0;
|
||||
|
||||
this._allowedKeybindings = {};
|
||||
|
||||
this._switchData = null;
|
||||
@ -477,6 +596,7 @@ 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));
|
||||
@ -504,6 +624,10 @@ 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,
|
||||
@ -604,6 +728,9 @@ 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));
|
||||
@ -638,13 +765,13 @@ const WindowManager = new Lang.Class({
|
||||
Lang.bind(this, this._startA11ySwitcher));
|
||||
|
||||
this.addKeybinding('pause-resume-tweens',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.KeyBindingMode.ALL,
|
||||
Lang.bind(this, this._toggleTweens));
|
||||
|
||||
this.addKeybinding('open-application-menu',
|
||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||
Meta.KeyBindingFlags.NONE,
|
||||
Shell.KeyBindingMode.NORMAL |
|
||||
Shell.KeyBindingMode.TOPBAR_POPUP,
|
||||
@ -659,11 +786,60 @@ const WindowManager = new Lang.Class({
|
||||
this._dimWindow(this._dimmedWindows[i]);
|
||||
}));
|
||||
|
||||
this._windowMenuManager = new WindowMenu.WindowMenuManager();
|
||||
|
||||
if (Main.sessionMode.hasWorkspaces)
|
||||
this._workspaceTracker = new WorkspaceTracker(this);
|
||||
|
||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||
false, -1, 1);
|
||||
|
||||
let gesture = new WorkspaceSwitchAction();
|
||||
gesture.connect('activated', Lang.bind(this, function(action, direction) {
|
||||
let newWs = global.screen.get_active_workspace().get_neighbor(direction);
|
||||
this.actionMoveWorkspace(newWs);
|
||||
}));
|
||||
global.stage.add_action(gesture);
|
||||
|
||||
gesture = new AppSwitchAction();
|
||||
gesture.connect('activated', Lang.bind(this, this._switchApp));
|
||||
global.stage.add_action(gesture);
|
||||
},
|
||||
|
||||
_lookupIndex: function (windows, metaWindow) {
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
if (windows[i].metaWindow == metaWindow) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
},
|
||||
|
||||
_switchApp : function () {
|
||||
let windows = global.get_window_actors().filter(Lang.bind(this, function(actor) {
|
||||
let win = actor.metaWindow;
|
||||
return (!win.is_override_redirect() &&
|
||||
win.located_on_workspace(global.screen.get_active_workspace()));
|
||||
}));
|
||||
|
||||
if (windows.length == 0)
|
||||
return;
|
||||
|
||||
let focusWindow = global.display.focus_window;
|
||||
let nextWindow;
|
||||
|
||||
if (focusWindow == null)
|
||||
nextWindow = windows[0].metaWindow;
|
||||
else {
|
||||
let index = this._lookupIndex (windows, focusWindow) + 1;
|
||||
|
||||
if (index >= windows.length)
|
||||
index = 0;
|
||||
|
||||
nextWindow = windows[index].metaWindow;
|
||||
}
|
||||
|
||||
Main.activateWindow(nextWindow);
|
||||
},
|
||||
|
||||
keepWorkspaceAlive: function(workspace, duration) {
|
||||
@ -694,16 +870,8 @@ 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 || this._animationBlockCount > 0);
|
||||
return !Main.overview.visible;
|
||||
},
|
||||
|
||||
_shouldAnimateActor: function(actor) {
|
||||
@ -892,7 +1060,7 @@ const WindowManager = new Lang.Class({
|
||||
/* Scale the window from the center of the parent */
|
||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||
actor.set_scale(1.0, 0.0);
|
||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
||||
actor.set_pivot_point(0.5, 0.5);
|
||||
actor.show();
|
||||
this._mapping.push(actor);
|
||||
|
||||
@ -966,7 +1134,7 @@ const WindowManager = new Lang.Class({
|
||||
this._checkDimming(parent, window);
|
||||
|
||||
actor.set_scale(1.0, 1.0);
|
||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
||||
actor.set_pivot_point(0.5, 0.5);
|
||||
actor.show();
|
||||
|
||||
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
||||
@ -1149,6 +1317,10 @@ 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)
|
||||
@ -1205,7 +1377,10 @@ const WindowManager = new Lang.Class({
|
||||
let newWs;
|
||||
let direction;
|
||||
|
||||
if (isNaN(target)) {
|
||||
if (target == 'last') {
|
||||
direction = Meta.MotionDirection.DOWN;
|
||||
newWs = screen.get_workspace_by_index(screen.n_workspaces - 1);
|
||||
} else if (isNaN(target)) {
|
||||
direction = Meta.MotionDirection[target.toUpperCase()];
|
||||
newWs = screen.get_active_workspace().get_neighbor(direction);
|
||||
} else if (target > 0) {
|
||||
|
185
js/ui/windowMenu.js
Normal file
185
js/ui/windowMenu.js
Normal file
@ -0,0 +1,185 @@
|
||||
// -*- 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();
|
||||
}));
|
||||
}
|
||||
});
|
@ -67,7 +67,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_input_rect();
|
||||
let inputRect = window.get_buffer_rect();
|
||||
|
||||
let box = new Clutter.ActorBox();
|
||||
|
||||
@ -200,6 +200,10 @@ 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() {
|
||||
@ -235,6 +239,14 @@ const WindowClone = new Lang.Class({
|
||||
return this._boundingBox;
|
||||
},
|
||||
|
||||
get width() {
|
||||
return this._boundingBox.width;
|
||||
},
|
||||
|
||||
get height() {
|
||||
return this._boundingBox.height;
|
||||
},
|
||||
|
||||
getOriginalPosition: function() {
|
||||
return [this._boundingBox.x, this._boundingBox.y];
|
||||
},
|
||||
@ -253,7 +265,8 @@ const WindowClone = new Lang.Class({
|
||||
rect = rect.union(metaWindow.get_outer_rect());
|
||||
}, this);
|
||||
|
||||
this._boundingBox = rect;
|
||||
// Convert from a MetaRectangle to a native JS object
|
||||
this._boundingBox = { x: rect.x, y: rect.y, width: rect.width, height: rect.height };
|
||||
this.actor.layout_manager.boundingBox = rect;
|
||||
},
|
||||
|
||||
@ -582,7 +595,8 @@ const WindowOverlay = new Lang.Class({
|
||||
},
|
||||
|
||||
_windowCanClose: function() {
|
||||
return this._windowClone.metaWindow.can_close();
|
||||
return this._windowClone.metaWindow.can_close() &&
|
||||
!this._windowClone.hasAttachedDialogs();
|
||||
},
|
||||
|
||||
_onWindowAdded: function(workspace, win) {
|
||||
@ -594,11 +608,12 @@ const WindowOverlay = new Lang.Class({
|
||||
|
||||
// use an idle handler to avoid mapping problems -
|
||||
// see comment in Workspace._windowAdded
|
||||
Mainloop.idle_add(Lang.bind(this,
|
||||
function() {
|
||||
this._windowClone.emit('selected');
|
||||
return GLib.SOURCE_REMOVE;
|
||||
}));
|
||||
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');
|
||||
}
|
||||
},
|
||||
|
||||
@ -669,8 +684,10 @@ 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;
|
||||
},
|
||||
|
||||
@ -824,7 +841,7 @@ const LayoutStrategy = new Lang.Class({
|
||||
// thumbnails is much more important to preserve than the width of
|
||||
// them, so two windows with equal height, but maybe differering
|
||||
// widths line up.
|
||||
let ratio = window.actor.height / this._monitor.height;
|
||||
let ratio = window.height / this._monitor.height;
|
||||
|
||||
// The purpose of this manipulation here is to prevent windows
|
||||
// from getting too small. For something like a calculator window,
|
||||
@ -926,11 +943,11 @@ const LayoutStrategy = new Lang.Class({
|
||||
let window = row.windows[j];
|
||||
|
||||
let s = scale * this._computeWindowScale(window) * row.additionalScale;
|
||||
let cellWidth = window.actor.width * s;
|
||||
let cellHeight = window.actor.height * s;
|
||||
let cellWidth = window.width * s;
|
||||
let cellHeight = window.height * s;
|
||||
|
||||
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
||||
let cloneWidth = window.actor.width * s;
|
||||
let cloneWidth = window.width * s;
|
||||
|
||||
let cloneX = x + (cellWidth - cloneWidth) / 2;
|
||||
let cloneY = row.y + row.height - cellHeight;
|
||||
@ -984,7 +1001,7 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
for (let i = 0; i < windows.length; i++) {
|
||||
let window = windows[i];
|
||||
let s = this._computeWindowScale(window);
|
||||
totalWidth += window.actor.width * s;
|
||||
totalWidth += window.width * s;
|
||||
}
|
||||
|
||||
let idealRowWidth = totalWidth / numRows;
|
||||
@ -997,8 +1014,8 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
||||
for (; windowIdx < windows.length; windowIdx++) {
|
||||
let window = windows[windowIdx];
|
||||
let s = this._computeWindowScale(window);
|
||||
let width = window.actor.width * s;
|
||||
let height = window.actor.height * s;
|
||||
let width = window.width * s;
|
||||
let height = window.height * s;
|
||||
row.fullHeight = Math.max(row.fullHeight, height);
|
||||
|
||||
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
||||
@ -1123,6 +1140,11 @@ const Workspace = new Lang.Class({
|
||||
|
||||
this._positionWindowsFlags = 0;
|
||||
this._positionWindowsId = 0;
|
||||
|
||||
this.actor.connect('notify::mapped', Lang.bind(this, function() {
|
||||
if (this.actor.mapped)
|
||||
this._syncActualGeometry();
|
||||
}));
|
||||
},
|
||||
|
||||
setFullGeometry: function(geom) {
|
||||
@ -1130,7 +1152,9 @@ const Workspace = new Lang.Class({
|
||||
return;
|
||||
|
||||
this._fullGeometry = geom;
|
||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||
|
||||
if (this.actor.mapped)
|
||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||
},
|
||||
|
||||
setActualGeometry: function(geom) {
|
||||
@ -1138,18 +1162,29 @@ const Workspace = new Lang.Class({
|
||||
return;
|
||||
|
||||
this._actualGeometry = geom;
|
||||
this._actualGeometryDirty = true;
|
||||
|
||||
if (this._actualGeometryLater)
|
||||
if (this.actor.mapped)
|
||||
this._syncActualGeometry();
|
||||
},
|
||||
|
||||
_syncActualGeometry: function() {
|
||||
if (this._actualGeometryLater || !this._actualGeometryDirty)
|
||||
return;
|
||||
if (!this._actualGeometry)
|
||||
return;
|
||||
|
||||
this._actualGeometryLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
||||
this._actualGeometryLater = 0;
|
||||
if (!this.actor.mapped)
|
||||
return false;
|
||||
|
||||
let geom = this._actualGeometry;
|
||||
|
||||
this._dropRect.set_position(geom.x, geom.y);
|
||||
this._dropRect.set_size(geom.width, geom.height);
|
||||
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
||||
|
||||
this._actualGeometryLater = 0;
|
||||
return false;
|
||||
}));
|
||||
},
|
||||
@ -1223,6 +1258,12 @@ const Workspace = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
|
||||
// We will reposition windows when enter again overview anyway.
|
||||
// In this way we avoid unwanted animations of windows repositioning while
|
||||
// animating overview
|
||||
if (this.leavingOverview)
|
||||
return;
|
||||
|
||||
let initialPositioning = flags & WindowPositionFlags.INITIAL;
|
||||
let animate = flags & WindowPositionFlags.ANIMATE;
|
||||
|
||||
@ -1418,6 +1459,7 @@ 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) {
|
||||
@ -1429,14 +1471,15 @@ const Workspace = new Lang.Class({
|
||||
if (!win) {
|
||||
// Newly-created windows are added to a workspace before
|
||||
// the compositor finds out about them...
|
||||
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;
|
||||
}));
|
||||
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');
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -52,6 +52,7 @@ 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) {
|
||||
@ -145,6 +146,7 @@ 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();
|
||||
},
|
||||
|
||||
|
@ -386,14 +386,15 @@ const WorkspaceThumbnail = new Lang.Class({
|
||||
if (!win) {
|
||||
// Newly-created windows are added to a workspace before
|
||||
// the compositor finds out about them...
|
||||
Mainloop.idle_add(Lang.bind(this,
|
||||
function () {
|
||||
let id = 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;
|
||||
}
|
||||
|
||||
@ -664,7 +665,7 @@ const ThumbnailsBox = new Lang.Class({
|
||||
Main.overview.connect('window-drag-cancelled',
|
||||
Lang.bind(this, this._onDragCancelled));
|
||||
|
||||
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||
this._settings.connect('changed::dynamic-workspaces',
|
||||
Lang.bind(this, this._updateSwitcherVisibility));
|
||||
},
|
||||
@ -825,10 +826,14 @@ 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
|
||||
@ -902,7 +907,10 @@ const ThumbnailsBox = new Lang.Class({
|
||||
},
|
||||
|
||||
_workspacesChanged: function() {
|
||||
let oldNumWorkspaces = this._thumbnails.length;
|
||||
let validThumbnails = this._thumbnails.filter(function(t) {
|
||||
return t.state <= ThumbnailState.NORMAL;
|
||||
});
|
||||
let oldNumWorkspaces = validThumbnails.length;
|
||||
let newNumWorkspaces = global.screen.n_workspaces;
|
||||
let active = global.screen.get_active_workspace_index();
|
||||
|
||||
|
@ -74,12 +74,12 @@ const WorkspacesViewBase = new Lang.Class({
|
||||
|
||||
setFullGeometry: function(geom) {
|
||||
this._fullGeometry = geom;
|
||||
this._syncGeometry();
|
||||
this._syncFullGeometry();
|
||||
},
|
||||
|
||||
setActualGeometry: function(geom) {
|
||||
this._actualGeometry = geom;
|
||||
this._syncGeometry();
|
||||
this._syncActualGeometry();
|
||||
},
|
||||
});
|
||||
|
||||
@ -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: OVERRIDE_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||
|
||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||
@ -127,9 +127,12 @@ const WorkspacesView = new Lang.Class({
|
||||
this._workspaces[i].setReservedSlot(clone);
|
||||
},
|
||||
|
||||
_syncGeometry: function() {
|
||||
_syncFullGeometry: function() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||
},
|
||||
|
||||
_syncActualGeometry: function() {
|
||||
for (let i = 0; i < this._workspaces.length; i++)
|
||||
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
||||
},
|
||||
@ -260,10 +263,12 @@ const WorkspacesView = new Lang.Class({
|
||||
}
|
||||
}
|
||||
|
||||
if (this._fullGeometry)
|
||||
if (this._fullGeometry) {
|
||||
this._updateWorkspaceActors(false);
|
||||
|
||||
this._syncGeometry();
|
||||
this._syncFullGeometry();
|
||||
}
|
||||
if (this._actualGeometry)
|
||||
this._syncActualGeometry();
|
||||
},
|
||||
|
||||
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
||||
@ -352,8 +357,11 @@ const ExtraWorkspaceView = new Lang.Class({
|
||||
this._workspace.setReservedSlot(clone);
|
||||
},
|
||||
|
||||
_syncGeometry: function() {
|
||||
_syncFullGeometry: function() {
|
||||
this._workspace.setFullGeometry(this._fullGeometry);
|
||||
},
|
||||
|
||||
_syncActualGeometry: function() {
|
||||
this._workspace.setActualGeometry(this._actualGeometry);
|
||||
},
|
||||
|
||||
@ -429,7 +437,7 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
this._workspacesViews = [];
|
||||
this._primaryScrollAdjustment = null;
|
||||
|
||||
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
|
||||
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||
this._settings.connect('changed::workspaces-only-on-primary',
|
||||
Lang.bind(this,
|
||||
this._workspacesOnlyOnPrimaryChanged));
|
||||
@ -598,8 +606,9 @@ const WorkspacesDisplay = new Lang.Class({
|
||||
return;
|
||||
|
||||
let [x, y] = this.actor.get_transformed_position();
|
||||
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
|
||||
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
|
||||
let allocation = this.actor.allocation;
|
||||
let width = allocation.x2 - allocation.x1;
|
||||
let height = allocation.y2 - allocation.y1;
|
||||
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
||||
|
||||
let monitors = Main.layoutManager.monitors;
|
||||
|
@ -33,6 +33,7 @@ id
|
||||
it
|
||||
ja
|
||||
kk
|
||||
km
|
||||
kn
|
||||
ko
|
||||
ku
|
||||
|
@ -6,11 +6,13 @@ data/gnome-shell.desktop.in.in
|
||||
data/gnome-shell-extension-prefs.desktop.in.in
|
||||
data/gnome-shell-wayland.desktop.in.in
|
||||
data/org.gnome.shell.gschema.xml.in.in
|
||||
data/org.gnome.Shell.PortalHelper.desktop.in
|
||||
js/extensionPrefs/main.js
|
||||
js/gdm/authPrompt.js
|
||||
js/gdm/loginDialog.js
|
||||
js/gdm/util.js
|
||||
js/misc/util.js
|
||||
js/portalHelper/main.js
|
||||
js/ui/appDisplay.js
|
||||
js/ui/appFavorites.js
|
||||
js/ui/backgroundMenu.js
|
||||
@ -55,6 +57,7 @@ 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
|
||||
|
316
po/be.po
316
po/be.po
@ -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-02-22 08:29+0000\n"
|
||||
"POT-Creation-Date: 2014-04-30 19:59+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,10 +228,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 ""
|
||||
"Настройка максімальнай дакладнасці вызначэння месцапалажэння, даступнай праграмам. "
|
||||
"Магчымыя значэнні: \"off\" (выключыць вызначэнне месцапалажэння), \"country\" (краіна), "
|
||||
"\"city\" (горад), \"neighborhood\" (раён), \"street\" (вуліца) і \"exact\" (дэталёва, "
|
||||
"звычайна патрабуе GPS-прыёмнік). Увага: гэта настройка вызначае толькі тое, што "
|
||||
"даступна праграмам з дапамогай службы GeoClue, але яны могуць самастойна вызначаць "
|
||||
"месцапалажэнне з дапамогай спецыяльных сеціўных рэсурсаў (праўда, максімальная дакладнасць "
|
||||
"такіх рэсурсаў - назва вуліцы)."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||
msgid "The application icon mode."
|
||||
@ -288,7 +295,8 @@ 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"
|
||||
@ -303,7 +311,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:883
|
||||
#: ../js/ui/status/network.js:878
|
||||
msgid "Cancel"
|
||||
msgstr "Скасаваць"
|
||||
|
||||
@ -321,25 +329,25 @@ msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "Увайсці"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:270
|
||||
#: ../js/gdm/loginDialog.js:271
|
||||
msgid "Choose Session"
|
||||
msgstr "Выбар сеанса"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:430
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "Няма ў спісе?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:598
|
||||
#: ../js/gdm/loginDialog.js:614
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(напр., карыстальнік ці %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:603 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "Імя карыстальніка: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:868
|
||||
#: ../js/gdm/loginDialog.js:920
|
||||
msgid "Login Window"
|
||||
msgstr "Акно ўваходу"
|
||||
|
||||
@ -364,27 +372,27 @@ msgstr "Не ўдалося разабраць загад:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "Не ўдалося выканаць \"%s\":"
|
||||
|
||||
#: ../js/ui/appDisplay.js:629
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Тут размешчаныя часта ўжываныя праграмы"
|
||||
|
||||
#: ../js/ui/appDisplay.js:740
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
msgid "Frequent"
|
||||
msgstr "Часта"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
msgid "All"
|
||||
msgstr "Усе"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1552
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
msgid "New Window"
|
||||
msgstr "Новае акно"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1574 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Выдаліць са спіса ўпадабанага"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1580
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Дадаць у спіс упадабанага"
|
||||
|
||||
@ -527,44 +535,44 @@ msgstr "Сб"
|
||||
msgid "calendar:MY"
|
||||
msgstr "calendar:MY"
|
||||
|
||||
#: ../js/ui/calendar.js:446
|
||||
#: ../js/ui/calendar.js:450
|
||||
msgid "Previous month"
|
||||
msgstr "Папярэдні месяц"
|
||||
|
||||
#: ../js/ui/calendar.js:456
|
||||
#: ../js/ui/calendar.js:460
|
||||
msgid "Next month"
|
||||
msgstr "Наступны месяц"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:762
|
||||
#: ../js/ui/calendar.js:772
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Нічога не прымеркавана"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||
#: ../js/ui/calendar.js:780
|
||||
#: ../js/ui/calendar.js:790
|
||||
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:783
|
||||
#: ../js/ui/calendar.js:793
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d %B, %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:794
|
||||
#: ../js/ui/calendar.js:804
|
||||
msgid "Today"
|
||||
msgstr "Сёння"
|
||||
|
||||
#: ../js/ui/calendar.js:798
|
||||
#: ../js/ui/calendar.js:808
|
||||
msgid "Tomorrow"
|
||||
msgstr "Заўтра"
|
||||
|
||||
#: ../js/ui/calendar.js:809
|
||||
#: ../js/ui/calendar.js:819
|
||||
msgid "This week"
|
||||
msgstr "На гэтым тыдні"
|
||||
|
||||
#: ../js/ui/calendar.js:817
|
||||
#: ../js/ui/calendar.js:827
|
||||
msgid "Next week"
|
||||
msgstr "На наступным тыдні"
|
||||
|
||||
@ -597,8 +605,8 @@ msgstr "Пароль:"
|
||||
msgid "Type again:"
|
||||
msgstr "Паўтарыце пароль:"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:250
|
||||
#: ../js/ui/status/network.js:327 ../js/ui/status/network.js:886
|
||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
||||
msgid "Connect"
|
||||
msgstr "Злучыць"
|
||||
|
||||
@ -805,13 +813,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:1290
|
||||
#: ../js/ui/components/telepathyClient.js:1291
|
||||
msgid "Decline"
|
||||
msgstr "Адмовіцца"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1296
|
||||
msgid "Accept"
|
||||
msgstr "Прыняць"
|
||||
|
||||
@ -848,97 +856,97 @@ msgstr "%s пасылае вам %s"
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s просіць дазволу на прагляд вашага сеткавага стану"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
msgid "Network error"
|
||||
msgstr "Сеткавая памылка"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
msgid "Authentication failed"
|
||||
msgstr "Няўдалая ідэнтыфікацыя"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Encryption error"
|
||||
msgstr "Памылка шыфравання"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1347
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Сертыфікат не пададзены"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1349
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Сертыфікат не заслугоўвае даверу"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate expired"
|
||||
msgstr "Сертыфікат састарэў"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Сертыфікат не актывізаваны"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Назва камп'ютара ў сертыфікаце не адпавядае патрэбнай"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1357
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Адбітак сертыфіката не адпавядае патрэбнаму"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Сертыфікат уласнаручна падпісаны"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Уключаны рэжым па-за сеткай"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Шыфраванне недаступнае"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Хібны сертыфікат"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Адмоўлена ў злучэнні"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1369
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Не ўдалося ўсталяваць злучэнне"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1371
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Злучэнне страчана"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1373
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Гэты конт ужо злучаны з серверам"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1375
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Злучэнне заменена новым для таго ж самага рэсурсу"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1377
|
||||
#: ../js/ui/components/telepathyClient.js:1378
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Такі конт ужо існуе на серверы"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1379
|
||||
#: ../js/ui/components/telepathyClient.js:1380
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Сервер надта заняты і не можа абслужыць гэта злучэнне"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1381
|
||||
#: ../js/ui/components/telepathyClient.js:1382
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Сертыфікат быў адкліканы"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr "Для сертыфіката выкарыстаны слабы або небяспечны алгарытм шыфравання"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1385
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -946,22 +954,22 @@ msgstr ""
|
||||
"Даўжыня сертыфіката сервера або глыбіня яго ланцуга перавышае абмежаванне, "
|
||||
"выстаўленае крыптаграфічнай бібліятэкай"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1387
|
||||
#: ../js/ui/components/telepathyClient.js:1388
|
||||
msgid "Internal error"
|
||||
msgstr "Унутраная памылка"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1397
|
||||
#: ../js/ui/components/telepathyClient.js:1398
|
||||
#, javascript-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Не ўдалося злучыцца з %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#: ../js/ui/components/telepathyClient.js:1403
|
||||
msgid "View account"
|
||||
msgstr "Праглядзець конт"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1434
|
||||
#: ../js/ui/components/telepathyClient.js:1440
|
||||
msgid "Unknown reason"
|
||||
msgstr "Невядомая прычына"
|
||||
|
||||
@ -977,22 +985,22 @@ msgstr "Паказаць праграмы"
|
||||
msgid "Dash"
|
||||
msgstr "Прыборная дошка"
|
||||
|
||||
#: ../js/ui/dateMenu.js:86
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
msgid "Open Calendar"
|
||||
msgstr "Адкрыць каляндар"
|
||||
|
||||
#: ../js/ui/dateMenu.js:90
|
||||
#: ../js/ui/dateMenu.js:95
|
||||
msgid "Open Clocks"
|
||||
msgstr "Адкрыць гадзіннікі"
|
||||
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
#: ../js/ui/dateMenu.js:102
|
||||
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:187
|
||||
#: ../js/ui/dateMenu.js:192
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e %B, %Y"
|
||||
|
||||
@ -1108,7 +1116,9 @@ 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."
|
||||
@ -1143,25 +1153,26 @@ msgstr "Сцягнуць і ўсталяваць \"%s\" з extensions.gnome.org?
|
||||
msgid "Keyboard"
|
||||
msgstr "Клавіятура"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:641
|
||||
#: ../js/ui/lookingGlass.js:643
|
||||
msgid "No extensions installed"
|
||||
msgstr "Няма ўсталяваных пашырэнняў"
|
||||
|
||||
#. Translators: argument is an extension UUID. */
|
||||
#: ../js/ui/lookingGlass.js:695
|
||||
#: ../js/ui/lookingGlass.js:697
|
||||
#, javascript-format
|
||||
msgid "%s has not emitted any errors."
|
||||
msgstr "%s не зрабіў ніякіх памылак."
|
||||
|
||||
#: ../js/ui/lookingGlass.js:701
|
||||
#: ../js/ui/lookingGlass.js:703
|
||||
msgid "Hide Errors"
|
||||
msgstr "Хаваць памылкі"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:705 ../js/ui/lookingGlass.js:765
|
||||
#: ../js/ui/lookingGlass.js:707 ../js/ui/lookingGlass.js:767
|
||||
msgid "Show Errors"
|
||||
msgstr "Паказваць памылкі"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:714
|
||||
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "Enabled"
|
||||
msgstr "Уключана"
|
||||
|
||||
@ -1169,64 +1180,64 @@ msgstr "Уключана"
|
||||
#. because it's disabled by rfkill (airplane mode) */
|
||||
#. translators:
|
||||
#. * The device has been disabled
|
||||
#: ../js/ui/lookingGlass.js:717 ../js/ui/status/network.js:560
|
||||
#: ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "Выключана"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:719
|
||||
#: ../js/ui/lookingGlass.js:721
|
||||
msgid "Error"
|
||||
msgstr "Памылка"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:721
|
||||
#: ../js/ui/lookingGlass.js:723
|
||||
msgid "Out of date"
|
||||
msgstr "Састарэла"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:723
|
||||
#: ../js/ui/lookingGlass.js:725
|
||||
msgid "Downloading"
|
||||
msgstr "Сцягванне"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:747
|
||||
#: ../js/ui/lookingGlass.js:749
|
||||
msgid "View Source"
|
||||
msgstr "Паглядзець выточны код"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:756
|
||||
#: ../js/ui/lookingGlass.js:758
|
||||
msgid "Web Page"
|
||||
msgstr "Сеціўная старонка"
|
||||
|
||||
#: ../js/ui/messageTray.js:1324
|
||||
#: ../js/ui/messageTray.js:1326
|
||||
msgid "Open"
|
||||
msgstr "Адкрыць"
|
||||
|
||||
#: ../js/ui/messageTray.js:1331
|
||||
#: ../js/ui/messageTray.js:1333
|
||||
msgid "Remove"
|
||||
msgstr "Выдаліць"
|
||||
|
||||
#: ../js/ui/messageTray.js:1628
|
||||
#: ../js/ui/messageTray.js:1630
|
||||
msgid "Notifications"
|
||||
msgstr "Апавяшчэнні"
|
||||
|
||||
#: ../js/ui/messageTray.js:1635
|
||||
#: ../js/ui/messageTray.js:1637
|
||||
msgid "Clear Messages"
|
||||
msgstr "Ачысціць спіс апавяшчэнняў"
|
||||
|
||||
#: ../js/ui/messageTray.js:1654
|
||||
#: ../js/ui/messageTray.js:1656
|
||||
msgid "Notification Settings"
|
||||
msgstr "Настройкі апавяшчэння"
|
||||
|
||||
#: ../js/ui/messageTray.js:1707
|
||||
#: ../js/ui/messageTray.js:1709
|
||||
msgid "Tray Menu"
|
||||
msgstr "Меню трэя"
|
||||
|
||||
#: ../js/ui/messageTray.js:1924
|
||||
#: ../js/ui/messageTray.js:1926
|
||||
msgid "No Messages"
|
||||
msgstr "Апавяшчэнні адсутнічаюць"
|
||||
|
||||
#: ../js/ui/messageTray.js:1962
|
||||
#: ../js/ui/messageTray.js:1964
|
||||
msgid "Message Tray"
|
||||
msgstr "Абшар апавяшчэнняў"
|
||||
|
||||
#: ../js/ui/messageTray.js:2946
|
||||
#: ../js/ui/messageTray.js:2962
|
||||
msgid "System Information"
|
||||
msgstr "Сістэмная інфармацыя"
|
||||
|
||||
@ -1243,11 +1254,11 @@ msgstr[0] "%d новае паведамленне"
|
||||
msgstr[1] "%d новыя паведамленні"
|
||||
msgstr[2] "%d новых паведамленняў"
|
||||
|
||||
#: ../js/ui/overview.js:83
|
||||
#: ../js/ui/overview.js:84
|
||||
msgid "Undo"
|
||||
msgstr "Адрабіць"
|
||||
|
||||
#: ../js/ui/overview.js:123
|
||||
#: ../js/ui/overview.js:124
|
||||
msgid "Overview"
|
||||
msgstr "Агляд"
|
||||
|
||||
@ -1255,7 +1266,7 @@ msgstr "Агляд"
|
||||
#. in the search entry when no search is
|
||||
#. active; it should not exceed ~30
|
||||
#. characters. */
|
||||
#: ../js/ui/overview.js:257
|
||||
#: ../js/ui/overview.js:250
|
||||
msgid "Type to search…"
|
||||
msgstr "Увядзіце тэкст для пошуку..."
|
||||
|
||||
@ -1299,27 +1310,27 @@ msgstr[0] "%d новае апавяшчэнне"
|
||||
msgstr[1] "%d новыя апавяшчэнні"
|
||||
msgstr[2] "%d новых апавяшчэнняў"
|
||||
|
||||
#: ../js/ui/screenShield.js:473 ../js/ui/status/system.js:342
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342
|
||||
msgid "Lock"
|
||||
msgstr "Заблакіраваць"
|
||||
|
||||
#: ../js/ui/screenShield.js:707
|
||||
#: ../js/ui/screenShield.js:708
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "GNOME патрабуе блакіравання экрана"
|
||||
|
||||
#: ../js/ui/screenShield.js:834 ../js/ui/screenShield.js:1301
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309
|
||||
msgid "Unable to lock"
|
||||
msgstr "Не ўдалося заблакіраваць"
|
||||
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1302
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Блакіраванне стрымана праграмай"
|
||||
|
||||
#: ../js/ui/search.js:589
|
||||
#: ../js/ui/search.js:603
|
||||
msgid "Searching…"
|
||||
msgstr "Пошук..."
|
||||
|
||||
#: ../js/ui/search.js:632
|
||||
#: ../js/ui/search.js:649
|
||||
msgid "No results."
|
||||
msgstr "Нічога не знойдзена."
|
||||
|
||||
@ -1391,23 +1402,22 @@ msgstr "Высокая кантраснасць"
|
||||
msgid "Large Text"
|
||||
msgstr "Буйны тэкст"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:48
|
||||
#: ../js/ui/status/bluetooth.js:49
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: ../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
|
||||
#: ../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
|
||||
msgid "Turn Off"
|
||||
msgstr "Выключыць"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:53
|
||||
#: ../js/ui/status/bluetooth.js:54
|
||||
msgid "Bluetooth Settings"
|
||||
msgstr "Настройкі Bluetooth"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:100
|
||||
#: ../js/ui/status/bluetooth.js:104
|
||||
#, javascript-format
|
||||
msgid "%d Connected Device"
|
||||
msgid_plural "%d Connected Devices"
|
||||
@ -1415,7 +1425,7 @@ msgstr[0] "%d злучанае прыстасаванне"
|
||||
msgstr[1] "%d злучаныя прыстасаванні"
|
||||
msgstr[2] "%d злучаных прыстасаванняў"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:102 ../js/ui/status/network.js:1263
|
||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
||||
msgid "Not Connected"
|
||||
msgstr "Няма злучэння"
|
||||
|
||||
@ -1427,156 +1437,167 @@ msgstr "Яркасць"
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Паказаць клавіятурную раскладку"
|
||||
|
||||
#: ../js/ui/status/location.js:52
|
||||
#: ../js/ui/status/location.js:53
|
||||
msgid "Location"
|
||||
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:60 ../js/ui/status/location.js:168
|
||||
msgid "Disable"
|
||||
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"
|
||||
#: ../js/ui/status/location.js:165
|
||||
msgid "Enable"
|
||||
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:431
|
||||
#: ../js/ui/status/network.js:426
|
||||
msgid "unmanaged"
|
||||
msgstr "непадкантрольна"
|
||||
|
||||
#: ../js/ui/status/network.js:433
|
||||
#: ../js/ui/status/network.js:428
|
||||
msgid "disconnecting..."
|
||||
msgstr "адлучэнне..."
|
||||
|
||||
#: ../js/ui/status/network.js:439 ../js/ui/status/network.js:1363
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "усталяванне злучэння..."
|
||||
|
||||
#. Translators: this is for network connections that require some kind of key or password */
|
||||
#: ../js/ui/status/network.js:442 ../js/ui/status/network.js:1366
|
||||
#: ../js/ui/status/network.js:437 ../js/ui/status/network.js:1365
|
||||
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:450
|
||||
#: ../js/ui/status/network.js:445
|
||||
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:454
|
||||
#: ../js/ui/status/network.js:449
|
||||
msgid "unavailable"
|
||||
msgstr "недаступна"
|
||||
|
||||
#: ../js/ui/status/network.js:456 ../js/ui/status/network.js:1368
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "не ўдалося злучыцца"
|
||||
|
||||
#: ../js/ui/status/network.js:472
|
||||
#: ../js/ui/status/network.js:467
|
||||
msgid "Wired Settings"
|
||||
msgstr "Настройкі праваднога злучэння"
|
||||
|
||||
#: ../js/ui/status/network.js:514 ../js/ui/status/network.js:592
|
||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
||||
msgid "Mobile Broadband Settings"
|
||||
msgstr "Настройкі мабільнага злучэння"
|
||||
|
||||
#: ../js/ui/status/network.js:556 ../js/ui/status/network.js:1259
|
||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
||||
msgid "Hardware Disabled"
|
||||
msgstr "Прыстасаванне выключана"
|
||||
|
||||
#: ../js/ui/status/network.js:600
|
||||
#: ../js/ui/status/network.js:595
|
||||
msgid "Use as Internet connection"
|
||||
msgstr "Ужыць для злучэння з Інтэрнэтам"
|
||||
|
||||
#: ../js/ui/status/network.js:781
|
||||
#: ../js/ui/status/network.js:776
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "Рэжым самалёта ўключаны"
|
||||
|
||||
#: ../js/ui/status/network.js:782
|
||||
#: ../js/ui/status/network.js:777
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "У рэжыме самалёта выключаецца Wi-Fi."
|
||||
|
||||
#: ../js/ui/status/network.js:783
|
||||
#: ../js/ui/status/network.js:778
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Выключыць рэжым самалёта"
|
||||
|
||||
#: ../js/ui/status/network.js:792
|
||||
#: ../js/ui/status/network.js:787
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "Wi-Fi выключаны"
|
||||
|
||||
#: ../js/ui/status/network.js:793
|
||||
#: ../js/ui/status/network.js:788
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr "Каб злучыцца з сеткай, спачатку трэба ўключыць Wi-Fi."
|
||||
|
||||
#: ../js/ui/status/network.js:794
|
||||
#: ../js/ui/status/network.js:789
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "Уключыць Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:819
|
||||
#: ../js/ui/status/network.js:814
|
||||
msgid "Wi-Fi Networks"
|
||||
msgstr "Сеткі Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:821
|
||||
#: ../js/ui/status/network.js:816
|
||||
msgid "Select a network"
|
||||
msgstr "Выберыце сетку"
|
||||
|
||||
#: ../js/ui/status/network.js:850
|
||||
#: ../js/ui/status/network.js:845
|
||||
msgid "No Networks"
|
||||
msgstr "Няма сетак"
|
||||
|
||||
#: ../js/ui/status/network.js:871 ../js/ui/status/rfkill.js:103
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Задзейнічаць апаратны выключальнік"
|
||||
|
||||
#: ../js/ui/status/network.js:1141
|
||||
#: ../js/ui/status/network.js:1136
|
||||
msgid "Select Network"
|
||||
msgstr "Выбраць сетку"
|
||||
|
||||
#: ../js/ui/status/network.js:1147
|
||||
#: ../js/ui/status/network.js:1142
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Настройкі Wi-Fi"
|
||||
|
||||
#: ../js/ui/status/network.js:1252
|
||||
#: ../js/ui/status/network.js:1234
|
||||
msgid "Turn On"
|
||||
msgstr "Уключыць"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Хотспот уключаны"
|
||||
|
||||
#: ../js/ui/status/network.js:1255
|
||||
#: ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Злучэнне"
|
||||
|
||||
#: ../js/ui/status/network.js:1434 ../js/ui/status/rfkill.js:88
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
||||
msgid "Network Settings"
|
||||
msgstr "Сеткавыя настройкі"
|
||||
|
||||
#: ../js/ui/status/network.js:1436
|
||||
#: ../js/ui/status/network.js:1435
|
||||
msgid "VPN Settings"
|
||||
msgstr "Настройкі VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1455
|
||||
#: ../js/ui/status/network.js:1454
|
||||
msgid "VPN"
|
||||
msgstr "VPN"
|
||||
|
||||
#: ../js/ui/status/network.js:1598
|
||||
#: ../js/ui/status/network.js:1607
|
||||
msgid "Network Manager"
|
||||
msgstr "Сеткавы кіраўнік"
|
||||
|
||||
#: ../js/ui/status/network.js:1637
|
||||
#: ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Не ўдалося злучыцца"
|
||||
|
||||
#: ../js/ui/status/network.js:1638
|
||||
#: ../js/ui/status/network.js:1647
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Не ўдалося ўключыць сеткавае злучэнне"
|
||||
|
||||
@ -1610,10 +1631,14 @@ msgstr "UPS"
|
||||
msgid "Battery"
|
||||
msgstr "Батарэя"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:82
|
||||
#: ../js/ui/status/rfkill.js:83
|
||||
msgid "Airplane Mode"
|
||||
msgstr "Рэжым самалёта"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:85
|
||||
msgid "On"
|
||||
msgstr "Укл."
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
msgid "Switch User"
|
||||
msgstr "Перамяніць карыстальніка"
|
||||
@ -1750,4 +1775,3 @@ msgstr "Пароль не можа быць пустым"
|
||||
#: ../src/shell-polkit-authentication-agent.c:343
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Карыстальнік праігнараваў дыялогавае акенца ідэнтыфікацыі"
|
||||
|
||||
|
1062
po/ca@valencia.po
1062
po/ca@valencia.po
File diff suppressed because it is too large
Load Diff
361
po/cs.po
361
po/cs.po
@ -12,8 +12,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-27 20:52+0000\n"
|
||||
"PO-Revision-Date: 2014-03-27 22:15+0100\n"
|
||||
"POT-Creation-Date: 2014-05-18 07:27+0000\n"
|
||||
"PO-Revision-Date: 2014-05-18 15:23+0200\n"
|
||||
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
|
||||
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
|
||||
"Language: cs\n"
|
||||
@ -336,25 +336,25 @@ msgstr "Vybrat sezení"
|
||||
msgid "Not listed?"
|
||||
msgstr "Nejste na seznamu?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:611
|
||||
#: ../js/gdm/loginDialog.js:616
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(např. uživatel nebo %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:616 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/gdm/loginDialog.js:621 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "Uživatelské jméno: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:917
|
||||
#: ../js/gdm/loginDialog.js:924
|
||||
msgid "Login Window"
|
||||
msgstr "Přihlašovací okno"
|
||||
|
||||
#: ../js/gdm/util.js:322
|
||||
#: ../js/gdm/util.js:323
|
||||
msgid "Authentication error"
|
||||
msgstr "Chyba ověření"
|
||||
|
||||
#: ../js/gdm/util.js:452
|
||||
#: ../js/gdm/util.js:453
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(nebo otiskněte prst)"
|
||||
|
||||
@ -371,30 +371,34 @@ msgstr "Nelze analyzovat příkaz:"
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "Vykonání „%s“ selhalo:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
#: ../js/ui/appDisplay.js:640
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Zde se objeví často používané aplikace"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:751
|
||||
msgid "Frequent"
|
||||
msgstr "Časté"
|
||||
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
#: ../js/ui/appDisplay.js:758
|
||||
msgid "All"
|
||||
msgstr "Všechny"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
#: ../js/ui/appDisplay.js:1571
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Odstranit z oblíbených"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
#: ../js/ui/appDisplay.js:1599
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Přidat mezi oblíbené"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1608
|
||||
msgid "Show Details"
|
||||
msgstr "Zobrazit podrobnosti"
|
||||
|
||||
#: ../js/ui/appFavorites.js:87
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
@ -405,8 +409,8 @@ msgstr "%s byl přidán mezi oblíbené."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s byl odstraněn z oblíbených."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||
#: ../js/ui/status/system.js:334
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
||||
#: ../js/ui/status/system.js:337
|
||||
msgid "Settings"
|
||||
msgstr "Nastavení"
|
||||
|
||||
@ -417,14 +421,14 @@ msgstr "Změnit pozadí…"
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:64
|
||||
#: ../js/ui/calendar.js:67
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Celý den"
|
||||
|
||||
#. Translators: Shown in calendar event list, if 24h format,
|
||||
#. \u2236 is a ratio character, similar to : */
|
||||
#: ../js/ui/calendar.js:70
|
||||
#: ../js/ui/calendar.js:73
|
||||
msgctxt "event list time"
|
||||
msgid "%H∶%M"
|
||||
msgstr "%k∶%M"
|
||||
@ -432,7 +436,7 @@ msgstr "%k∶%M"
|
||||
#. Translators: Shown in calendar event list, if 12h format,
|
||||
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||
#. a thin space */
|
||||
#: ../js/ui/calendar.js:79
|
||||
#: ../js/ui/calendar.js:82
|
||||
msgctxt "event list time"
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
@ -442,43 +446,43 @@ msgstr "%l∶%M %p"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:110
|
||||
#: ../js/ui/calendar.js:113
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "Ne"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday */
|
||||
#: ../js/ui/calendar.js:112
|
||||
#: ../js/ui/calendar.js:115
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "Po"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday */
|
||||
#: ../js/ui/calendar.js:114
|
||||
#: ../js/ui/calendar.js:117
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "Út"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday */
|
||||
#: ../js/ui/calendar.js:116
|
||||
#: ../js/ui/calendar.js:119
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "St"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday */
|
||||
#: ../js/ui/calendar.js:118
|
||||
#: ../js/ui/calendar.js:121
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "Čt"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday */
|
||||
#: ../js/ui/calendar.js:120
|
||||
#: ../js/ui/calendar.js:123
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "Pá"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday */
|
||||
#: ../js/ui/calendar.js:122
|
||||
#: ../js/ui/calendar.js:125
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "So"
|
||||
@ -489,97 +493,93 @@ msgstr "So"
|
||||
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
|
||||
#. * both be 'T').
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:135
|
||||
#: ../js/ui/calendar.js:138
|
||||
msgctxt "list sunday"
|
||||
msgid "Su"
|
||||
msgstr "Ne"
|
||||
|
||||
#. Translators: Event list abbreviation for Monday */
|
||||
#: ../js/ui/calendar.js:137
|
||||
#: ../js/ui/calendar.js:140
|
||||
msgctxt "list monday"
|
||||
msgid "M"
|
||||
msgstr "Po"
|
||||
|
||||
#. Translators: Event list abbreviation for Tuesday */
|
||||
#: ../js/ui/calendar.js:139
|
||||
#: ../js/ui/calendar.js:142
|
||||
msgctxt "list tuesday"
|
||||
msgid "T"
|
||||
msgstr "Út"
|
||||
|
||||
#. Translators: Event list abbreviation for Wednesday */
|
||||
#: ../js/ui/calendar.js:141
|
||||
#: ../js/ui/calendar.js:144
|
||||
msgctxt "list wednesday"
|
||||
msgid "W"
|
||||
msgstr "St"
|
||||
|
||||
#. Translators: Event list abbreviation for Thursday */
|
||||
#: ../js/ui/calendar.js:143
|
||||
#: ../js/ui/calendar.js:146
|
||||
msgctxt "list thursday"
|
||||
msgid "Th"
|
||||
msgstr "Čt"
|
||||
|
||||
#. Translators: Event list abbreviation for Friday */
|
||||
#: ../js/ui/calendar.js:145
|
||||
#: ../js/ui/calendar.js:148
|
||||
msgctxt "list friday"
|
||||
msgid "F"
|
||||
msgstr "Pá"
|
||||
|
||||
#. Translators: Event list abbreviation for Saturday */
|
||||
#: ../js/ui/calendar.js:147
|
||||
#: ../js/ui/calendar.js:150
|
||||
msgctxt "list saturday"
|
||||
msgid "S"
|
||||
msgstr "So"
|
||||
|
||||
#: ../js/ui/calendar.js:390
|
||||
msgid "calendar:MY"
|
||||
msgstr "calendar:MY"
|
||||
|
||||
#: ../js/ui/calendar.js:450
|
||||
#: ../js/ui/calendar.js:453
|
||||
msgid "Previous month"
|
||||
msgstr "Předchozí měsíc"
|
||||
|
||||
#: ../js/ui/calendar.js:460
|
||||
#: ../js/ui/calendar.js:463
|
||||
msgid "Next month"
|
||||
msgstr "Následující měsíc"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:772
|
||||
#: ../js/ui/calendar.js:775
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Nic nenaplánováno"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||
#: ../js/ui/calendar.js:790
|
||||
#: ../js/ui/calendar.js:793
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d"
|
||||
msgstr "%A, %e. %B"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||
#: ../js/ui/calendar.js:793
|
||||
#: ../js/ui/calendar.js:796
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %e. %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:804
|
||||
#: ../js/ui/calendar.js:807
|
||||
msgid "Today"
|
||||
msgstr "Dnes"
|
||||
|
||||
#: ../js/ui/calendar.js:808
|
||||
#: ../js/ui/calendar.js:811
|
||||
msgid "Tomorrow"
|
||||
msgstr "Zítra"
|
||||
|
||||
#: ../js/ui/calendar.js:819
|
||||
#: ../js/ui/calendar.js:822
|
||||
msgid "This week"
|
||||
msgstr "Tento týden"
|
||||
|
||||
#: ../js/ui/calendar.js:827
|
||||
#: ../js/ui/calendar.js:830
|
||||
msgid "Next week"
|
||||
msgstr "Následující týden"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:90
|
||||
#: ../js/ui/components/automountManager.js:91
|
||||
msgid "External drive connected"
|
||||
msgstr "Externí svazek připojen"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:101
|
||||
#: ../js/ui/components/automountManager.js:102
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Externí svazek odpojen"
|
||||
|
||||
@ -724,77 +724,77 @@ msgid "Mute"
|
||||
msgstr "Ztlumit"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
msgid "%H∶%M"
|
||||
msgstr "%k∶%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
|
||||
#: ../js/ui/components/telepathyClient.js:965
|
||||
msgid "Yesterday, %H∶%M"
|
||||
msgstr "včera, %k∶%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
|
||||
#: ../js/ui/components/telepathyClient.js:972
|
||||
msgid "%A, %H∶%M"
|
||||
msgstr "%A, %k∶%M"
|
||||
|
||||
#. Translators: this is the month name and day number
|
||||
#. followed by a time string in 24h format.
|
||||
#. i.e. "May 25, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:976
|
||||
#: ../js/ui/components/telepathyClient.js:979
|
||||
msgid "%B %d, %H∶%M"
|
||||
msgstr "%e. %B %k∶%M"
|
||||
|
||||
#. 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" */
|
||||
#: ../js/ui/components/telepathyClient.js:982
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
msgid "%B %d %Y, %H∶%M"
|
||||
msgstr "%e. %B %Y, %k∶%M"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:991
|
||||
#: ../js/ui/components/telepathyClient.js:994
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
|
||||
#. Translators: this is the word "Yesterday" followed by a
|
||||
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
||||
#: ../js/ui/components/telepathyClient.js:998
|
||||
#: ../js/ui/components/telepathyClient.js:1001
|
||||
msgid "Yesterday, %l∶%M %p"
|
||||
msgstr "včera, %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
|
||||
#: ../js/ui/components/telepathyClient.js:1008
|
||||
msgid "%A, %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
|
||||
#: ../js/ui/components/telepathyClient.js:1015
|
||||
msgid "%B %d, %l∶%M %p"
|
||||
msgstr "%e. %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
|
||||
#: ../js/ui/components/telepathyClient.js:1021
|
||||
msgid "%B %d %Y, %l∶%M %p"
|
||||
msgstr "%e. %B %Y, %l∶%M %p"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name. */
|
||||
#: ../js/ui/components/telepathyClient.js:1051
|
||||
#: ../js/ui/components/telepathyClient.js:1054
|
||||
#, javascript-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s je teď znám jako %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1154
|
||||
#: ../js/ui/components/telepathyClient.js:1158
|
||||
#, javascript-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Pozvánka na připojení k %s"
|
||||
@ -802,38 +802,38 @@ msgstr "Pozvánka na připojení k %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1162
|
||||
#: ../js/ui/components/telepathyClient.js:1166
|
||||
#, javascript-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s vás zve do %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1164
|
||||
#: ../js/ui/components/telepathyClient.js:1199
|
||||
#: ../js/ui/components/telepathyClient.js:1233
|
||||
#: ../js/ui/components/telepathyClient.js:1290
|
||||
#: ../js/ui/components/telepathyClient.js:1168
|
||||
#: ../js/ui/components/telepathyClient.js:1203
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
msgid "Decline"
|
||||
msgstr "Odmítnout"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Accept"
|
||||
msgstr "Přijmout"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1189
|
||||
#: ../js/ui/components/telepathyClient.js:1193
|
||||
#, javascript-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Videohovor od %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1192
|
||||
#: ../js/ui/components/telepathyClient.js:1196
|
||||
#, javascript-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Hovor od %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun */
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1210
|
||||
msgid "Answer"
|
||||
msgstr "Zvednout"
|
||||
|
||||
@ -842,110 +842,110 @@ msgstr "Zvednout"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#. */
|
||||
#: ../js/ui/components/telepathyClient.js:1227
|
||||
#: ../js/ui/components/telepathyClient.js:1231
|
||||
#, javascript-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s vám posílá %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias */
|
||||
#: ../js/ui/components/telepathyClient.js:1256
|
||||
#: ../js/ui/components/telepathyClient.js:1260
|
||||
#, javascript-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s vás žádá o oprávnění vidět, že jste dostupní"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Network error"
|
||||
msgstr "Chyba sítě"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Authentication failed"
|
||||
msgstr "Ověření selhalo"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Encryption error"
|
||||
msgstr "Chyba šifrování"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1347
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Certifikát neposkytnut"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1349
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Nedůvěryhodný certifikát"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate expired"
|
||||
msgstr "Platnost certifikátu vypršela"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Certifikát není aktivován"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Název počítače certifikátu nesouhlasí"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1357
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Otisk prstu certifikátu nesouhlasí"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Certifikát je podepsán sám sebou"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Stav nastaven na „Odhlášen“"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Šifrování není dostupné"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Certifikát je neplatný"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Spojení bylo odmítnuto"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1369
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Spojení nemohlo bát navázáno"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1371
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Spojení bylo ztraceno"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1373
|
||||
#: ../js/ui/components/telepathyClient.js:1378
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Tento účet je již připojen k serveru"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1375
|
||||
#: ../js/ui/components/telepathyClient.js:1380
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "Spojení bylo nahrazeno novým spojením, které používá stejný zdroj"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1377
|
||||
#: ../js/ui/components/telepathyClient.js:1382
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Takový účet již na serveru existuje"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1379
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Server je právě příliš zaneprázdněn na to, aby obsloužil spojení"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1381
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Certifikát byl odvolán"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
#: ../js/ui/components/telepathyClient.js:1388
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Certifikát používá nepříliš bezpečný šifrovací algoritmus nebo je z "
|
||||
"kryptografického hlediska slabý"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1385
|
||||
#: ../js/ui/components/telepathyClient.js:1390
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -953,22 +953,22 @@ msgstr ""
|
||||
"Délka certifikátu serveru nebo délka zřetězených certifikátů serveru "
|
||||
"přesáhla omezení dané kryptografickou knihovnou"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1387
|
||||
#: ../js/ui/components/telepathyClient.js:1392
|
||||
msgid "Internal error"
|
||||
msgstr "Vnitřní chyba"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1397
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#, javascript-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Nelze se připojit k „%s“"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#: ../js/ui/components/telepathyClient.js:1407
|
||||
msgid "View account"
|
||||
msgstr "Zobrazit účet"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1439
|
||||
#: ../js/ui/components/telepathyClient.js:1444
|
||||
msgid "Unknown reason"
|
||||
msgstr "Neznámý důvod"
|
||||
|
||||
@ -984,15 +984,15 @@ msgstr "Zobrazit aplikace"
|
||||
msgid "Dash"
|
||||
msgstr "Oblíbené"
|
||||
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
msgid "Open Calendar"
|
||||
msgstr "Otevřít kalendář"
|
||||
|
||||
#: ../js/ui/dateMenu.js:95
|
||||
#: ../js/ui/dateMenu.js:101
|
||||
msgid "Open Clocks"
|
||||
msgstr "Otevřít Hodiny"
|
||||
|
||||
#: ../js/ui/dateMenu.js:102
|
||||
#: ../js/ui/dateMenu.js:108
|
||||
msgid "Date & Time Settings"
|
||||
msgstr "Nastavení data a času"
|
||||
|
||||
@ -1000,7 +1000,7 @@ msgstr "Nastavení data a času"
|
||||
#. 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:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e. %B, %Y"
|
||||
|
||||
@ -1131,13 +1131,13 @@ msgid "Other users are logged in."
|
||||
msgstr "Jsou přihlášeni jiní uživatelé."
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login */
|
||||
#: ../js/ui/endSessionDialog.js:618
|
||||
#: ../js/ui/endSessionDialog.js:619
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (vzdálený)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console */
|
||||
#: ../js/ui/endSessionDialog.js:621
|
||||
#: ../js/ui/endSessionDialog.js:622
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (konzola)"
|
||||
@ -1151,7 +1151,7 @@ msgstr "Instalovat"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Stáhnout a nainstalovat „%s“ z extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:641 ../js/ui/status/keyboard.js:335
|
||||
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:335
|
||||
msgid "Keyboard"
|
||||
msgstr "Klávesnice"
|
||||
|
||||
@ -1239,16 +1239,16 @@ msgstr "Žádné zprávy"
|
||||
msgid "Message Tray"
|
||||
msgstr "Lišta zpráv"
|
||||
|
||||
#: ../js/ui/messageTray.js:2962
|
||||
#: ../js/ui/messageTray.js:2967
|
||||
msgid "System Information"
|
||||
msgstr "Informace o systému"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:515 ../src/shell-app.c:425
|
||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Neznámé"
|
||||
|
||||
#: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151
|
||||
#: ../js/ui/overviewControls.js:488 ../js/ui/screenShield.js:151
|
||||
#, javascript-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@ -1282,7 +1282,7 @@ msgstr "Ukončit"
|
||||
msgid "Activities"
|
||||
msgstr "Činnosti"
|
||||
|
||||
#: ../js/ui/panel.js:914
|
||||
#: ../js/ui/panel.js:915
|
||||
msgid "Top Bar"
|
||||
msgstr "Horní lišta"
|
||||
|
||||
@ -1294,7 +1294,7 @@ msgstr "toggle-switch-intl"
|
||||
msgid "Enter a Command"
|
||||
msgstr "Zadejte příkaz:"
|
||||
|
||||
#: ../js/ui/runDialog.js:114
|
||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:117
|
||||
msgid "Close"
|
||||
msgstr "Zavřít"
|
||||
|
||||
@ -1312,7 +1312,7 @@ msgstr[0] "%d nové upozornění"
|
||||
msgstr[1] "%d nová upozornění"
|
||||
msgstr[2] "%d nových upozornění"
|
||||
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
|
||||
msgid "Lock"
|
||||
msgstr "Uzamknout"
|
||||
|
||||
@ -1320,19 +1320,19 @@ msgstr "Uzamknout"
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "GNOME potřebuje uzamknout obrazovku"
|
||||
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1312
|
||||
msgid "Unable to lock"
|
||||
msgstr "Nelze uzamknout obrazovku"
|
||||
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1313
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Zamknutí bylo zablokováno některou z aplikací"
|
||||
|
||||
#: ../js/ui/search.js:603
|
||||
#: ../js/ui/search.js:606
|
||||
msgid "Searching…"
|
||||
msgstr "Hledá se…"
|
||||
|
||||
#: ../js/ui/search.js:649
|
||||
#: ../js/ui/search.js:652
|
||||
msgid "No results."
|
||||
msgstr "Žádné výsledky."
|
||||
|
||||
@ -1396,11 +1396,11 @@ msgstr "Vícenásobné stisky kláves"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Myš klávesnicí"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:143
|
||||
#: ../js/ui/status/accessibility.js:144
|
||||
msgid "High Contrast"
|
||||
msgstr "Vysoký kontrast"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:192
|
||||
#: ../js/ui/status/accessibility.js:193
|
||||
msgid "Large Text"
|
||||
msgstr "Styl velkého textu"
|
||||
|
||||
@ -1410,8 +1410,8 @@ 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/rfkill.js:105
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/rfkill.js:114
|
||||
msgid "Turn Off"
|
||||
msgstr "Vypnout"
|
||||
|
||||
@ -1471,37 +1471,37 @@ msgstr "Připojeno"
|
||||
#. 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
|
||||
msgid "unmanaged"
|
||||
msgstr "nespravováno"
|
||||
msgid "Unmanaged"
|
||||
msgstr "Nespravováno"
|
||||
|
||||
#: ../js/ui/status/network.js:428
|
||||
msgid "disconnecting..."
|
||||
msgstr "odpojování…"
|
||||
msgid "Disconnecting"
|
||||
msgstr "Odpojuje se…"
|
||||
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "připojování…"
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Připojuje se…"
|
||||
|
||||
#. 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
|
||||
msgid "authentication required"
|
||||
msgstr "je vyžadováno ověření"
|
||||
#: ../js/ui/status/network.js:437
|
||||
msgid "Authentication required"
|
||||
msgstr "Je vyžadováno ověření"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing */
|
||||
#: ../js/ui/status/network.js:445
|
||||
msgid "firmware missing"
|
||||
msgstr "nedostupný firmware"
|
||||
msgid "Firmware missing"
|
||||
msgstr "Schází 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
|
||||
msgid "unavailable"
|
||||
msgstr "nedostupné"
|
||||
msgid "Unavailable"
|
||||
msgstr "Nedostupné"
|
||||
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "připojení selhalo"
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Připojení selhalo"
|
||||
|
||||
#: ../js/ui/status/network.js:467
|
||||
msgid "Wired Settings"
|
||||
@ -1555,7 +1555,7 @@ msgstr "Vyberte síť"
|
||||
msgid "No Networks"
|
||||
msgstr "Žádné sítě"
|
||||
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "K vypnutí použijte fyzický vypínač"
|
||||
|
||||
@ -1575,11 +1575,20 @@ msgstr "Zapnout"
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Hotspot aktivní"
|
||||
|
||||
#: ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Připojuje se…"
|
||||
#: ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "připojování…"
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88
|
||||
#. Translators: this is for network connections that require some kind of key or password */
|
||||
#: ../js/ui/status/network.js:1365
|
||||
msgid "authentication required"
|
||||
msgstr "je vyžadováno ověření"
|
||||
|
||||
#: ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "připojení selhalo"
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
||||
msgid "Network Settings"
|
||||
msgstr "Nastavení sítě"
|
||||
|
||||
@ -1595,10 +1604,6 @@ msgstr "VPN"
|
||||
msgid "Network Manager"
|
||||
msgstr "Network Manager"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Připojení selhalo"
|
||||
|
||||
#: ../js/ui/status/network.js:1647
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivace síťového připojení selhala"
|
||||
@ -1633,31 +1638,31 @@ msgstr "Záložní zdroj"
|
||||
msgid "Battery"
|
||||
msgstr "Baterie"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:82
|
||||
#: ../js/ui/status/rfkill.js:83
|
||||
msgid "Airplane Mode"
|
||||
msgstr "Režim „letadlo“"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
#: ../js/ui/status/rfkill.js:85
|
||||
msgid "On"
|
||||
msgstr "Zapnuto"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
#: ../js/ui/status/system.js:317
|
||||
msgid "Switch User"
|
||||
msgstr "Přepnout uživatele"
|
||||
|
||||
#: ../js/ui/status/system.js:319
|
||||
#: ../js/ui/status/system.js:322
|
||||
msgid "Log Out"
|
||||
msgstr "Odhlásit se"
|
||||
|
||||
#: ../js/ui/status/system.js:338
|
||||
#: ../js/ui/status/system.js:341
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Zámek otočení"
|
||||
|
||||
#: ../js/ui/status/system.js:346
|
||||
#: ../js/ui/status/system.js:349
|
||||
msgid "Suspend"
|
||||
msgstr "Uspat do paměti"
|
||||
|
||||
#: ../js/ui/status/system.js:349
|
||||
#: ../js/ui/status/system.js:352
|
||||
msgid "Power Off"
|
||||
msgstr "Vypnout"
|
||||
|
||||
@ -1694,22 +1699,22 @@ msgstr "Hledat"
|
||||
msgid "“%s” is ready"
|
||||
msgstr "Připraveno „%s“"
|
||||
|
||||
#: ../js/ui/windowManager.js:56
|
||||
#: ../js/ui/windowManager.js:57
|
||||
msgid "Do you want to keep these display settings?"
|
||||
msgstr "Chcete zachovat nastavení displeje?"
|
||||
|
||||
#. Translators: this and the following message should be limited in lenght,
|
||||
#. to avoid ellipsizing the labels.
|
||||
#. */
|
||||
#: ../js/ui/windowManager.js:75
|
||||
#: ../js/ui/windowManager.js:76
|
||||
msgid "Revert Settings"
|
||||
msgstr "Obnovit původní"
|
||||
|
||||
#: ../js/ui/windowManager.js:79
|
||||
#: ../js/ui/windowManager.js:80
|
||||
msgid "Keep Changes"
|
||||
msgstr "Zachovat"
|
||||
|
||||
#: ../js/ui/windowManager.js:97
|
||||
#: ../js/ui/windowManager.js:99
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -1717,6 +1722,46 @@ msgstr[0] "Nastavení se obnoví na původní za %d sekundu"
|
||||
msgstr[1] "Nastavení se obnoví na původní za %d sekundy"
|
||||
msgstr[2] "Nastavení se obnoví na původní za %d sekund"
|
||||
|
||||
#: ../js/ui/windowMenu.js:33
|
||||
msgid "Minimize"
|
||||
msgstr "Minimalizovat"
|
||||
|
||||
#: ../js/ui/windowMenu.js:40
|
||||
msgid "Unmaximize"
|
||||
msgstr "Zrušit maximalizaci"
|
||||
|
||||
#: ../js/ui/windowMenu.js:44
|
||||
msgid "Maximize"
|
||||
msgstr "Maximalizovat"
|
||||
|
||||
#: ../js/ui/windowMenu.js:51
|
||||
msgid "Move"
|
||||
msgstr "Přesunout"
|
||||
|
||||
#: ../js/ui/windowMenu.js:57
|
||||
msgid "Resize"
|
||||
msgstr "Změnit velikost"
|
||||
|
||||
#: ../js/ui/windowMenu.js:64
|
||||
msgid "Move Titlebar Onscreen"
|
||||
msgstr ""
|
||||
|
||||
#: ../js/ui/windowMenu.js:69
|
||||
msgid "Always on Top"
|
||||
msgstr "Vždy nahoře"
|
||||
|
||||
#: ../js/ui/windowMenu.js:86
|
||||
msgid "Always on Visible Workspace"
|
||||
msgstr "Vždy na viditelné ploše"
|
||||
|
||||
#: ../js/ui/windowMenu.js:103
|
||||
msgid "Move to Workspace Up"
|
||||
msgstr "Přesunout o plochu výš"
|
||||
|
||||
#: ../js/ui/windowMenu.js:108
|
||||
msgid "Move to Workspace Down"
|
||||
msgstr "Přesunout o plochu níž"
|
||||
|
||||
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Kalendář Evolution"
|
||||
@ -1774,6 +1819,6 @@ msgstr "Hesla si neodpovídají."
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "Heslo nemůže být prázdné."
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:343
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Dialogové okno ověření bylo uživatelem zrušeno"
|
||||
|
1428
po/en_GB.po
1428
po/en_GB.po
File diff suppressed because it is too large
Load Diff
383
po/id.po
383
po/id.po
@ -3,17 +3,17 @@
|
||||
# This file is distributed under the same license as the gnome-shell package.
|
||||
#
|
||||
# Andika Triwidada <andika@gmail.com>, 2010, 2011, 2012, 2013, 2014.
|
||||
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012.
|
||||
# Dirgita <dirgitadevina@yahoo.co.id>, 2011, 2012, 2014.
|
||||
# Wibiharto <wibinem@yahoo.com>, 2011.
|
||||
msgid ""
|
||||
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-03-28 08:56+0000\n"
|
||||
"PO-Revision-Date: 2014-03-28 18:58+0700\n"
|
||||
"POT-Creation-Date: 2014-05-22 07:28+0000\n"
|
||||
"PO-Revision-Date: 2014-05-22 16:21+0700\n"
|
||||
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
|
||||
"Language-Team: Indonesian <gnome@i15n.org>\n"
|
||||
"Language-Team: Indonesian <gnome-l10n-id@googlegroups.com>\n"
|
||||
"Language: id\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@ -79,7 +79,7 @@ msgid ""
|
||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||
"dialog."
|
||||
msgstr ""
|
||||
"Ijinkan askes ke perkakas pemantauan dan pengawakutuan internal memakai "
|
||||
"Izinkan askes ke perkakas pemantauan dan pengawakutuan internal memakai "
|
||||
"dialog Alt-F2."
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||
@ -236,11 +236,11 @@ msgid ""
|
||||
"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 ""
|
||||
"Menata tingkat maksimum akurasi lokasi yang diijinkan diperoleh aplikasi. "
|
||||
"Menata tingkat maksimum akurasi lokasi yang diizinkan diperoleh aplikasi. "
|
||||
"Opsi yang valid adalah 'off' (nonaktifkan pelacakan lokasi), "
|
||||
"'country' (negara), 'city' (kota), 'neighborhood' (lingkungan tetangga), "
|
||||
"'street' (jalan), dan 'exact' (eksak, biasanya perlu penerima GPS). Harap "
|
||||
"diingat bahwa ini hanya mengendalikan apa yang diijinkan oleh GeoClue bagi "
|
||||
"diingat bahwa ini hanya mengendalikan apa yang diizinkan oleh GeoClue bagi "
|
||||
"aplikasi dan mereka bisa menemukan sendiri lokasi pengguna memakai sumber "
|
||||
"daya jaringan (walaupun paling baik pada tingkat jalan)."
|
||||
|
||||
@ -341,25 +341,25 @@ msgstr "Pilih Sesi"
|
||||
msgid "Not listed?"
|
||||
msgstr "Tak masuk daftar?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:611
|
||||
#: ../js/gdm/loginDialog.js:616
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(cth., pengguna dari %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:616 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/gdm/loginDialog.js:621 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "Nama pengguna: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:917
|
||||
#: ../js/gdm/loginDialog.js:924
|
||||
msgid "Login Window"
|
||||
msgstr "Jendela Log Masuk"
|
||||
|
||||
#: ../js/gdm/util.js:322
|
||||
#: ../js/gdm/util.js:323
|
||||
msgid "Authentication error"
|
||||
msgstr "Galat otentikasi"
|
||||
|
||||
#: ../js/gdm/util.js:452
|
||||
#: ../js/gdm/util.js:453
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(atau gesekkan jari)"
|
||||
|
||||
@ -369,37 +369,41 @@ msgstr "Perintah tidak ditemukan"
|
||||
|
||||
#: ../js/misc/util.js:148
|
||||
msgid "Could not parse command:"
|
||||
msgstr "Tidak dapat mengurai perintah:"
|
||||
msgstr "Tak dapat mengurai perintah:"
|
||||
|
||||
#: ../js/misc/util.js:156
|
||||
#, javascript-format
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "Eksekusi \"%s\" gagal:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
#: ../js/ui/appDisplay.js:640
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "Aplikasi yang sering dipakai akan muncul di sini"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:751
|
||||
msgid "Frequent"
|
||||
msgstr "Sering"
|
||||
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
#: ../js/ui/appDisplay.js:758
|
||||
msgid "All"
|
||||
msgstr "Semua"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
#: ../js/ui/appDisplay.js:1571
|
||||
msgid "New Window"
|
||||
msgstr "Jendela Baru"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "Hapus dari Favorit"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
#: ../js/ui/appDisplay.js:1599
|
||||
msgid "Add to Favorites"
|
||||
msgstr "Tambah ke Favorit"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1608
|
||||
msgid "Show Details"
|
||||
msgstr "Tampilkan Rincian"
|
||||
|
||||
#: ../js/ui/appFavorites.js:87
|
||||
#, javascript-format
|
||||
msgid "%s has been added to your favorites."
|
||||
@ -410,8 +414,8 @@ msgstr "%s telah ditambahkan ke favorit Anda."
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s telah dihapus dari favorit Anda."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||
#: ../js/ui/status/system.js:334
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
||||
#: ../js/ui/status/system.js:337
|
||||
msgid "Settings"
|
||||
msgstr "Pengaturan"
|
||||
|
||||
@ -422,14 +426,14 @@ msgstr "Ubah Latar…"
|
||||
#. Translators: Shown in calendar event list for all day events
|
||||
#. * Keep it short, best if you can use less then 10 characters
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:64
|
||||
#: ../js/ui/calendar.js:67
|
||||
msgctxt "event list time"
|
||||
msgid "All Day"
|
||||
msgstr "Sepanjang Hari"
|
||||
|
||||
#. Translators: Shown in calendar event list, if 24h format,
|
||||
#. \u2236 is a ratio character, similar to : */
|
||||
#: ../js/ui/calendar.js:70
|
||||
#: ../js/ui/calendar.js:73
|
||||
msgctxt "event list time"
|
||||
msgid "%H∶%M"
|
||||
msgstr "%H∶%M"
|
||||
@ -437,7 +441,7 @@ msgstr "%H∶%M"
|
||||
#. Translators: Shown in calendar event list, if 12h format,
|
||||
#. \u2236 is a ratio character, similar to : and \u2009 is
|
||||
#. a thin space */
|
||||
#: ../js/ui/calendar.js:79
|
||||
#: ../js/ui/calendar.js:82
|
||||
msgctxt "event list time"
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
@ -447,43 +451,43 @@ msgstr "%l∶%M %p"
|
||||
#. * NOTE: These grid abbreviations are always shown together
|
||||
#. * and in order, e.g. "S M T W T F S".
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:110
|
||||
#: ../js/ui/calendar.js:113
|
||||
msgctxt "grid sunday"
|
||||
msgid "S"
|
||||
msgstr "M"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Monday */
|
||||
#: ../js/ui/calendar.js:112
|
||||
#: ../js/ui/calendar.js:115
|
||||
msgctxt "grid monday"
|
||||
msgid "M"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Tuesday */
|
||||
#: ../js/ui/calendar.js:114
|
||||
#: ../js/ui/calendar.js:117
|
||||
msgctxt "grid tuesday"
|
||||
msgid "T"
|
||||
msgstr "S"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Wednesday */
|
||||
#: ../js/ui/calendar.js:116
|
||||
#: ../js/ui/calendar.js:119
|
||||
msgctxt "grid wednesday"
|
||||
msgid "W"
|
||||
msgstr "R"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Thursday */
|
||||
#: ../js/ui/calendar.js:118
|
||||
#: ../js/ui/calendar.js:121
|
||||
msgctxt "grid thursday"
|
||||
msgid "T"
|
||||
msgstr "K"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Friday */
|
||||
#: ../js/ui/calendar.js:120
|
||||
#: ../js/ui/calendar.js:123
|
||||
msgctxt "grid friday"
|
||||
msgid "F"
|
||||
msgstr "J"
|
||||
|
||||
#. Translators: Calendar grid abbreviation for Saturday */
|
||||
#: ../js/ui/calendar.js:122
|
||||
#: ../js/ui/calendar.js:125
|
||||
msgctxt "grid saturday"
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
@ -494,97 +498,93 @@ msgstr "S"
|
||||
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
|
||||
#. * both be 'T').
|
||||
#. */
|
||||
#: ../js/ui/calendar.js:135
|
||||
#: ../js/ui/calendar.js:138
|
||||
msgctxt "list sunday"
|
||||
msgid "Su"
|
||||
msgstr "Min"
|
||||
|
||||
#. Translators: Event list abbreviation for Monday */
|
||||
#: ../js/ui/calendar.js:137
|
||||
#: ../js/ui/calendar.js:140
|
||||
msgctxt "list monday"
|
||||
msgid "M"
|
||||
msgstr "Sen"
|
||||
|
||||
#. Translators: Event list abbreviation for Tuesday */
|
||||
#: ../js/ui/calendar.js:139
|
||||
#: ../js/ui/calendar.js:142
|
||||
msgctxt "list tuesday"
|
||||
msgid "T"
|
||||
msgstr "Sel"
|
||||
|
||||
#. Translators: Event list abbreviation for Wednesday */
|
||||
#: ../js/ui/calendar.js:141
|
||||
#: ../js/ui/calendar.js:144
|
||||
msgctxt "list wednesday"
|
||||
msgid "W"
|
||||
msgstr "Rab"
|
||||
|
||||
#. Translators: Event list abbreviation for Thursday */
|
||||
#: ../js/ui/calendar.js:143
|
||||
#: ../js/ui/calendar.js:146
|
||||
msgctxt "list thursday"
|
||||
msgid "Th"
|
||||
msgstr "Kam"
|
||||
|
||||
#. Translators: Event list abbreviation for Friday */
|
||||
#: ../js/ui/calendar.js:145
|
||||
#: ../js/ui/calendar.js:148
|
||||
msgctxt "list friday"
|
||||
msgid "F"
|
||||
msgstr "Jum"
|
||||
|
||||
#. Translators: Event list abbreviation for Saturday */
|
||||
#: ../js/ui/calendar.js:147
|
||||
#: ../js/ui/calendar.js:150
|
||||
msgctxt "list saturday"
|
||||
msgid "S"
|
||||
msgstr "Sab"
|
||||
|
||||
#: ../js/ui/calendar.js:390
|
||||
msgid "calendar:MY"
|
||||
msgstr "calendar:MY"
|
||||
|
||||
#: ../js/ui/calendar.js:450
|
||||
#: ../js/ui/calendar.js:453
|
||||
msgid "Previous month"
|
||||
msgstr "Bulan sebelumnya"
|
||||
|
||||
#: ../js/ui/calendar.js:460
|
||||
#: ../js/ui/calendar.js:463
|
||||
msgid "Next month"
|
||||
msgstr "Bulan selanjutnya"
|
||||
|
||||
#. Translators: Text to show if there are no events */
|
||||
#: ../js/ui/calendar.js:772
|
||||
#: ../js/ui/calendar.js:775
|
||||
msgid "Nothing Scheduled"
|
||||
msgstr "Tidak Ada Jadwal"
|
||||
msgstr "Tak Ada Jadwal"
|
||||
|
||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||
#: ../js/ui/calendar.js:790
|
||||
#: ../js/ui/calendar.js:793
|
||||
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:796
|
||||
msgctxt "calendar heading"
|
||||
msgid "%A, %B %d, %Y"
|
||||
msgstr "%A, %d %B %Y"
|
||||
|
||||
#: ../js/ui/calendar.js:804
|
||||
#: ../js/ui/calendar.js:807
|
||||
msgid "Today"
|
||||
msgstr "Hari ini"
|
||||
|
||||
#: ../js/ui/calendar.js:808
|
||||
#: ../js/ui/calendar.js:811
|
||||
msgid "Tomorrow"
|
||||
msgstr "Besok"
|
||||
|
||||
#: ../js/ui/calendar.js:819
|
||||
#: ../js/ui/calendar.js:822
|
||||
msgid "This week"
|
||||
msgstr "Minggu ini"
|
||||
|
||||
#: ../js/ui/calendar.js:827
|
||||
#: ../js/ui/calendar.js:830
|
||||
msgid "Next week"
|
||||
msgstr "Minggu depan"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:90
|
||||
#: ../js/ui/components/automountManager.js:91
|
||||
msgid "External drive connected"
|
||||
msgstr "Drive eksternal tersambung"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:101
|
||||
#: ../js/ui/components/automountManager.js:102
|
||||
msgid "External drive disconnected"
|
||||
msgstr "Drive eksternal terputus"
|
||||
|
||||
@ -640,7 +640,7 @@ msgstr "Layanan: "
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:311
|
||||
msgid "Authentication required by wireless network"
|
||||
msgstr "Otentikasi dibutuhkan oleh jaringan nirkabel"
|
||||
msgstr "Otentikasi diperlukan oleh jaringan nirkabel"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:312
|
||||
#, javascript-format
|
||||
@ -669,7 +669,7 @@ msgstr "Perlu kode PIN"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:331
|
||||
msgid "PIN code is needed for the mobile broadband device"
|
||||
msgstr "Kode PIN dibutuhkan untuk perangkat data seluler"
|
||||
msgstr "Kode PIN diperlukan untuk perangkat data seluler"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:332
|
||||
msgid "PIN: "
|
||||
@ -729,77 +729,77 @@ msgid "Mute"
|
||||
msgstr "Bisu"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
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
|
||||
#: ../js/ui/components/telepathyClient.js:965
|
||||
msgid "Yesterday, %H∶%M"
|
||||
msgstr "Kemarin, %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
|
||||
#: ../js/ui/components/telepathyClient.js:972
|
||||
msgid "%A, %H∶%M"
|
||||
msgstr "%A, %H∶%M"
|
||||
|
||||
#. Translators: this is the month name and day number
|
||||
#. followed by a time string in 24h format.
|
||||
#. i.e. "May 25, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:976
|
||||
#: ../js/ui/components/telepathyClient.js:979
|
||||
msgid "%B %d, %H∶%M"
|
||||
msgstr "%d %B, %H∶%M"
|
||||
|
||||
#. 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" */
|
||||
#: ../js/ui/components/telepathyClient.js:982
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
msgid "%B %d %Y, %H∶%M"
|
||||
msgstr "%d %B %Y, %H∶%M"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:991
|
||||
#: ../js/ui/components/telepathyClient.js:994
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%H∶%M"
|
||||
|
||||
#. Translators: this is the word "Yesterday" followed by a
|
||||
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
||||
#: ../js/ui/components/telepathyClient.js:998
|
||||
#: ../js/ui/components/telepathyClient.js:1001
|
||||
msgid "Yesterday, %l∶%M %p"
|
||||
msgstr "Kemarin, %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
|
||||
#: ../js/ui/components/telepathyClient.js:1008
|
||||
msgid "%A, %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
|
||||
#: ../js/ui/components/telepathyClient.js:1015
|
||||
msgid "%B %d, %l∶%M %p"
|
||||
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
|
||||
#: ../js/ui/components/telepathyClient.js:1021
|
||||
msgid "%B %d %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. */
|
||||
#: ../js/ui/components/telepathyClient.js:1051
|
||||
#: ../js/ui/components/telepathyClient.js:1054
|
||||
#, javascript-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s sekarang dikenal sebagai %s"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1154
|
||||
#: ../js/ui/components/telepathyClient.js:1158
|
||||
#, javascript-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "Undangan ke %s"
|
||||
@ -807,38 +807,38 @@ msgstr "Undangan ke %s"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1162
|
||||
#: ../js/ui/components/telepathyClient.js:1166
|
||||
#, javascript-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
msgstr "%s mengundang Anda untuk bergabung dengan %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1164
|
||||
#: ../js/ui/components/telepathyClient.js:1199
|
||||
#: ../js/ui/components/telepathyClient.js:1233
|
||||
#: ../js/ui/components/telepathyClient.js:1290
|
||||
#: ../js/ui/components/telepathyClient.js:1168
|
||||
#: ../js/ui/components/telepathyClient.js:1203
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
msgid "Decline"
|
||||
msgstr "Tolak"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Accept"
|
||||
msgstr "Terima"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1189
|
||||
#: ../js/ui/components/telepathyClient.js:1193
|
||||
#, javascript-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "Panggilan video dari %s"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1192
|
||||
#: ../js/ui/components/telepathyClient.js:1196
|
||||
#, javascript-format
|
||||
msgid "Call from %s"
|
||||
msgstr "Panggilan dari %s"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun */
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1210
|
||||
msgid "Answer"
|
||||
msgstr "Jawab"
|
||||
|
||||
@ -847,111 +847,111 @@ msgstr "Jawab"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#. */
|
||||
#: ../js/ui/components/telepathyClient.js:1227
|
||||
#: ../js/ui/components/telepathyClient.js:1231
|
||||
#, javascript-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s sedang mengirimi Anda %s"
|
||||
|
||||
#. To translators: The parameter is the contact's alias */
|
||||
#: ../js/ui/components/telepathyClient.js:1256
|
||||
#: ../js/ui/components/telepathyClient.js:1260
|
||||
#, javascript-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s ingin minta ijin melihat Anda ketika Anda daring"
|
||||
msgstr "%s ingin minta izin melihat Anda ketika Anda daring"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Network error"
|
||||
msgstr "Galat jaringan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Authentication failed"
|
||||
msgstr "Otentikasi gagal"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Encryption error"
|
||||
msgstr "Galat enkripsi"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1347
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Sertifikat tidak disediakan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1349
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Sertifikat tidak dipercaya"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate expired"
|
||||
msgstr "Sertifikat kadaluarsa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Sertifikat tidak diaktifkan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Nama host sertifikat tidak cocok"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1357
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Sidik jari sertifikat tidak cocok"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sertifikat ditandatangani sendiri"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Status diatur ke luring"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Enkripsi tidak tersedia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Sertifikat tidak valid"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Koneksi telah ditolak"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1369
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Koneksi tak dapat dijalin"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1371
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Koneksi telah terputus"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1373
|
||||
#: ../js/ui/components/telepathyClient.js:1378
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "Akun ini telah tersambung pada server"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1375
|
||||
#: ../js/ui/components/telepathyClient.js:1380
|
||||
msgid ""
|
||||
"Connection has been replaced by a new connection using the same resource"
|
||||
msgstr ""
|
||||
"Koneksi telah digantikan oleh koneksi baru memakai sumberdaya yang sama"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1377
|
||||
#: ../js/ui/components/telepathyClient.js:1382
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "Akun ini sudah ada di server"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1379
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "Server kini terlalu sibuk untuk menangani koneksi"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1381
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Sertifikat telah dicabut"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
#: ../js/ui/components/telepathyClient.js:1388
|
||||
msgid ""
|
||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr ""
|
||||
"Sertifikat memakai algorima cipher yang tak aman atau lemah secara "
|
||||
"kriptografi"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1385
|
||||
#: ../js/ui/components/telepathyClient.js:1390
|
||||
msgid ""
|
||||
"The length of the server certificate, or the depth of the server certificate "
|
||||
"chain, exceed the limits imposed by the cryptography library"
|
||||
@ -959,22 +959,22 @@ msgstr ""
|
||||
"Panjang sertifikat server, atau kedalaman rantai sertifikat server, "
|
||||
"melampaui batas yang diberlakukan oleh pustaka kriptografi"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1387
|
||||
#: ../js/ui/components/telepathyClient.js:1392
|
||||
msgid "Internal error"
|
||||
msgstr "Galat internal"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1397
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#, javascript-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "Tak bisa menyambung ke %s"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#: ../js/ui/components/telepathyClient.js:1407
|
||||
msgid "View account"
|
||||
msgstr "Tilik akun"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1439
|
||||
#: ../js/ui/components/telepathyClient.js:1444
|
||||
msgid "Unknown reason"
|
||||
msgstr "Alasan yang tidak diketahui"
|
||||
|
||||
@ -990,22 +990,22 @@ msgstr "Tampilkan Aplikasi"
|
||||
msgid "Dash"
|
||||
msgstr "Dash"
|
||||
|
||||
#: ../js/ui/dateMenu.js:91
|
||||
#: ../js/ui/dateMenu.js:97
|
||||
msgid "Open Calendar"
|
||||
msgstr "Buka Kalender"
|
||||
|
||||
#: ../js/ui/dateMenu.js:95
|
||||
#: ../js/ui/dateMenu.js:101
|
||||
msgid "Open Clocks"
|
||||
msgstr "Buka Jam"
|
||||
|
||||
#: ../js/ui/dateMenu.js:102
|
||||
#: ../js/ui/dateMenu.js:108
|
||||
msgid "Date & Time Settings"
|
||||
msgstr "Pengaturan Waktu & Tanggal"
|
||||
|
||||
#. 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:205
|
||||
msgid "%A %B %e, %Y"
|
||||
msgstr "%A, %e %B %Y"
|
||||
|
||||
@ -1122,13 +1122,13 @@ msgid "Other users are logged in."
|
||||
msgstr "Pengguna lain sedang log masuk."
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login */
|
||||
#: ../js/ui/endSessionDialog.js:618
|
||||
#: ../js/ui/endSessionDialog.js:619
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (jarak jauh)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console */
|
||||
#: ../js/ui/endSessionDialog.js:621
|
||||
#: ../js/ui/endSessionDialog.js:622
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (konsol)"
|
||||
@ -1142,7 +1142,7 @@ msgstr "Pasang"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Unduh dan pasang \"%s\" dari extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:641 ../js/ui/status/keyboard.js:335
|
||||
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:335
|
||||
msgid "Keyboard"
|
||||
msgstr "Papan Ketik"
|
||||
|
||||
@ -1230,16 +1230,16 @@ msgstr "Tiada Pesan"
|
||||
msgid "Message Tray"
|
||||
msgstr "Baki Pesan"
|
||||
|
||||
#: ../js/ui/messageTray.js:2962
|
||||
#: ../js/ui/messageTray.js:2967
|
||||
msgid "System Information"
|
||||
msgstr "Informasi Sistem"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:515 ../src/shell-app.c:425
|
||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "Tak dikenal"
|
||||
|
||||
#: ../js/ui/overviewControls.js:483 ../js/ui/screenShield.js:151
|
||||
#: ../js/ui/overviewControls.js:488 ../js/ui/screenShield.js:151
|
||||
#, javascript-format
|
||||
msgid "%d new message"
|
||||
msgid_plural "%d new messages"
|
||||
@ -1271,7 +1271,7 @@ msgstr "Keluar"
|
||||
msgid "Activities"
|
||||
msgstr "Aktivitas"
|
||||
|
||||
#: ../js/ui/panel.js:914
|
||||
#: ../js/ui/panel.js:915
|
||||
msgid "Top Bar"
|
||||
msgstr "Bar Atas"
|
||||
|
||||
@ -1284,7 +1284,7 @@ msgstr "toggle-switch-intl"
|
||||
msgid "Enter a Command"
|
||||
msgstr "Ketikkan Perintah"
|
||||
|
||||
#: ../js/ui/runDialog.js:114
|
||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:117
|
||||
msgid "Close"
|
||||
msgstr "Tutup"
|
||||
|
||||
@ -1300,7 +1300,7 @@ msgid "%d new notification"
|
||||
msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d pemberitahuan baru"
|
||||
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
|
||||
msgid "Lock"
|
||||
msgstr "Kunci"
|
||||
|
||||
@ -1308,21 +1308,21 @@ msgstr "Kunci"
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "GNOME perlu mengunci layar"
|
||||
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1312
|
||||
msgid "Unable to lock"
|
||||
msgstr "Tak bisa mengunci"
|
||||
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1313
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Kunci diblokir oleh suatu aplikasi"
|
||||
|
||||
#: ../js/ui/search.js:603
|
||||
#: ../js/ui/search.js:606
|
||||
msgid "Searching…"
|
||||
msgstr "Mencari…"
|
||||
|
||||
#: ../js/ui/search.js:649
|
||||
#: ../js/ui/search.js:652
|
||||
msgid "No results."
|
||||
msgstr "Tidak ada yang cocok."
|
||||
msgstr "Tak ada yang cocok."
|
||||
|
||||
#: ../js/ui/shellEntry.js:27
|
||||
msgid "Copy"
|
||||
@ -1384,11 +1384,11 @@ msgstr "Tombol Pantul"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "Tombol Tetikus"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:143
|
||||
#: ../js/ui/status/accessibility.js:144
|
||||
msgid "High Contrast"
|
||||
msgstr "Kontras Tinggi"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:192
|
||||
#: ../js/ui/status/accessibility.js:193
|
||||
msgid "Large Text"
|
||||
msgstr "Teks Besar"
|
||||
|
||||
@ -1398,8 +1398,8 @@ 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/rfkill.js:105
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/rfkill.js:114
|
||||
msgid "Turn Off"
|
||||
msgstr "Matikan"
|
||||
|
||||
@ -1457,37 +1457,37 @@ msgstr "Tersambung"
|
||||
#. 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
|
||||
msgid "unmanaged"
|
||||
msgstr "tak dikelola"
|
||||
msgid "Unmanaged"
|
||||
msgstr "Tak Dikelola"
|
||||
|
||||
#: ../js/ui/status/network.js:428
|
||||
msgid "disconnecting..."
|
||||
msgstr "memutus..."
|
||||
msgid "Disconnecting"
|
||||
msgstr "Memutus"
|
||||
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "menghubungi..."
|
||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Menyambung"
|
||||
|
||||
#. 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
|
||||
msgid "authentication required"
|
||||
msgstr "diperlukan otentikasi"
|
||||
#: ../js/ui/status/network.js:437
|
||||
msgid "Authentication required"
|
||||
msgstr "Diperlukan otentikasi"
|
||||
|
||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||
#. module, which is missing */
|
||||
#: ../js/ui/status/network.js:445
|
||||
msgid "firmware missing"
|
||||
msgstr "firmware hilang"
|
||||
msgid "Firmware missing"
|
||||
msgstr "Firmware hilang"
|
||||
|
||||
#. 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
|
||||
msgid "unavailable"
|
||||
msgstr "tidak tersedia"
|
||||
msgid "Unavailable"
|
||||
msgstr "Tak tersedia"
|
||||
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "koneksi gagal"
|
||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Koneksi gagal"
|
||||
|
||||
#: ../js/ui/status/network.js:467
|
||||
msgid "Wired Settings"
|
||||
@ -1541,7 +1541,7 @@ msgstr "Pilih jaringan"
|
||||
msgid "No Networks"
|
||||
msgstr "Tiada Jaringan"
|
||||
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Pakai saklar perangkat keras untuk mematikan"
|
||||
|
||||
@ -1561,11 +1561,20 @@ msgstr "Nyalakan"
|
||||
msgid "Hotspot Active"
|
||||
msgstr "Hotspot Aktif"
|
||||
|
||||
#: ../js/ui/status/network.js:1254
|
||||
msgid "Connecting"
|
||||
msgstr "Menyambung"
|
||||
#: ../js/ui/status/network.js:1362
|
||||
msgid "connecting..."
|
||||
msgstr "menghubungi..."
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88
|
||||
#. Translators: this is for network connections that require some kind of key or password */
|
||||
#: ../js/ui/status/network.js:1365
|
||||
msgid "authentication required"
|
||||
msgstr "diperlukan otentikasi"
|
||||
|
||||
#: ../js/ui/status/network.js:1367
|
||||
msgid "connection failed"
|
||||
msgstr "koneksi gagal"
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
||||
msgid "Network Settings"
|
||||
msgstr "Pengaturan Jaringan"
|
||||
|
||||
@ -1581,10 +1590,6 @@ msgstr "VPN"
|
||||
msgid "Network Manager"
|
||||
msgstr "Manajer Jaringan"
|
||||
|
||||
#: ../js/ui/status/network.js:1646
|
||||
msgid "Connection failed"
|
||||
msgstr "Koneksi gagal"
|
||||
|
||||
#: ../js/ui/status/network.js:1647
|
||||
msgid "Activation of network connection failed"
|
||||
msgstr "Aktivasi koneksi jaringan gagal"
|
||||
@ -1619,31 +1624,31 @@ msgstr "UPS"
|
||||
msgid "Battery"
|
||||
msgstr "Baterai"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:82
|
||||
#: ../js/ui/status/rfkill.js:83
|
||||
msgid "Airplane Mode"
|
||||
msgstr "Mode Pesawat Terbang"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
#: ../js/ui/status/rfkill.js:85
|
||||
msgid "On"
|
||||
msgstr "Nyala"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
#: ../js/ui/status/system.js:317
|
||||
msgid "Switch User"
|
||||
msgstr "Ganti Pengguna"
|
||||
|
||||
#: ../js/ui/status/system.js:319
|
||||
#: ../js/ui/status/system.js:322
|
||||
msgid "Log Out"
|
||||
msgstr "Keluar"
|
||||
|
||||
#: ../js/ui/status/system.js:338
|
||||
#: ../js/ui/status/system.js:341
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Kunci Orientasi"
|
||||
|
||||
#: ../js/ui/status/system.js:346
|
||||
#: ../js/ui/status/system.js:349
|
||||
msgid "Suspend"
|
||||
msgstr "Suspensi"
|
||||
|
||||
#: ../js/ui/status/system.js:349
|
||||
#: ../js/ui/status/system.js:352
|
||||
msgid "Power Off"
|
||||
msgstr "Matikan"
|
||||
|
||||
@ -1680,27 +1685,67 @@ msgstr "Cari"
|
||||
msgid "“%s” is ready"
|
||||
msgstr "'%s' siap"
|
||||
|
||||
#: ../js/ui/windowManager.js:56
|
||||
#: ../js/ui/windowManager.js:57
|
||||
msgid "Do you want to keep these display settings?"
|
||||
msgstr "Apakah Anda ingin mempertahankan pengaturan tampilan ini?"
|
||||
|
||||
#. Translators: this and the following message should be limited in lenght,
|
||||
#. to avoid ellipsizing the labels.
|
||||
#. */
|
||||
#: ../js/ui/windowManager.js:75
|
||||
#: ../js/ui/windowManager.js:76
|
||||
msgid "Revert Settings"
|
||||
msgstr "Balikkan Tatanan"
|
||||
|
||||
#: ../js/ui/windowManager.js:79
|
||||
#: ../js/ui/windowManager.js:80
|
||||
msgid "Keep Changes"
|
||||
msgstr "Simpan Perubahan"
|
||||
|
||||
#: ../js/ui/windowManager.js:97
|
||||
#: ../js/ui/windowManager.js:99
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
msgstr[0] "Perubahan tatanan akan dikembalikan dalam %d detik"
|
||||
|
||||
#: ../js/ui/windowMenu.js:33
|
||||
msgid "Minimize"
|
||||
msgstr "Minimalkan"
|
||||
|
||||
#: ../js/ui/windowMenu.js:40
|
||||
msgid "Unmaximize"
|
||||
msgstr "Tak Maksimalkan"
|
||||
|
||||
#: ../js/ui/windowMenu.js:44
|
||||
msgid "Maximize"
|
||||
msgstr "Maksimalkan"
|
||||
|
||||
#: ../js/ui/windowMenu.js:51
|
||||
msgid "Move"
|
||||
msgstr "Pindah"
|
||||
|
||||
#: ../js/ui/windowMenu.js:57
|
||||
msgid "Resize"
|
||||
msgstr "Ubah Ukuran"
|
||||
|
||||
#: ../js/ui/windowMenu.js:64
|
||||
msgid "Move Titlebar Onscreen"
|
||||
msgstr "Pindahkan Bilah Judul Pada Layar"
|
||||
|
||||
#: ../js/ui/windowMenu.js:69
|
||||
msgid "Always on Top"
|
||||
msgstr "Selalu di Puncak"
|
||||
|
||||
#: ../js/ui/windowMenu.js:86
|
||||
msgid "Always on Visible Workspace"
|
||||
msgstr "Selalu pada Ruang Kerja yang Tampak"
|
||||
|
||||
#: ../js/ui/windowMenu.js:103
|
||||
msgid "Move to Workspace Up"
|
||||
msgstr "Pindah ke Ruang Kerja Atas"
|
||||
|
||||
#: ../js/ui/windowMenu.js:108
|
||||
msgid "Move to Workspace Down"
|
||||
msgstr "Pindah ke Ruang Kerja Bawah"
|
||||
|
||||
#: ../src/calendar-server/evolution-calendar.desktop.in.in.h:1
|
||||
msgid "Evolution Calendar"
|
||||
msgstr "Evolution Kalender"
|
||||
@ -1754,6 +1799,6 @@ msgstr "Sandi tidak cocok."
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "Sandi tidak boleh kosong"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:343
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "Dialog otentikasi ditolak oleh pengguna"
|
||||
|
54
po/it.po
54
po/it.po
@ -11,8 +11,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-04-06 07:54+0000\n"
|
||||
"PO-Revision-Date: 2014-04-06 14:15+0100\n"
|
||||
"POT-Creation-Date: 2014-05-27 19:20+0000\n"
|
||||
"PO-Revision-Date: 2014-05-31 14:54+0100\n"
|
||||
"Last-Translator: Milo Casagrande <milo@milo.name>\n"
|
||||
"Language-Team: Italiano <tp@lists.linux.it>\n"
|
||||
"Language: it\n"
|
||||
@ -421,7 +421,7 @@ msgid "%s has been removed from your favorites."
|
||||
msgstr "%s è stato rimosso dai preferiti."
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||
#: ../js/ui/status/system.js:334
|
||||
#: ../js/ui/status/system.js:337
|
||||
msgid "Settings"
|
||||
msgstr "Impostazioni"
|
||||
|
||||
@ -1076,7 +1076,7 @@ msgstr[1] "Il sistema verrà spento automaticamente tra %d secondi."
|
||||
#: ../js/ui/endSessionDialog.js:93
|
||||
msgctxt "checkbox"
|
||||
msgid "Install pending software updates"
|
||||
msgstr "Installa gli aggiornamenti software in sospeso"
|
||||
msgstr "Installare gli aggiornamenti software in sospeso"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
|
||||
msgctxt "button"
|
||||
@ -1130,7 +1130,7 @@ msgstr "Installa e spegni"
|
||||
#: ../js/ui/endSessionDialog.js:131
|
||||
msgctxt "checkbox"
|
||||
msgid "Power off after updates are installed"
|
||||
msgstr "Spegne dopo aver installato gli aggiornamenti"
|
||||
msgstr "Spegnere dopo aver installato gli aggiornamenti"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:315
|
||||
msgid "Running on battery power: please plug in before installing updates."
|
||||
@ -1167,7 +1167,7 @@ msgstr "Installa"
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "Scaricare e installare «%s» da extensions.gnome.org?"
|
||||
|
||||
#: ../js/ui/keyboard.js:641 ../js/ui/status/keyboard.js:335
|
||||
#: ../js/ui/keyboard.js:641 ../js/ui/status/keyboard.js:339
|
||||
msgid "Keyboard"
|
||||
msgstr "Tastiera"
|
||||
|
||||
@ -1328,7 +1328,7 @@ msgid_plural "%d new notifications"
|
||||
msgstr[0] "%d nuova notifica"
|
||||
msgstr[1] "%d nuove notifiche"
|
||||
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:342
|
||||
#: ../js/ui/screenShield.js:474 ../js/ui/status/system.js:345
|
||||
msgid "Lock"
|
||||
msgstr "Blocca"
|
||||
|
||||
@ -1344,11 +1344,11 @@ msgstr "Impossibile bloccare"
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "Il blocco è stato impedito da un'applicazione."
|
||||
|
||||
#: ../js/ui/search.js:603
|
||||
#: ../js/ui/search.js:606
|
||||
msgid "Searching…"
|
||||
msgstr "Ricerca…"
|
||||
|
||||
#: ../js/ui/search.js:649
|
||||
#: ../js/ui/search.js:652
|
||||
msgid "No results."
|
||||
msgstr "Nessun risultato."
|
||||
|
||||
@ -1427,8 +1427,8 @@ 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/rfkill.js:105
|
||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
||||
#: ../js/ui/status/rfkill.js:114
|
||||
msgid "Turn Off"
|
||||
msgstr "Spegni"
|
||||
|
||||
@ -1451,7 +1451,7 @@ msgstr "Non collegato"
|
||||
msgid "Brightness"
|
||||
msgstr "Luminosità"
|
||||
|
||||
#: ../js/ui/status/keyboard.js:403
|
||||
#: ../js/ui/status/keyboard.js:407
|
||||
msgid "Show Keyboard Layout"
|
||||
msgstr "Mostra disposizione tastiera"
|
||||
|
||||
@ -1461,15 +1461,13 @@ msgstr "Posizione"
|
||||
|
||||
# (ndt) o disabilitata?
|
||||
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
|
||||
#| msgid "Disabled"
|
||||
msgid "Disable"
|
||||
msgstr "Disabilitato"
|
||||
|
||||
# (ndt) o abilitata?
|
||||
#: ../js/ui/status/location.js:165
|
||||
#| msgid "Enabled"
|
||||
msgid "Enable"
|
||||
msgstr "Abilitato"
|
||||
msgstr "Abilita"
|
||||
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "In Use"
|
||||
@ -1543,15 +1541,15 @@ msgstr "Usa come connessione a Internet"
|
||||
|
||||
#: ../js/ui/status/network.js:776
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "La modalità aero è attiva"
|
||||
msgstr "La modalità aereo è attiva"
|
||||
|
||||
#: ../js/ui/status/network.js:777
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr "Il Wi-Fi è disabilitato quando la modalità aero è attiva"
|
||||
msgstr "Il Wi-Fi è disabilitato quando la modalità aereo è attiva"
|
||||
|
||||
#: ../js/ui/status/network.js:778
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "Disattiva modalità aero"
|
||||
msgstr "Disattiva modalità aereo"
|
||||
|
||||
#: ../js/ui/status/network.js:787
|
||||
msgid "Wi-Fi is Off"
|
||||
@ -1577,7 +1575,7 @@ msgstr "Seleziona una rete"
|
||||
msgid "No Networks"
|
||||
msgstr "Nessuna rete"
|
||||
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr "Usare l'interruttore hardware per disattivare"
|
||||
|
||||
@ -1601,7 +1599,7 @@ msgstr "Hotspot attivo"
|
||||
msgid "Connecting"
|
||||
msgstr "Connessione"
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
||||
msgid "Network Settings"
|
||||
msgstr "Impostazioni rete"
|
||||
|
||||
@ -1656,31 +1654,31 @@ msgstr "UPS"
|
||||
msgid "Battery"
|
||||
msgstr "Batteria"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:82
|
||||
#: ../js/ui/status/rfkill.js:83
|
||||
msgid "Airplane Mode"
|
||||
msgstr "Modalità aero"
|
||||
msgstr "Modalità aereo"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
#: ../js/ui/status/rfkill.js:85
|
||||
msgid "On"
|
||||
msgstr "On"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
#: ../js/ui/status/system.js:317
|
||||
msgid "Switch User"
|
||||
msgstr "Cambia utente"
|
||||
|
||||
#: ../js/ui/status/system.js:319
|
||||
#: ../js/ui/status/system.js:322
|
||||
msgid "Log Out"
|
||||
msgstr "Termina sessione"
|
||||
|
||||
#: ../js/ui/status/system.js:338
|
||||
#: ../js/ui/status/system.js:341
|
||||
msgid "Orientation Lock"
|
||||
msgstr "Blocco orientazione"
|
||||
|
||||
#: ../js/ui/status/system.js:346
|
||||
#: ../js/ui/status/system.js:349
|
||||
msgid "Suspend"
|
||||
msgstr "Sospendi"
|
||||
|
||||
#: ../js/ui/status/system.js:349
|
||||
#: ../js/ui/status/system.js:352
|
||||
msgid "Power Off"
|
||||
msgstr "Spegni"
|
||||
|
||||
|
351
po/ja.po
351
po/ja.po
@ -8,14 +8,15 @@
|
||||
# Hideki Yamane <henrich@debian.org>, 2011.
|
||||
# Takanori MATSUURA <t.matsuu@gmail.com>, 2012.
|
||||
# Yoji TOYODA <bsyamato@sea.plala.or.jp>, 2013.
|
||||
# Ikuya Awashiro <ikuya@fruitsbasket.info>, 2014.
|
||||
#
|
||||
msgid ""
|
||||
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-03-17 15:45+0000\n"
|
||||
"PO-Revision-Date: 2014-03-24 08:19+0900\n"
|
||||
"Last-Translator: Jiro Matsuzawa <jmatsuzawa@gnome.org>\n"
|
||||
"POT-Creation-Date: 2014-04-12 20:01+0000\n"
|
||||
"PO-Revision-Date: 2014-04-13 13:11+0900\n"
|
||||
"Last-Translator: Ikuya Awashiro <ikuya@fruitsbasket.info>\n"
|
||||
"Language-Team: Japanese <gnome-translation@gnome.gr.jp>\n"
|
||||
"Language: ja\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -78,20 +79,16 @@ msgid "Allows access to internal debugging and monitoring tools using the Alt-F2
|
||||
msgstr "Alt-F2 ダイアログを利用した内部のデバッグツールとモニターツールへのアクセスを許可します。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||
#, fuzzy
|
||||
#| msgid "Uuids of extensions to enable"
|
||||
msgid "UUIDs of extensions to enable"
|
||||
msgstr "有効にする拡張機能の UUID"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
|
||||
#, fuzzy
|
||||
#| msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension DBus methods on org.gnome.Shell."
|
||||
msgid "GNOME Shell extensions have a UUID property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension D-Bus methods on org.gnome.Shell."
|
||||
msgstr "GNOME Shell の拡張機能には UUID プロパティがあり、このキーは、ロードしたい拡張機能の UUID のリストです。ロードしたい拡張機能はこのリストに含めなければなりません。このリストは org.gnome.Shell の EnableExtensions や DisableExtensions といった DBus メソッドでも操作できます。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||
msgid "Disables the validation of extension version compatibility"
|
||||
msgstr ""
|
||||
msgstr "拡張機能のバージョン互換の検証を無効にする"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
||||
msgid "GNOME Shell will only load extensions that claim to support the current running version. Enabling this option will disable this check and try to load all extensions regardless of the versions they claim to support."
|
||||
@ -114,14 +111,10 @@ msgid "History for the looking glass dialog"
|
||||
msgstr "looking glass ダイアログの履歴"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||
#, fuzzy
|
||||
#| msgid "Always show the 'Log out' menuitem in the user menu."
|
||||
msgid "Always show the 'Log out' menu item in the user menu."
|
||||
msgstr "ユーザーメニューに「ログアウト」を常に表示する"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||
#, fuzzy
|
||||
#| msgid "This key overrides the automatic hiding of the 'Log out' menuitem in single-user, single-session situations."
|
||||
msgid "This key overrides the automatic hiding of the 'Log out' menu item in single-user, single-session situations."
|
||||
msgstr "このキーは、単一ユーザー、単一セッション状況で「ログアウト」メニューアイテムを自動的に非表示にする機能よりも優先します。"
|
||||
|
||||
@ -191,7 +184,7 @@ msgstr "使いたいキーボードの種類です。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||
msgid "The maximum accuracy level of location."
|
||||
msgstr ""
|
||||
msgstr "場所の最大精度レベルです。"
|
||||
|
||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||
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 allow applications to see and they can find user's location on their own using network resources (albeit with street-level accuracy at best)."
|
||||
@ -271,33 +264,33 @@ msgctxt "button"
|
||||
msgid "Sign In"
|
||||
msgstr "サインイン"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:270
|
||||
#: ../js/gdm/loginDialog.js:271
|
||||
msgid "Choose Session"
|
||||
msgstr "セッションを選択する"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:430
|
||||
#: ../js/gdm/loginDialog.js:431
|
||||
msgid "Not listed?"
|
||||
msgstr "アカウントが見つかりませんか?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:608
|
||||
#: ../js/gdm/loginDialog.js:616
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(たとえば、user あるいは %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:613 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/gdm/loginDialog.js:621 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "ユーザー名: "
|
||||
|
||||
#: ../js/gdm/loginDialog.js:884
|
||||
#: ../js/gdm/loginDialog.js:924
|
||||
msgid "Login Window"
|
||||
msgstr "ログインウィンドウ"
|
||||
|
||||
#: ../js/gdm/util.js:322
|
||||
#: ../js/gdm/util.js:323
|
||||
msgid "Authentication error"
|
||||
msgstr "認証エラー"
|
||||
|
||||
#: ../js/gdm/util.js:452
|
||||
#: ../js/gdm/util.js:453
|
||||
msgid "(or swipe finger)"
|
||||
msgstr "(あるいは指でスワイプする)"
|
||||
|
||||
@ -310,32 +303,31 @@ msgid "Could not parse command:"
|
||||
msgstr "次のコマンドは解析できません:"
|
||||
|
||||
#: ../js/misc/util.js:156
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "Execution of '%s' failed:"
|
||||
#, javascript-format
|
||||
msgid "Execution of “%s” failed:"
|
||||
msgstr "'%s'の実行に失敗しました:"
|
||||
msgstr "”%s”の実行に失敗しました:"
|
||||
|
||||
#: ../js/ui/appDisplay.js:629
|
||||
#: ../js/ui/appDisplay.js:636
|
||||
msgid "Frequently used applications will appear here"
|
||||
msgstr "よく使うアプリケーションがここに表示されます"
|
||||
|
||||
#: ../js/ui/appDisplay.js:740
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
msgid "Frequent"
|
||||
msgstr "常用"
|
||||
|
||||
#: ../js/ui/appDisplay.js:747
|
||||
#: ../js/ui/appDisplay.js:754
|
||||
msgid "All"
|
||||
msgstr "すべて"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1555
|
||||
#: ../js/ui/appDisplay.js:1567
|
||||
msgid "New Window"
|
||||
msgstr "新しいウィンドウで開く"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1577 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1589 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "お気に入りから削除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1583
|
||||
#: ../js/ui/appDisplay.js:1595
|
||||
msgid "Add to Favorites"
|
||||
msgstr "お気に入りに追加"
|
||||
|
||||
@ -349,7 +341,7 @@ msgstr "%s をお気に入りに追加しました。"
|
||||
msgid "%s has been removed from your favorites."
|
||||
msgstr "%s をお気に入りから削除しました。"
|
||||
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
||||
#: ../js/ui/status/system.js:334
|
||||
msgid "Settings"
|
||||
msgstr "設定"
|
||||
@ -519,11 +511,11 @@ msgstr "今週"
|
||||
msgid "Next week"
|
||||
msgstr "来週"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:90
|
||||
#: ../js/ui/components/automountManager.js:91
|
||||
msgid "External drive connected"
|
||||
msgstr "外付けドライブが接続されました"
|
||||
|
||||
#: ../js/ui/components/automountManager.js:101
|
||||
#: ../js/ui/components/automountManager.js:102
|
||||
msgid "External drive disconnected"
|
||||
msgstr "外付けドライブが外されました"
|
||||
|
||||
@ -582,10 +574,9 @@ msgid "Authentication required by wireless network"
|
||||
msgstr "無線ネットワークでは認証が要求されます"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:312
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "Passwords or encryption keys are required to access the wireless network '%s'."
|
||||
#, javascript-format
|
||||
msgid "Passwords or encryption keys are required to access the wireless network “%s”."
|
||||
msgstr "無線ネットワーク '%s' にアクセスするにはパスワードか、または暗号化キーが必要です。"
|
||||
msgstr "無線ネットワーク ”%s” にアクセスするにはパスワードか、または暗号化キーが必要です。"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:316
|
||||
msgid "Wired 802.1X authentication"
|
||||
@ -616,10 +607,9 @@ msgid "Mobile broadband network password"
|
||||
msgstr "モバイルブロードバンドネットワークのパスワード"
|
||||
|
||||
#: ../js/ui/components/networkAgent.js:339
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "A password is required to connect to '%s'."
|
||||
#, javascript-format
|
||||
msgid "A password is required to connect to “%s”."
|
||||
msgstr "'%s' への接続にパスワードが必要です。"
|
||||
msgstr "”%s” への接続にはパスワードが必要です。"
|
||||
|
||||
#: ../js/ui/components/polkitAgent.js:54
|
||||
msgid "Authentication Required"
|
||||
@ -666,97 +656,77 @@ msgid "Mute"
|
||||
msgstr "ミュート"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:955
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
#: ../js/ui/components/telepathyClient.js:958
|
||||
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
|
||||
#, fuzzy
|
||||
#| msgid "<b>Yesterday</b>, <b>%H:%M</b>"
|
||||
#: ../js/ui/components/telepathyClient.js:965
|
||||
msgid "Yesterday, %H∶%M"
|
||||
msgstr "<b>昨日</b> <b>%H:%M</b>"
|
||||
msgstr "昨日 %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
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
#: ../js/ui/components/telepathyClient.js:972
|
||||
msgid "%A, %H∶%M"
|
||||
msgstr "%H∶%M"
|
||||
msgstr "%A %H∶%M"
|
||||
|
||||
#. Translators: this is the month name and day number
|
||||
#. followed by a time string in 24h format.
|
||||
#. i.e. "May 25, 14:30" */
|
||||
#: ../js/ui/components/telepathyClient.js:976
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%H∶%M"
|
||||
#: ../js/ui/components/telepathyClient.js:979
|
||||
msgid "%B %d, %H∶%M"
|
||||
msgstr "%H∶%M"
|
||||
msgstr "%B%-e日 %H∶%M"
|
||||
|
||||
#. 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" */
|
||||
#: ../js/ui/components/telepathyClient.js:982
|
||||
#: ../js/ui/components/telepathyClient.js:985
|
||||
msgid "%B %d %Y, %H∶%M"
|
||||
msgstr ""
|
||||
msgstr "%Y年%B%-e日 %H∶%M"
|
||||
|
||||
#. Translators: Time in 24h format */
|
||||
#: ../js/ui/components/telepathyClient.js:991
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
#: ../js/ui/components/telepathyClient.js:994
|
||||
msgid "%l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
msgstr "%p%l∶%M"
|
||||
|
||||
#. Translators: this is the word "Yesterday" followed by a
|
||||
#. time string in 12h format. i.e. "Yesterday, 2:30 pm" */
|
||||
#: ../js/ui/components/telepathyClient.js:998
|
||||
#: ../js/ui/components/telepathyClient.js:1001
|
||||
msgid "Yesterday, %l∶%M %p"
|
||||
msgstr ""
|
||||
msgstr "昨日 %p%l∶%M"
|
||||
|
||||
#. 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
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
#: ../js/ui/components/telepathyClient.js:1008
|
||||
msgid "%A, %l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
msgstr "%A %p%l∶%M"
|
||||
|
||||
#. 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
|
||||
#, fuzzy
|
||||
#| msgctxt "event list time"
|
||||
#| msgid "%l∶%M %p"
|
||||
#: ../js/ui/components/telepathyClient.js:1015
|
||||
msgid "%B %d, %l∶%M %p"
|
||||
msgstr "%l∶%M %p"
|
||||
msgstr "%B%-e日 %p%l∶%M"
|
||||
|
||||
#. 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
|
||||
#: ../js/ui/components/telepathyClient.js:1021
|
||||
msgid "%B %d %Y, %l∶%M %p"
|
||||
msgstr ""
|
||||
msgstr "%Y年%B%-e日 %p%l∶%M"
|
||||
|
||||
#. Translators: this is the other person changing their old IM name to their new
|
||||
#. IM name. */
|
||||
#: ../js/ui/components/telepathyClient.js:1051
|
||||
#: ../js/ui/components/telepathyClient.js:1054
|
||||
#, javascript-format
|
||||
msgid "%s is now known as %s"
|
||||
msgstr "%s は %s になりました"
|
||||
|
||||
#. translators: argument is a room name like
|
||||
#. * room@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1154
|
||||
#: ../js/ui/components/telepathyClient.js:1158
|
||||
#, javascript-format
|
||||
msgid "Invitation to %s"
|
||||
msgstr "%s への招待"
|
||||
@ -764,38 +734,38 @@ msgstr "%s への招待"
|
||||
#. translators: first argument is the name of a contact and the second
|
||||
#. * one the name of a room. "Alice is inviting you to join room@jabber.org
|
||||
#. * for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1162
|
||||
#: ../js/ui/components/telepathyClient.js:1166
|
||||
#, javascript-format
|
||||
msgid "%s is inviting you to join %s"
|
||||
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:1290
|
||||
#: ../js/ui/components/telepathyClient.js:1168
|
||||
#: ../js/ui/components/telepathyClient.js:1203
|
||||
#: ../js/ui/components/telepathyClient.js:1237
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
msgid "Decline"
|
||||
msgstr "拒否する"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1170
|
||||
#: ../js/ui/components/telepathyClient.js:1239
|
||||
#: ../js/ui/components/telepathyClient.js:1295
|
||||
#: ../js/ui/components/telepathyClient.js:1174
|
||||
#: ../js/ui/components/telepathyClient.js:1243
|
||||
#: ../js/ui/components/telepathyClient.js:1300
|
||||
msgid "Accept"
|
||||
msgstr "受け入れる"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1189
|
||||
#: ../js/ui/components/telepathyClient.js:1193
|
||||
#, javascript-format
|
||||
msgid "Video call from %s"
|
||||
msgstr "%s さんからビデオでの呼び出し"
|
||||
|
||||
#. translators: argument is a contact name like Alice for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1192
|
||||
#: ../js/ui/components/telepathyClient.js:1196
|
||||
#, javascript-format
|
||||
msgid "Call from %s"
|
||||
msgstr "%s さんからの呼び出し"
|
||||
|
||||
#. translators: this is a button label (verb), not a noun */
|
||||
#: ../js/ui/components/telepathyClient.js:1206
|
||||
#: ../js/ui/components/telepathyClient.js:1210
|
||||
msgid "Answer"
|
||||
msgstr "応答"
|
||||
|
||||
@ -804,125 +774,125 @@ msgstr "応答"
|
||||
#. * file name. The string will be something
|
||||
#. * like: "Alice is sending you test.ogg"
|
||||
#. */
|
||||
#: ../js/ui/components/telepathyClient.js:1227
|
||||
#: ../js/ui/components/telepathyClient.js:1231
|
||||
#, javascript-format
|
||||
msgid "%s is sending you %s"
|
||||
msgstr "%s さんがあなたに %s を送信しようとしています"
|
||||
|
||||
#. To translators: The parameter is the contact's alias */
|
||||
#: ../js/ui/components/telepathyClient.js:1256
|
||||
#: ../js/ui/components/telepathyClient.js:1260
|
||||
#, javascript-format
|
||||
msgid "%s would like permission to see when you are online"
|
||||
msgstr "%s さんが、あなたがオンライン状態になったことを知る許可を欲しいと思っています"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1341
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Network error"
|
||||
msgstr "ネットワークエラー"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1343
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Authentication failed"
|
||||
msgstr "認証失敗"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1345
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Encryption error"
|
||||
msgstr "暗号化のエラーです"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1347
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate not provided"
|
||||
msgstr "証明書がありません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1349
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "信用のない証明書です"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1351
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate expired"
|
||||
msgstr "証明書の有効期限が切れています"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1353
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate not activated"
|
||||
msgstr "証明書は利用できません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1355
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "証明書のホスト名が一致しません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1357
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "証明書の指紋が一致しません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1359
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "証明書自身の署名です"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1361
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Status is set to offline"
|
||||
msgstr "状態はオフラインに設定されています"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1363
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Encryption is not available"
|
||||
msgstr "暗号が利用できません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1365
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "証明書が正しくありません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1367
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been refused"
|
||||
msgstr "接続が拒否されました"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1369
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "Connection can't be established"
|
||||
msgstr "接続を確立できませんでした"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1371
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid "Connection has been lost"
|
||||
msgstr "接続が失われました"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1373
|
||||
#: ../js/ui/components/telepathyClient.js:1378
|
||||
msgid "This account is already connected to the server"
|
||||
msgstr "このアカウントはすでにサーバーに接続済みです"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1375
|
||||
#: ../js/ui/components/telepathyClient.js:1380
|
||||
msgid "Connection has been replaced by a new connection using the same resource"
|
||||
msgstr "接続は同じリソースを使って新しい接続で置き換わりました"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1377
|
||||
#: ../js/ui/components/telepathyClient.js:1382
|
||||
msgid "The account already exists on the server"
|
||||
msgstr "アカウントがサーバーにすでに存在します"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1379
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
msgid "Server is currently too busy to handle the connection"
|
||||
msgstr "サーバーがビジー状態にあるため、この接続を処理できません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1381
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "証明書が無効化されました"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1383
|
||||
#: ../js/ui/components/telepathyClient.js:1388
|
||||
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||
msgstr "証明書が安全でない暗号のアルゴリズムを使っているか、暗号的に弱いです"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1385
|
||||
#: ../js/ui/components/telepathyClient.js:1390
|
||||
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
|
||||
msgstr "サーバー証明書の長さや、サーバー証明書のチェーンの深さが暗号ライブラリで規定されている長さを越えています"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1387
|
||||
#: ../js/ui/components/telepathyClient.js:1392
|
||||
msgid "Internal error"
|
||||
msgstr "内部エラー"
|
||||
|
||||
#. translators: argument is the account name, like
|
||||
#. * name@jabber.org for example. */
|
||||
#: ../js/ui/components/telepathyClient.js:1397
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#, javascript-format
|
||||
msgid "Unable to connect to %s"
|
||||
msgstr "%s に接続できません"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1402
|
||||
#: ../js/ui/components/telepathyClient.js:1407
|
||||
msgid "View account"
|
||||
msgstr "アカウントを表示"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1439
|
||||
#: ../js/ui/components/telepathyClient.js:1444
|
||||
msgid "Unknown reason"
|
||||
msgstr "原因不明"
|
||||
|
||||
@ -993,7 +963,7 @@ msgstr "電源オフ"
|
||||
#: ../js/ui/endSessionDialog.js:87
|
||||
msgctxt "title"
|
||||
msgid "Install Updates & Power Off"
|
||||
msgstr ""
|
||||
msgstr "更新をインストールして電源オフ"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:89
|
||||
#, javascript-format
|
||||
@ -1004,7 +974,7 @@ msgstr[0] "%d 秒後に自動的にシステムの電源を切ります。"
|
||||
#: ../js/ui/endSessionDialog.js:93
|
||||
msgctxt "checkbox"
|
||||
msgid "Install pending software updates"
|
||||
msgstr ""
|
||||
msgstr "未実行のソフトウェアアップデートをインストールする"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:96 ../js/ui/endSessionDialog.js:113
|
||||
msgctxt "button"
|
||||
@ -1039,9 +1009,6 @@ msgid_plural "The system will automatically restart and install updates in %d se
|
||||
msgstr[0] "%d 秒後にシステムを再起動して更新をインストールします。"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:129
|
||||
#, fuzzy
|
||||
#| msgctxt "button"
|
||||
#| msgid "Restart & Install"
|
||||
msgctxt "button"
|
||||
msgid "Restart & Install"
|
||||
msgstr "再起動とインストール"
|
||||
@ -1049,16 +1016,16 @@ msgstr "再起動とインストール"
|
||||
#: ../js/ui/endSessionDialog.js:130
|
||||
msgctxt "button"
|
||||
msgid "Install & Power Off"
|
||||
msgstr ""
|
||||
msgstr "インストールと電源オフ"
|
||||
|
||||
#: ../js/ui/endSessionDialog.js:131
|
||||
msgctxt "checkbox"
|
||||
msgid "Power off after updates are installed"
|
||||
msgstr ""
|
||||
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."
|
||||
@ -1069,13 +1036,13 @@ msgid "Other users are logged in."
|
||||
msgstr "他のユーザーがログインしています。"
|
||||
|
||||
#. Translators: Remote here refers to a remote session, like a ssh login */
|
||||
#: ../js/ui/endSessionDialog.js:618
|
||||
#: ../js/ui/endSessionDialog.js:619
|
||||
#, javascript-format
|
||||
msgid "%s (remote)"
|
||||
msgstr "%s (リモート)"
|
||||
|
||||
#. Translators: Console here refers to a tty like a VT console */
|
||||
#: ../js/ui/endSessionDialog.js:621
|
||||
#: ../js/ui/endSessionDialog.js:622
|
||||
#, javascript-format
|
||||
msgid "%s (console)"
|
||||
msgstr "%s (コンソール)"
|
||||
@ -1085,12 +1052,11 @@ msgid "Install"
|
||||
msgstr "インストール"
|
||||
|
||||
#: ../js/ui/extensionDownloader.js:204
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "Download and install '%s' from extensions.gnome.org?"
|
||||
#, javascript-format
|
||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||
msgstr "extensions.gnome.org から '%s' をダウンロードしてインストールしますか?"
|
||||
msgstr "extensions.gnome.org から ”%s” をダウンロードしてインストールしますか?"
|
||||
|
||||
#: ../js/ui/keyboard.js:641 ../js/ui/status/keyboard.js:335
|
||||
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:335
|
||||
msgid "Keyboard"
|
||||
msgstr "キーボード"
|
||||
|
||||
@ -1112,7 +1078,8 @@ msgstr "エラーを非表示"
|
||||
msgid "Show Errors"
|
||||
msgstr "エラーを表示"
|
||||
|
||||
#: ../js/ui/lookingGlass.js:716
|
||||
#: ../js/ui/lookingGlass.js:716 ../js/ui/status/location.js:59
|
||||
#: ../js/ui/status/location.js:167
|
||||
msgid "Enabled"
|
||||
msgstr "有効"
|
||||
|
||||
@ -1120,8 +1087,8 @@ 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
|
||||
#: ../src/gvc/gvc-mixer-control.c:1830
|
||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
||||
msgid "Disabled"
|
||||
msgstr "無効"
|
||||
|
||||
@ -1177,11 +1144,11 @@ msgstr "メッセージなし"
|
||||
msgid "Message Tray"
|
||||
msgstr "メッセージトレイ"
|
||||
|
||||
#: ../js/ui/messageTray.js:2962
|
||||
#: ../js/ui/messageTray.js:2967
|
||||
msgid "System Information"
|
||||
msgstr "システム情報"
|
||||
|
||||
#: ../js/ui/notificationDaemon.js:515 ../src/shell-app.c:425
|
||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
||||
msgctxt "program"
|
||||
msgid "Unknown"
|
||||
msgstr "不明なプログラム"
|
||||
@ -1218,7 +1185,7 @@ msgstr "終了"
|
||||
msgid "Activities"
|
||||
msgstr "アクティビティ"
|
||||
|
||||
#: ../js/ui/panel.js:914
|
||||
#: ../js/ui/panel.js:915
|
||||
msgid "Top Bar"
|
||||
msgstr "トップバー"
|
||||
|
||||
@ -1254,11 +1221,11 @@ msgstr "ロック"
|
||||
msgid "GNOME needs to lock the screen"
|
||||
msgstr "画面をロックする必要があります"
|
||||
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1309
|
||||
#: ../js/ui/screenShield.js:835 ../js/ui/screenShield.js:1312
|
||||
msgid "Unable to lock"
|
||||
msgstr "ロックできません"
|
||||
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1310
|
||||
#: ../js/ui/screenShield.js:836 ../js/ui/screenShield.js:1313
|
||||
msgid "Lock was blocked by an application"
|
||||
msgstr "アプリケーションによってロックがブロックされました"
|
||||
|
||||
@ -1266,7 +1233,7 @@ msgstr "アプリケーションによってロックがブロックされまし
|
||||
msgid "Searching…"
|
||||
msgstr "検索しています…"
|
||||
|
||||
#: ../js/ui/search.js:646
|
||||
#: ../js/ui/search.js:649
|
||||
msgid "No results."
|
||||
msgstr "一致するものがありません。"
|
||||
|
||||
@ -1330,11 +1297,11 @@ msgstr "バウンスキー"
|
||||
msgid "Mouse Keys"
|
||||
msgstr "マウスキー"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:143
|
||||
#: ../js/ui/status/accessibility.js:144
|
||||
msgid "High Contrast"
|
||||
msgstr "ハイコントラスト"
|
||||
|
||||
#: ../js/ui/status/accessibility.js:192
|
||||
#: ../js/ui/status/accessibility.js:193
|
||||
msgid "Large Text"
|
||||
msgstr "大きな文字"
|
||||
|
||||
@ -1342,8 +1309,7 @@ msgstr "大きな文字"
|
||||
msgid "Bluetooth"
|
||||
msgstr "Bluetooth"
|
||||
|
||||
#: ../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/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/rfkill.js:105
|
||||
@ -1373,34 +1339,33 @@ msgid "Show Keyboard Layout"
|
||||
msgstr "キーボードレイアウトの表示"
|
||||
|
||||
#: ../js/ui/status/location.js:53
|
||||
#, fuzzy
|
||||
#| msgid "Notifications"
|
||||
msgid "Location"
|
||||
msgstr "通知"
|
||||
msgstr "場所"
|
||||
|
||||
#: ../js/ui/status/location.js:59 ../js/ui/status/location.js:166
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "オン"
|
||||
#: ../js/ui/status/location.js:60 ../js/ui/status/location.js:168
|
||||
msgid "Disable"
|
||||
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
|
||||
msgid "Off"
|
||||
msgstr "オフ"
|
||||
#: ../js/ui/status/location.js:165
|
||||
msgid "Enable"
|
||||
msgstr "有効"
|
||||
|
||||
#: ../js/ui/status/location.js:164 ../js/ui/status/network.js:1234
|
||||
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
|
||||
#, fuzzy
|
||||
#| msgid "Connect"
|
||||
msgid "Connected"
|
||||
msgstr "接続"
|
||||
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) */
|
||||
@ -1438,10 +1403,8 @@ msgid "connection failed"
|
||||
msgstr "接続失敗"
|
||||
|
||||
#: ../js/ui/status/network.js:467
|
||||
#, fuzzy
|
||||
#| msgid "Wi-Fi Settings"
|
||||
msgid "Wired Settings"
|
||||
msgstr "Wi-Fi 設定"
|
||||
msgstr "有線設定"
|
||||
|
||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
||||
msgid "Mobile Broadband Settings"
|
||||
@ -1453,39 +1416,31 @@ msgstr "ハードウェア無効"
|
||||
|
||||
#: ../js/ui/status/network.js:595
|
||||
msgid "Use as Internet connection"
|
||||
msgstr ""
|
||||
msgstr "インターネット接続に使用"
|
||||
|
||||
#: ../js/ui/status/network.js:776
|
||||
#, fuzzy
|
||||
#| msgid "Airplane Mode"
|
||||
msgid "Airplane Mode is On"
|
||||
msgstr "機内モード"
|
||||
msgstr "機内モードオン"
|
||||
|
||||
#: ../js/ui/status/network.js:777
|
||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||
msgstr ""
|
||||
msgstr "機内モードがオンになっていると、Wi-Fiは無効になります"
|
||||
|
||||
#: ../js/ui/status/network.js:778
|
||||
#, fuzzy
|
||||
#| msgid "Airplane Mode"
|
||||
msgid "Turn Off Airplane Mode"
|
||||
msgstr "機内モード"
|
||||
msgstr "機内モードをオフにする"
|
||||
|
||||
#: ../js/ui/status/network.js:787
|
||||
#, fuzzy
|
||||
#| msgid "Wi-Fi Settings"
|
||||
msgid "Wi-Fi is Off"
|
||||
msgstr "Wi-Fi 設定"
|
||||
msgstr "Wi-Fi オフ"
|
||||
|
||||
#: ../js/ui/status/network.js:788
|
||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||
msgstr ""
|
||||
msgstr "ネットワークに接続するには Wi-Fi をオンにする必要があります。"
|
||||
|
||||
#: ../js/ui/status/network.js:789
|
||||
#, fuzzy
|
||||
#| msgid "Turn On"
|
||||
msgid "Turn On Wi-Fi"
|
||||
msgstr "オンにする"
|
||||
msgstr "Wi-Fi をオンにする"
|
||||
|
||||
#: ../js/ui/status/network.js:814
|
||||
msgid "Wi-Fi Networks"
|
||||
@ -1501,7 +1456,7 @@ msgstr "ネットワークなし"
|
||||
|
||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:103
|
||||
msgid "Use hardware switch to turn off"
|
||||
msgstr ""
|
||||
msgstr "オフにハードウェアスイッチを使用する"
|
||||
|
||||
#: ../js/ui/status/network.js:1136
|
||||
msgid "Select Network"
|
||||
@ -1511,25 +1466,25 @@ msgstr "ネットワークを選択"
|
||||
msgid "Wi-Fi Settings"
|
||||
msgstr "Wi-Fi 設定"
|
||||
|
||||
#: ../js/ui/status/network.js:1234
|
||||
msgid "Turn On"
|
||||
msgstr "オンにする"
|
||||
|
||||
#: ../js/ui/status/network.js:1251
|
||||
msgid "Hotspot Active"
|
||||
msgstr ""
|
||||
msgstr "アクセスポイント使用中"
|
||||
|
||||
#: ../js/ui/status/network.js:1254
|
||||
#, fuzzy
|
||||
#| msgid "Connection"
|
||||
msgid "Connecting"
|
||||
msgstr "接続"
|
||||
msgstr "接続中"
|
||||
|
||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:88
|
||||
msgid "Network Settings"
|
||||
msgstr "ネットワーク設定"
|
||||
|
||||
#: ../js/ui/status/network.js:1435
|
||||
#, fuzzy
|
||||
#| msgid "Settings"
|
||||
msgid "VPN Settings"
|
||||
msgstr "設定"
|
||||
msgstr "VPN 設定"
|
||||
|
||||
#: ../js/ui/status/network.js:1454
|
||||
msgid "VPN"
|
||||
@ -1581,6 +1536,10 @@ msgstr "バッテリー"
|
||||
msgid "Airplane Mode"
|
||||
msgstr "機内モード"
|
||||
|
||||
#: ../js/ui/status/rfkill.js:84
|
||||
msgid "On"
|
||||
msgstr "オン"
|
||||
|
||||
#: ../js/ui/status/system.js:314
|
||||
msgid "Switch User"
|
||||
msgstr "ユーザーの切り替え"
|
||||
@ -1630,10 +1589,9 @@ msgid "Search"
|
||||
msgstr "検索"
|
||||
|
||||
#: ../js/ui/windowAttentionHandler.js:19
|
||||
#, fuzzy, javascript-format
|
||||
#| msgid "'%s' is ready"
|
||||
#, javascript-format
|
||||
msgid "“%s” is ready"
|
||||
msgstr "'%s' は準備完了です"
|
||||
msgstr "”%s” は準備完了です"
|
||||
|
||||
#: ../js/ui/windowManager.js:56
|
||||
msgid "Do you want to keep these display settings?"
|
||||
@ -1650,7 +1608,7 @@ msgstr "設定を元に戻す"
|
||||
msgid "Keep Changes"
|
||||
msgstr "変更を保存"
|
||||
|
||||
#: ../js/ui/windowManager.js:97
|
||||
#: ../js/ui/windowManager.js:98
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -1697,10 +1655,9 @@ msgid "List possible modes"
|
||||
msgstr "使用可能なモードを一覧表示する"
|
||||
|
||||
#: ../src/shell-app.c:666
|
||||
#, fuzzy, c-format
|
||||
#| msgid "Failed to launch '%s'"
|
||||
#, c-format
|
||||
msgid "Failed to launch “%s”"
|
||||
msgstr "'%s'の起動に失敗しました"
|
||||
msgstr "”%s”の起動に失敗しました"
|
||||
|
||||
#: ../src/shell-keyring-prompt.c:714
|
||||
msgid "Passwords do not match."
|
||||
@ -1710,7 +1667,7 @@ msgstr "パスワードが一致しません。"
|
||||
msgid "Password cannot be blank"
|
||||
msgstr "パスワードを空白にすることはできません。"
|
||||
|
||||
#: ../src/shell-polkit-authentication-agent.c:343
|
||||
#: ../src/shell-polkit-authentication-agent.c:346
|
||||
msgid "Authentication dialog was dismissed by the user"
|
||||
msgstr "認証ダイアログはユーザーに拒否されました"
|
||||
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user