Compare commits
187 Commits
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 |
3
.gitignore
vendored
3
.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
|
||||
@ -80,6 +82,7 @@ src/gnome-shell-extension-tool
|
||||
src/gnome-shell-hotplug-sniffer
|
||||
src/gnome-shell-perf-helper
|
||||
src/gnome-shell-perf-tool
|
||||
src/gnome-shell-portal-helper
|
||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||
src/run-js-test
|
||||
src/test-recorder
|
||||
|
70
NEWS
70
NEWS
@ -1,3 +1,73 @@
|
||||
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]
|
||||
|
12
configure.ac
12
configure.ac
@ -1,5 +1,5 @@
|
||||
AC_PREREQ(2.63)
|
||||
AC_INIT([gnome-shell],[3.13.1],[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.13.1
|
||||
MUTTER_MIN_VERSION=3.13.4
|
||||
GTK_MIN_VERSION=3.7.9
|
||||
GIO_MIN_VERSION=2.37.0
|
||||
LIBECAL_MIN_VERSION=3.5.3
|
||||
@ -223,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,6 +1,24 @@
|
||||
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
|
||||
%.desktop.in:%.desktop.in.in
|
||||
@ -35,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 \
|
||||
@ -89,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 --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,6 +259,31 @@ StScrollBar StButton#vhandle:active {
|
||||
color: #9f9f9f;
|
||||
}
|
||||
|
||||
.fallback-app-menu .popup-menu-item {
|
||||
color: #43484a;
|
||||
}
|
||||
|
||||
.fallback-app-menu .popup-menu-item:active {
|
||||
color: white;
|
||||
background-color: #4689cd;
|
||||
}
|
||||
|
||||
.fallback-app-menu .popup-menu-item:insensitive {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
.fallback-app-menu.dark .popup-menu-item {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.fallback-app-menu.dark .popup-menu-item:active {
|
||||
background-color: #445f7d;
|
||||
}
|
||||
|
||||
.fallback-app-menu.dark .popup-menu-item:insensitive {
|
||||
color: #9f9f9f;
|
||||
}
|
||||
|
||||
.popup-separator-menu-item {
|
||||
-gradient-height: 1px;
|
||||
-gradient-start: rgba(255,255,255,0.0);
|
||||
@ -230,6 +293,17 @@ StScrollBar StButton#vhandle:active {
|
||||
padding: 8px 0px;
|
||||
}
|
||||
|
||||
.fallback-app-menu .popup-separator-menu-item {
|
||||
-gradient-start: #a0a2a3;
|
||||
-gradient-end: #a0a2a3;
|
||||
-margin-horizontal: 0;
|
||||
}
|
||||
|
||||
.fallback-app-menu.dark .popup-separator-menu-item {
|
||||
-gradient-start: #818584;
|
||||
-gradient-end: #818584;
|
||||
}
|
||||
|
||||
.popup-status-menu-item {
|
||||
font-weight: normal;
|
||||
color: #999;
|
||||
@ -329,6 +403,14 @@ StScrollBar StButton#vhandle:active {
|
||||
icon-size: 16px;
|
||||
}
|
||||
|
||||
.no-networks-label {
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.no-networks-box {
|
||||
spacing: 12px;
|
||||
}
|
||||
|
||||
/* Buttons */
|
||||
|
||||
.candidate-page-button,
|
||||
@ -1226,8 +1308,6 @@ StScrollBar StButton#vhandle:active {
|
||||
|
||||
.calendar {
|
||||
padding: .4em 1.75em .8em 1.75em;
|
||||
spacing-rows: 0px;
|
||||
spacing-columns: 0px;
|
||||
}
|
||||
|
||||
.calendar-month-label {
|
||||
@ -1423,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;
|
||||
@ -1450,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 {
|
||||
@ -2016,6 +2092,11 @@ StScrollBar StButton#vhandle:active {
|
||||
font-size: 10pt;
|
||||
}
|
||||
|
||||
/* Restart message */
|
||||
.restart-message {
|
||||
font-size: 14pt;
|
||||
}
|
||||
|
||||
/* ShellMountOperation Dialogs */
|
||||
.shell-mount-operation-icon {
|
||||
icon-size: 48px;
|
||||
|
@ -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));
|
||||
|
@ -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();
|
||||
|
@ -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>
|
||||
|
@ -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) {
|
||||
@ -361,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() {
|
||||
@ -404,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() {
|
||||
@ -446,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++) {
|
||||
|
@ -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;
|
||||
@ -370,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);
|
||||
}));
|
||||
@ -740,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));
|
||||
|
||||
@ -952,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) {
|
||||
@ -960,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;
|
||||
@ -1249,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() {
|
||||
@ -1274,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);
|
||||
},
|
||||
|
||||
@ -1290,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;
|
||||
|
@ -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);
|
||||
|
@ -448,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);
|
||||
},
|
||||
@ -659,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);
|
||||
@ -725,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;
|
||||
|
@ -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);
|
||||
});
|
||||
}
|
||||
|
@ -383,7 +383,7 @@ 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);
|
||||
@ -408,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));
|
||||
@ -441,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"),
|
||||
@ -479,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);
|
||||
}
|
||||
|
||||
@ -601,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
|
||||
@ -648,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);
|
||||
@ -700,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();
|
||||
},
|
||||
@ -724,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);
|
||||
@ -735,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) {
|
||||
@ -755,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',
|
||||
|
@ -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)
|
||||
|
@ -783,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
|
||||
@ -947,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);
|
||||
},
|
||||
|
@ -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) {
|
||||
|
@ -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',
|
||||
|
@ -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];
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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' });
|
||||
@ -224,7 +224,7 @@ const LayoutManager = new Lang.Class({
|
||||
|
||||
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||
// position and size set in setDummyCursorGeometry.
|
||||
this.dummyCursor = new St.Widget({ width: 0, height: 0 });
|
||||
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,7 +597,9 @@ 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();
|
||||
@ -636,7 +638,9 @@ const LayoutManager = new Lang.Class({
|
||||
},
|
||||
|
||||
_startupAnimation: function() {
|
||||
if (Main.sessionMode.isGreeter)
|
||||
if (Meta.is_restart())
|
||||
this._startupAnimationComplete();
|
||||
else if (Main.sessionMode.isGreeter)
|
||||
this._startupAnimationGreeter();
|
||||
else
|
||||
this._startupAnimationSession();
|
||||
@ -1017,43 +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. However skip this step
|
||||
// in cases where this would render an entire monitor unusable.
|
||||
switch (side) {
|
||||
case Meta.Side.TOP:
|
||||
let hasMonitorsAbove = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.y < primary.y;
|
||||
}));
|
||||
if (!hasMonitorsAbove)
|
||||
y1 = 0;
|
||||
break;
|
||||
case Meta.Side.BOTTOM:
|
||||
if (this.primaryIndex == this.bottomIndex)
|
||||
y2 = global.screen_height;
|
||||
break;
|
||||
case Meta.Side.LEFT:
|
||||
let hasMonitorsLeft = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return !this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.x < primary.x;
|
||||
}));
|
||||
if (!hasMonitorsLeft)
|
||||
x1 = 0;
|
||||
break;
|
||||
case Meta.Side.RIGHT:
|
||||
let hasMonitorsRight = this.monitors.some(Lang.bind(this,
|
||||
function(mon) {
|
||||
return !this._isAboveOrBelowPrimary(mon) &&
|
||||
mon.x > primary.x;
|
||||
}));
|
||||
if (!hasMonitorsRight)
|
||||
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();
|
||||
|
@ -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.
|
||||
|
@ -9,7 +9,6 @@ const Mainloop = imports.mainloop;
|
||||
const Meta = imports.gi.Meta;
|
||||
const Shell = imports.gi.Shell;
|
||||
const St = imports.gi.St;
|
||||
const GSystem = imports.gi.GSystem;
|
||||
|
||||
const Components = imports.ui.components;
|
||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||
@ -19,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;
|
||||
@ -75,7 +75,6 @@ let _startDate;
|
||||
let _defaultCssStylesheet = null;
|
||||
let _cssStylesheet = null;
|
||||
let _a11ySettings = null;
|
||||
let dynamicWorkspacesSchema = null;
|
||||
|
||||
function _sessionUpdated() {
|
||||
_loadDefaultStylesheet();
|
||||
@ -112,7 +111,6 @@ function start() {
|
||||
|
||||
sessionMode = new SessionMode.SessionMode();
|
||||
sessionMode.connect('updated', _sessionUpdated);
|
||||
_initializePrefs();
|
||||
_initializeUI();
|
||||
|
||||
shellDBusService = new ShellDBus.GnomeShell();
|
||||
@ -121,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
|
||||
@ -174,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();
|
||||
@ -213,7 +210,12 @@ function _initializeUI() {
|
||||
if (screenShield) {
|
||||
screenShield.lockIfWasLocked();
|
||||
}
|
||||
if (LoginManager.haveSystemd() && sessionMode.currentMode === 'user') {
|
||||
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 {
|
||||
@ -242,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;
|
||||
}
|
||||
|
||||
@ -254,8 +255,7 @@ function getThemeStylesheet()
|
||||
*
|
||||
* Set the theme CSS file that the shell will load
|
||||
*/
|
||||
function setThemeStylesheet(cssStylesheet)
|
||||
{
|
||||
function setThemeStylesheet(cssStylesheet) {
|
||||
_cssStylesheet = cssStylesheet;
|
||||
}
|
||||
|
||||
@ -617,3 +617,28 @@ function queueDeferredWork(workId) {
|
||||
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 |
|
||||
@ -2268,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;
|
||||
@ -2277,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 =
|
||||
@ -2301,6 +2303,7 @@ const MessageTray = new Lang.Class({
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
this._pointerInNotification = true;
|
||||
this._updateState();
|
||||
} else {
|
||||
@ -2627,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() {
|
||||
@ -2719,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);
|
||||
},
|
||||
|
||||
@ -692,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',
|
||||
@ -705,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) {
|
||||
|
@ -192,6 +192,8 @@ const OsdWindow = new Lang.Class({
|
||||
_monitorsChanged: function() {
|
||||
/* assume 110x110 on a 640x480 display and scale from there */
|
||||
let monitor = Main.layoutManager.monitors[this._monitorIndex];
|
||||
if (!monitor)
|
||||
return; // we are about to be removed
|
||||
|
||||
let scalew = monitor.width / 640.0;
|
||||
let scaleh = monitor.height / 480.0;
|
||||
|
@ -425,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;
|
||||
@ -455,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();
|
||||
@ -504,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
|
||||
@ -583,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
|
||||
@ -614,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;
|
||||
@ -638,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);
|
||||
@ -677,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);
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -68,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);
|
||||
@ -78,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();
|
||||
@ -115,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,
|
||||
@ -126,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);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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
|
||||
@ -78,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" /> \
|
||||
@ -97,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.
|
||||
@ -110,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,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);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -208,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)
|
||||
@ -306,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 ('------------------------------------------------------------');
|
||||
}
|
||||
@ -360,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));
|
||||
@ -465,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 });
|
||||
@ -477,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) {
|
||||
@ -577,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,
|
||||
|
@ -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();
|
||||
@ -118,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),
|
||||
@ -134,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);
|
||||
@ -186,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);
|
||||
@ -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;
|
||||
|
||||
@ -87,6 +88,14 @@ const Indicator = new Lang.Class({
|
||||
}));
|
||||
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();
|
||||
|
@ -190,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;
|
||||
},
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
@ -198,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 = [];
|
||||
@ -448,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',
|
||||
|
||||
@ -463,8 +581,6 @@ const WindowManager = new Lang.Class({
|
||||
|
||||
this._dimmedWindows = [];
|
||||
|
||||
this._animationBlockCount = 0;
|
||||
|
||||
this._allowedKeybindings = {};
|
||||
|
||||
this._switchData = null;
|
||||
@ -480,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));
|
||||
@ -648,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,
|
||||
@ -669,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) {
|
||||
@ -704,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) {
|
||||
@ -902,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);
|
||||
|
||||
@ -976,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 () {
|
||||
@ -1159,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)
|
||||
|
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) {
|
||||
@ -827,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,
|
||||
@ -929,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;
|
||||
@ -987,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;
|
||||
@ -1000,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
|
||||
@ -1126,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) {
|
||||
@ -1133,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) {
|
||||
@ -1141,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;
|
||||
}));
|
||||
},
|
||||
@ -1226,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;
|
||||
|
||||
|
@ -665,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));
|
||||
},
|
||||
@ -826,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
|
||||
|
@ -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;
|
||||
|
@ -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
162
po/cs.po
162
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-04-23 07:44+0000\n"
|
||||
"PO-Revision-Date: 2014-04-23 17:03+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"
|
||||
@ -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:1567
|
||||
#: ../js/ui/appDisplay.js:1571
|
||||
msgid "New Window"
|
||||
msgstr "Nové okno"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1589 ../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:1595
|
||||
#: ../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."
|
||||
@ -406,7 +410,7 @@ 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:810
|
||||
#: ../js/ui/status/system.js:334
|
||||
#: ../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,89 +493,85 @@ 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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -1248,7 +1248,7 @@ 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"
|
||||
@ -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"
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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č"
|
||||
|
||||
@ -1588,7 +1588,7 @@ msgstr "je vyžadováno ověření"
|
||||
msgid "connection failed"
|
||||
msgstr "připojení selhalo"
|
||||
|
||||
#: ../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 "Nastavení sítě"
|
||||
|
||||
@ -1638,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"
|
||||
|
||||
@ -1699,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:98
|
||||
#: ../js/ui/windowManager.js:99
|
||||
#, javascript-format
|
||||
msgid "Settings changes will revert in %d second"
|
||||
msgid_plural "Settings changes will revert in %d seconds"
|
||||
@ -1722,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"
|
||||
|
1428
po/en_GB.po
1428
po/en_GB.po
File diff suppressed because it is too large
Load Diff
367
po/id.po
367
po/id.po
@ -10,9 +10,9 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell master\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||
"shell&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2014-04-05 19:59+0000\n"
|
||||
"PO-Revision-Date: 2014-04-09 05:35+0700\n"
|
||||
"Last-Translator: Dirgita <dirgitadevina@yahoo.co.id>\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-l10n-id@googlegroups.com>\n"
|
||||
"Language: id\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -20,7 +20,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Poedit-SourceCharset: UTF-8\n"
|
||||
"X-Generator: Lokalize 1.5\n"
|
||||
"X-Generator: Poedit 1.5.7\n"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||
msgid "System"
|
||||
@ -341,25 +341,25 @@ msgstr "Pilih Sesi"
|
||||
msgid "Not listed?"
|
||||
msgstr "Tak masuk daftar?"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:614
|
||||
#: ../js/gdm/loginDialog.js:616
|
||||
#, javascript-format
|
||||
msgid "(e.g., user or %s)"
|
||||
msgstr "(cth., pengguna dari %s)"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:619 ../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:920
|
||||
#: ../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)"
|
||||
|
||||
@ -376,30 +376,34 @@ msgstr "Tak dapat mengurai perintah:"
|
||||
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 "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"
|
||||
|
||||
@ -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:1291
|
||||
#: ../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:1296
|
||||
#: ../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 izin melihat Anda ketika Anda daring"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1342
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
msgid "Network error"
|
||||
msgstr "Galat jaringan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1344
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
msgid "Authentication failed"
|
||||
msgstr "Otentikasi gagal"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1346
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
msgid "Encryption error"
|
||||
msgstr "Galat enkripsi"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1348
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
msgid "Certificate not provided"
|
||||
msgstr "Sertifikat tidak disediakan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1350
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
msgid "Certificate untrusted"
|
||||
msgstr "Sertifikat tidak dipercaya"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1352
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
msgid "Certificate expired"
|
||||
msgstr "Sertifikat kadaluarsa"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1354
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
msgid "Certificate not activated"
|
||||
msgstr "Sertifikat tidak diaktifkan"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1356
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
msgid "Certificate hostname mismatch"
|
||||
msgstr "Nama host sertifikat tidak cocok"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1358
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
msgid "Certificate fingerprint mismatch"
|
||||
msgstr "Sidik jari sertifikat tidak cocok"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1360
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
msgid "Certificate self-signed"
|
||||
msgstr "Sertifikat ditandatangani sendiri"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1362
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
msgid "Status is set to offline"
|
||||
msgstr "Status diatur ke luring"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1364
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
msgid "Encryption is not available"
|
||||
msgstr "Enkripsi tidak tersedia"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1366
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
msgid "Certificate is invalid"
|
||||
msgstr "Sertifikat tidak valid"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1368
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
msgid "Connection has been refused"
|
||||
msgstr "Koneksi telah ditolak"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1370
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
msgid "Connection can't be established"
|
||||
msgstr "Koneksi tak dapat dijalin"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1372
|
||||
#: ../js/ui/components/telepathyClient.js:1376
|
||||
msgid "Connection has been lost"
|
||||
msgstr "Koneksi telah terputus"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1374
|
||||
#: ../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:1376
|
||||
#: ../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:1378
|
||||
#: ../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:1380
|
||||
#: ../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:1382
|
||||
#: ../js/ui/components/telepathyClient.js:1386
|
||||
msgid "Certificate has been revoked"
|
||||
msgstr "Sertifikat telah dicabut"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1384
|
||||
#: ../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:1386
|
||||
#: ../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:1388
|
||||
#: ../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:1398
|
||||
#: ../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:1403
|
||||
#: ../js/ui/components/telepathyClient.js:1407
|
||||
msgid "View account"
|
||||
msgstr "Tilik akun"
|
||||
|
||||
#: ../js/ui/components/telepathyClient.js:1440
|
||||
#: ../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,19 +1308,19 @@ 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 "Tak ada yang cocok."
|
||||
|
||||
@ -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,8 +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"
|
||||
|
||||
|
621
po/pt_BR.po
621
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
135
po/zh_TW.po
135
po/zh_TW.po
@ -9,16 +9,16 @@ msgstr ""
|
||||
"Project-Id-Version: gnome-shell 3.3.90\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-19 20:32+0000\n"
|
||||
"PO-Revision-Date: 2014-03-21 21:41+0800\n"
|
||||
"Last-Translator: Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>\n"
|
||||
"POT-Creation-Date: 2014-04-10 08:01+0000\n"
|
||||
"PO-Revision-Date: 2014-04-10 23:25+0800\n"
|
||||
"Last-Translator: Cheng-Chia Tseng <pswo10680@gmail.com>\n"
|
||||
"Language-Team: Chinese (Taiwan) <zh-l10n@lists.linux.org.tw>\n"
|
||||
"Language: zh_TW\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Poedit 1.6.3\n"
|
||||
"X-Generator: Poedit 1.6.4\n"
|
||||
|
||||
#: ../data/50-gnome-shell-system.xml.in.h:1
|
||||
msgid "System"
|
||||
@ -308,25 +308,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:608
|
||||
#: ../js/gdm/loginDialog.js:614
|
||||
#, 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:619 ../js/ui/components/networkAgent.js:262
|
||||
#: ../js/ui/components/networkAgent.js:280
|
||||
msgid "Username: "
|
||||
msgstr "使用者名稱:"
|
||||
|
||||
#: ../js/gdm/loginDialog.js:884
|
||||
#: ../js/gdm/loginDialog.js:920
|
||||
msgid "Login Window"
|
||||
msgstr "登入視窗"
|
||||
|
||||
@ -351,27 +351,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:1555
|
||||
#: ../js/ui/appDisplay.js:1566
|
||||
msgid "New Window"
|
||||
msgstr "新視窗"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1577 ../js/ui/dash.js:285
|
||||
#: ../js/ui/appDisplay.js:1588 ../js/ui/dash.js:285
|
||||
msgid "Remove from Favorites"
|
||||
msgstr "自喜好中移除"
|
||||
|
||||
#: ../js/ui/appDisplay.js:1583
|
||||
#: ../js/ui/appDisplay.js:1594
|
||||
msgid "Add to Favorites"
|
||||
msgstr "加入喜好"
|
||||
|
||||
@ -788,13 +788,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 "接受"
|
||||
|
||||
@ -831,118 +831,118 @@ 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"
|
||||
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:1439
|
||||
#: ../js/ui/components/telepathyClient.js:1440
|
||||
msgid "Unknown reason"
|
||||
msgstr "不明原因"
|
||||
|
||||
@ -1129,7 +1129,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 "已啟用"
|
||||
|
||||
@ -1137,8 +1138,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 "已停用"
|
||||
|
||||
@ -1283,7 +1284,7 @@ msgstr "鎖定被應用程式阻擋"
|
||||
msgid "Searching…"
|
||||
msgstr "搜尋…"
|
||||
|
||||
#: ../js/ui/search.js:646
|
||||
#: ../js/ui/search.js:649
|
||||
msgid "No results."
|
||||
msgstr "沒有結果。"
|
||||
|
||||
@ -1359,8 +1360,7 @@ msgstr "大型文字"
|
||||
msgid "Bluetooth"
|
||||
msgstr "藍牙"
|
||||
|
||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/location.js:60
|
||||
#: ../js/ui/status/location.js:167 ../js/ui/status/network.js:151
|
||||
#: ../js/ui/status/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
|
||||
@ -1393,24 +1393,29 @@ msgstr "顯示鍵盤配置"
|
||||
msgid "Location"
|
||||
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 "Disabled"
|
||||
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 "Enabled"
|
||||
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
|
||||
msgid "Connected"
|
||||
msgstr "已連線"
|
||||
@ -1514,6 +1519,10 @@ 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 "熱點活動中"
|
||||
@ -1580,6 +1589,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 "切換使用者"
|
||||
|
@ -199,6 +199,21 @@ nodist_gnome_shell_extension_prefs_SOURCES = \
|
||||
gnome_shell_extension_prefs_CPPFLAGS = $(gnome_shell_cflags)
|
||||
gnome_shell_extension_prefs_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
|
||||
|
||||
if HAVE_NETWORKMANAGER
|
||||
|
||||
libexec_PROGRAMS += gnome-shell-portal-helper
|
||||
gnome_shell_portal_helper_SOURCES = \
|
||||
gnome-shell-portal-helper.c \
|
||||
$(NULL)
|
||||
nodist_gnome_shell_portal_helper_SOURCES = \
|
||||
$(top_builddir)/js/js-resources.c \
|
||||
$(top_builddir)/js/js-resources.h \
|
||||
$(NULL)
|
||||
gnome_shell_portal_helper_CPPFLAGS = $(gnome_shell_cflags)
|
||||
gnome_shell_portal_helper_LDADD = libgnome-shell-js.la $(GNOME_SHELL_LIBS)
|
||||
|
||||
endif
|
||||
|
||||
########################################
|
||||
|
||||
libgnome_shell_js_la_SOURCES = \
|
||||
@ -242,7 +257,7 @@ libexec_PROGRAMS += gnome-shell-perf-helper
|
||||
|
||||
gnome_shell_perf_helper_SOURCES = shell-perf-helper.c
|
||||
gnome_shell_perf_helper_CPPFLAGS = $(SHELL_PERF_HELPER_CFLAGS)
|
||||
gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS)
|
||||
gnome_shell_perf_helper_LDADD = $(SHELL_PERF_HELPER_LIBS) -lm
|
||||
|
||||
########################################
|
||||
|
||||
@ -320,7 +335,7 @@ INTROSPECTION_GIRS += ShellMenu-0.1.gir
|
||||
CLEANFILES += ShellMenu-0.1.gir
|
||||
|
||||
Shell-0.1.gir: gnome-shell St-1.0.gir ShellMenu-0.1.gir
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4 GMenu-3.0
|
||||
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-3.0 TelepathyGLib-0.12 Soup-2.4
|
||||
if HAVE_NETWORKMANAGER
|
||||
Shell_0_1_gir_INCLUDES += NetworkManager-1.0 NMClient-1.0
|
||||
endif
|
||||
|
@ -42,8 +42,8 @@ function _showHello() {
|
||||
|
||||
let monitor = Main.layoutManager.primaryMonitor;
|
||||
|
||||
text.set_position(Math.floor(monitor.width / 2 - text.width / 2),
|
||||
Math.floor(monitor.height / 2 - text.height / 2));
|
||||
text.set_position(monitor.x + Math.floor(monitor.width / 2 - text.width / 2),
|
||||
monitor.y + Math.floor(monitor.height / 2 - text.height / 2));
|
||||
|
||||
Tweener.addTween(text,
|
||||
{ opacity: 0,
|
||||
|
@ -75,7 +75,9 @@ def start_shell(perf_output=None):
|
||||
# Set up environment
|
||||
env = dict(os.environ)
|
||||
env['SHELL_PERF_MODULE'] = options.perf
|
||||
env['MUTTER_WM_CLASS_FILTER'] = 'Gnome-shell-perf-helper'
|
||||
|
||||
filters = ['Gnome-shell-perf-helper'] + options.extra_filter
|
||||
env['MUTTER_WM_CLASS_FILTER'] = ','.join(filters)
|
||||
|
||||
if perf_output is not None:
|
||||
env['SHELL_PERF_OUTPUT'] = perf_output
|
||||
@ -189,6 +191,11 @@ def upload_performance_report(report_text):
|
||||
print "Performance report upload failed with status %d" % response.status
|
||||
print response.read()
|
||||
|
||||
def gnome_hwtest_log(*args):
|
||||
command = ['gnome-hwtest-log', '-t', 'gnome-shell-perf-tool']
|
||||
command.extend(args)
|
||||
subprocess.check_call(command)
|
||||
|
||||
def run_performance_test():
|
||||
iters = options.perf_iters
|
||||
if options.perf_warmup:
|
||||
@ -289,6 +296,13 @@ def run_performance_test():
|
||||
|
||||
if options.perf_upload:
|
||||
upload_performance_report(json.dumps(report))
|
||||
elif options.hwtest:
|
||||
# Log to systemd journal
|
||||
for metric in sorted(metric_summaries.keys()):
|
||||
summary = metric_summaries[metric]
|
||||
gnome_hwtest_log('--metric=' + metric + '=' + str(summary['values'][0]) + summary['units'],
|
||||
'--metric-description=' + summary['description'])
|
||||
gnome_hwtest_log('--finished')
|
||||
else:
|
||||
# Write a human readable summary
|
||||
print '------------------------------------------------------------';
|
||||
@ -304,8 +318,7 @@ def run_performance_test():
|
||||
|
||||
parser = optparse.OptionParser()
|
||||
parser.add_option("", "--perf", metavar="PERF_MODULE",
|
||||
help="Specify the name of a performance module to run",
|
||||
default="core")
|
||||
help="Specify the name of a performance module to run")
|
||||
parser.add_option("", "--perf-iters", type="int", metavar="ITERS",
|
||||
help="Numbers of iterations of performance module to run",
|
||||
default=1)
|
||||
@ -315,6 +328,10 @@ parser.add_option("", "--perf-output", metavar="OUTPUT_FILE",
|
||||
help="Output file to write performance report")
|
||||
parser.add_option("", "--perf-upload", action="store_true",
|
||||
help="Upload performance report to server")
|
||||
parser.add_option("", "--extra-filter", action="append",
|
||||
help="add an extra window class that should be allowed")
|
||||
parser.add_option("", "--hwtest", action="store_true",
|
||||
help="Log results appropriately for GNOME Hardware Testing")
|
||||
parser.add_option("", "--version", action="callback", callback=show_version,
|
||||
help="Display version and exit")
|
||||
|
||||
@ -323,12 +340,25 @@ parser.add_option("-r", "--replace", action="store_true",
|
||||
|
||||
options, args = parser.parse_args()
|
||||
|
||||
if options.perf == None:
|
||||
if options.hwtest:
|
||||
options.perf = 'hwtest'
|
||||
else:
|
||||
options.perf = 'core'
|
||||
|
||||
if options.extra_filter is None:
|
||||
if options.hwtest:
|
||||
options.extra_filter = ['Gedit']
|
||||
else:
|
||||
options.extra_filter = []
|
||||
|
||||
if args:
|
||||
parser.print_usage()
|
||||
sys.exit(1)
|
||||
|
||||
normal_exit = run_performance_test()
|
||||
if normal_exit:
|
||||
restore_shell()
|
||||
if not options.hwtest:
|
||||
restore_shell()
|
||||
else:
|
||||
sys.exit(1)
|
||||
|
@ -73,7 +73,15 @@ static void gnome_shell_plugin_show_tile_preview (MetaPlugin *plugin,
|
||||
MetaRectangle *tile_rect,
|
||||
int tile_monitor);
|
||||
static void gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin);
|
||||
|
||||
static void gnome_shell_plugin_show_window_menu (MetaPlugin *plugin,
|
||||
MetaWindow *window,
|
||||
MetaWindowMenuType menu,
|
||||
int x,
|
||||
int y);
|
||||
static void gnome_shell_plugin_show_window_menu_for_rect (MetaPlugin *plugin,
|
||||
MetaWindow *window,
|
||||
MetaWindowMenuType menu,
|
||||
MetaRectangle *rect);
|
||||
|
||||
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||
XEvent *event);
|
||||
@ -140,6 +148,8 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
|
||||
|
||||
plugin_class->show_tile_preview = gnome_shell_plugin_show_tile_preview;
|
||||
plugin_class->hide_tile_preview = gnome_shell_plugin_hide_tile_preview;
|
||||
plugin_class->show_window_menu = gnome_shell_plugin_show_window_menu;
|
||||
plugin_class->show_window_menu_for_rect = gnome_shell_plugin_show_window_menu_for_rect;
|
||||
|
||||
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
|
||||
plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter;
|
||||
@ -154,6 +164,43 @@ gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
|
||||
{
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnome_shell_plugin_has_swap_event (GnomeShellPlugin *shell_plugin)
|
||||
{
|
||||
MetaPlugin *plugin = META_PLUGIN (shell_plugin);
|
||||
CoglDisplay *cogl_display =
|
||||
cogl_context_get_display (shell_plugin->cogl_context);
|
||||
CoglRenderer *renderer = cogl_display_get_renderer (cogl_display);
|
||||
const char * (* query_extensions_string) (Display *dpy, int screen);
|
||||
Bool (* query_extension) (Display *dpy, int *error, int *event);
|
||||
MetaScreen *screen;
|
||||
Display *xdisplay;
|
||||
const char *glx_extensions;
|
||||
|
||||
/* We will only get swap events if Cogl is using GLX */
|
||||
if (cogl_renderer_get_winsys_id (renderer) != COGL_WINSYS_ID_GLX)
|
||||
return FALSE;
|
||||
|
||||
screen = meta_plugin_get_screen (plugin);
|
||||
|
||||
xdisplay = clutter_x11_get_default_display ();
|
||||
|
||||
query_extensions_string =
|
||||
(void *) cogl_get_proc_address ("glXQueryExtensionsString");
|
||||
query_extension =
|
||||
(void *) cogl_get_proc_address ("glXQueryExtension");
|
||||
|
||||
query_extension (xdisplay,
|
||||
&shell_plugin->glx_error_base,
|
||||
&shell_plugin->glx_event_base);
|
||||
|
||||
glx_extensions =
|
||||
query_extensions_string (xdisplay,
|
||||
meta_screen_get_screen_number (screen));
|
||||
|
||||
return strstr (glx_extensions, "GLX_INTEL_swap_event") != NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_shell_plugin_start (MetaPlugin *plugin)
|
||||
{
|
||||
@ -166,7 +213,8 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
|
||||
backend = clutter_get_default_backend ();
|
||||
shell_plugin->cogl_context = clutter_backend_get_cogl_context (backend);
|
||||
|
||||
shell_plugin->have_swap_event = clutter_feature_available (CLUTTER_FEATURE_SWAP_EVENTS);
|
||||
shell_plugin->have_swap_event =
|
||||
gnome_shell_plugin_has_swap_event (shell_plugin);
|
||||
|
||||
shell_perf_log_define_event (shell_perf_log_get_default (),
|
||||
"glx.swapComplete",
|
||||
@ -303,6 +351,25 @@ gnome_shell_plugin_hide_tile_preview (MetaPlugin *plugin)
|
||||
_shell_wm_hide_tile_preview (get_shell_wm ());
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_shell_plugin_show_window_menu (MetaPlugin *plugin,
|
||||
MetaWindow *window,
|
||||
MetaWindowMenuType menu,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
_shell_wm_show_window_menu (get_shell_wm (), window, menu, x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_shell_plugin_show_window_menu_for_rect (MetaPlugin *plugin,
|
||||
MetaWindow *window,
|
||||
MetaWindowMenuType menu,
|
||||
MetaRectangle *rect)
|
||||
{
|
||||
_shell_wm_show_window_menu_for_rect (get_shell_wm (), window, menu, rect);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||
XEvent *xev)
|
||||
@ -320,9 +387,17 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||
* can send this with a ust of 0. Simplify life for consumers
|
||||
* by ignoring such events */
|
||||
if (swap_complete_event->ust != 0)
|
||||
shell_perf_log_event_x (shell_perf_log_get_default (),
|
||||
"glx.swapComplete",
|
||||
swap_complete_event->ust);
|
||||
{
|
||||
gboolean frame_timestamps;
|
||||
g_object_get (shell_plugin->global,
|
||||
"frame-timestamps", &frame_timestamps,
|
||||
NULL);
|
||||
|
||||
if (frame_timestamps)
|
||||
shell_perf_log_event_x (shell_perf_log_get_default (),
|
||||
"glx.swapComplete",
|
||||
swap_complete_event->ust);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
52
src/gnome-shell-portal-helper.c
Normal file
52
src/gnome-shell-portal-helper.c
Normal file
@ -0,0 +1,52 @@
|
||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <girepository.h>
|
||||
#include <gjs/gjs.h>
|
||||
#include <glib/gi18n.h>
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
const char *search_path[] = { "resource:///org/gnome/shell", NULL };
|
||||
GError *error = NULL;
|
||||
GjsContext *context;
|
||||
int status;
|
||||
|
||||
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
|
||||
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
|
||||
textdomain (GETTEXT_PACKAGE);
|
||||
|
||||
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
|
||||
|
||||
context = g_object_new (GJS_TYPE_CONTEXT,
|
||||
"search-path", search_path,
|
||||
NULL);
|
||||
|
||||
if (!gjs_context_define_string_array(context, "ARGV",
|
||||
argc, (const char**)argv,
|
||||
&error))
|
||||
{
|
||||
g_message("Failed to define ARGV: %s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
if (!gjs_context_eval (context,
|
||||
"const Main = imports.portalHelper.main; Main.main(ARGV);",
|
||||
-1,
|
||||
"<main>",
|
||||
&status,
|
||||
&error))
|
||||
{
|
||||
g_message ("Execution of main.js threw exception: %s", error->message);
|
||||
g_error_free (error);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
@ -778,7 +778,7 @@ emit_changed_accels (GtkActionMuxer *muxer,
|
||||
/**
|
||||
* gtk_action_muxer_set_parent:
|
||||
* @muxer: a #GtkActionMuxer
|
||||
* @parent: (allow-none): the new parent #GtkActionMuxer
|
||||
* @parent: (nullable): the new parent #GtkActionMuxer
|
||||
*
|
||||
* Sets the parent of @muxer to @parent.
|
||||
*/
|
||||
|
24
src/main.c
24
src/main.c
@ -34,6 +34,8 @@ extern GType gnome_shell_plugin_get_type (void);
|
||||
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
|
||||
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
|
||||
|
||||
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
|
||||
|
||||
#define WM_NAME "GNOME Shell"
|
||||
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
|
||||
|
||||
@ -167,6 +169,26 @@ shell_dbus_init (gboolean replace)
|
||||
g_object_unref (session);
|
||||
}
|
||||
|
||||
static void
|
||||
shell_prefs_init (void)
|
||||
{
|
||||
ShellGlobal *global = shell_global_get ();
|
||||
GSettings *settings = shell_global_get_overrides_settings (global);
|
||||
char **keys, **k, *schema_id;
|
||||
|
||||
if (!settings)
|
||||
return;
|
||||
|
||||
g_object_get (G_OBJECT (settings), "schema-id", &schema_id, NULL);
|
||||
|
||||
keys = g_settings_list_keys (settings);
|
||||
for (keys = k = g_settings_list_keys (settings); *k; k++)
|
||||
meta_prefs_override_preference_schema (*k, schema_id);
|
||||
|
||||
g_strfreev (keys);
|
||||
g_free (schema_id);
|
||||
}
|
||||
|
||||
static void
|
||||
shell_introspection_init (void)
|
||||
{
|
||||
@ -434,6 +456,8 @@ main (int argc, char **argv)
|
||||
|
||||
_shell_global_init ("session-mode", session_mode, NULL);
|
||||
|
||||
shell_prefs_init ();
|
||||
|
||||
ecode = meta_run ();
|
||||
|
||||
if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user