Compare commits
241 Commits
wip/new-no
...
3.13.91
Author | SHA1 | Date | |
---|---|---|---|
d3418f6381 | |||
57dd862e35 | |||
db76fb8ff9 | |||
9e5704b498 | |||
3deaeb4a90 | |||
afb7f08e6b | |||
38c70e73b9 | |||
e60bf44c2e | |||
746a8692ac | |||
a00762ddd9 | |||
3981b27d8f | |||
62786c09a8 | |||
67c216a6fe | |||
e933302ae4 | |||
75d5e84a4b | |||
f160dda187 | |||
9c474a635a | |||
d445bd17eb | |||
584f8c8381 | |||
032a688a72 | |||
285a7467d0 | |||
3289105ac4 | |||
51861b1e6b | |||
d85f97c744 | |||
98847f2279 | |||
1d58ea25ab | |||
9de05994db | |||
c9f3afc38f | |||
3526bc0f0a | |||
079809af1d | |||
26719b02e4 | |||
3a45ddcaad | |||
f839100bc2 | |||
c93767768c | |||
0011755b41 | |||
ec932b2306 | |||
1c0c38574d | |||
78b81650f5 | |||
62bfde45aa | |||
5b624a34b8 | |||
9c008ab998 | |||
6edcd82103 | |||
d5aa276c41 | |||
d54efe0838 | |||
d0fe1211f2 | |||
3e20843d9c | |||
7c9d90b0aa | |||
b6e6e097b7 | |||
3842981c35 | |||
926177785d | |||
7d80647170 | |||
c2a21bb885 | |||
eaff1e9290 | |||
93c5e6d97e | |||
20fc9735fa | |||
d450b74e10 | |||
e8fa2b6417 | |||
c459ef6888 | |||
d1a3a000af | |||
5ce8980db3 | |||
8c32cff6fc | |||
bc99db9fd3 | |||
a5eae8e3d8 | |||
82a764ee93 | |||
ce2c90a534 | |||
28cc0da151 | |||
f1957dccb7 | |||
0af4dc0b4c | |||
687e1ebf69 | |||
805b686576 | |||
101daf6791 | |||
5d12ab415c | |||
0810ab62db | |||
6f00d81abf | |||
4184edc7f8 | |||
05f9f991d8 | |||
3df7ef6ce6 | |||
d836194e31 | |||
8ed3e2117f | |||
62fcda5d91 | |||
0a780376f3 | |||
efb9f167bd | |||
eb69f3aa76 | |||
c15a885418 | |||
fe60db64e0 | |||
b90cc5ff26 | |||
e9f95ca605 | |||
017c2468ee | |||
8c6a2874ff | |||
557130d2f2 | |||
84cbbafaae | |||
72a663f554 | |||
7c762ef9df | |||
3182aba744 | |||
e6339fbb45 | |||
a6d8c25494 | |||
cd4eda8bef | |||
a0bd4a02e4 | |||
42b54aaa21 | |||
bbfa616f27 | |||
7e31015ba2 | |||
aa2fc3c858 | |||
d4f0b5bdf3 | |||
eda27d5194 | |||
589e6c29f3 | |||
4b46533ce8 | |||
6687b9b739 | |||
91c4408d23 | |||
83adb2a864 | |||
5918faddf7 | |||
916c02a2f5 | |||
a84fb99c0a | |||
69d5cef3b2 | |||
38d05a8285 | |||
f8899cf274 | |||
dbbf4097a5 | |||
acb1497f4f | |||
e545ec59b9 | |||
da26a9daf8 | |||
a2f263dcbb | |||
ce5cd3bf30 | |||
9a05aea76f | |||
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 |
4
.gitignore
vendored
4
.gitignore
vendored
@ -24,10 +24,13 @@ data/gnome-shell-wayland.desktop.in
|
|||||||
data/gnome-shell-extension-prefs.desktop
|
data/gnome-shell-extension-prefs.desktop
|
||||||
data/gnome-shell-extension-prefs.desktop.in
|
data/gnome-shell-extension-prefs.desktop.in
|
||||||
data/gschemas.compiled
|
data/gschemas.compiled
|
||||||
|
data/perf-background.xml
|
||||||
data/org.gnome.shell.gschema.xml
|
data/org.gnome.shell.gschema.xml
|
||||||
data/org.gnome.shell.gschema.valid
|
data/org.gnome.shell.gschema.valid
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.xml
|
data/org.gnome.shell.evolution.calendar.gschema.xml
|
||||||
data/org.gnome.shell.evolution.calendar.gschema.valid
|
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/*/*.args
|
||||||
docs/reference/*/*.bak
|
docs/reference/*/*.bak
|
||||||
docs/reference/*/*.hierarchy
|
docs/reference/*/*.hierarchy
|
||||||
@ -80,6 +83,7 @@ src/gnome-shell-extension-tool
|
|||||||
src/gnome-shell-hotplug-sniffer
|
src/gnome-shell-hotplug-sniffer
|
||||||
src/gnome-shell-perf-helper
|
src/gnome-shell-perf-helper
|
||||||
src/gnome-shell-perf-tool
|
src/gnome-shell-perf-tool
|
||||||
|
src/gnome-shell-portal-helper
|
||||||
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
src/hotplug-sniffer/org.gnome.Shell.HotplugSniffer.service
|
||||||
src/run-js-test
|
src/run-js-test
|
||||||
src/test-recorder
|
src/test-recorder
|
||||||
|
100
NEWS
100
NEWS
@ -1,3 +1,103 @@
|
|||||||
|
3.13.91
|
||||||
|
=======
|
||||||
|
* Fix keynav into session menu on login screen [Florian; #735614]
|
||||||
|
* Add gesture to summon message tray [Carlos G.; #735625]
|
||||||
|
* Accept scrolls/swipes either way on the screen shield [Jasper; #734874]
|
||||||
|
* Animate opening the app picker and improve app folder animations
|
||||||
|
[Carlos S.; #734726]
|
||||||
|
* Animate app icons on launching a new window [Carlos S., Florian; #734726]
|
||||||
|
* Show the on-screen keyboard when touch input is being used [David; #702015]
|
||||||
|
* Misc. bug fixes [Bastien, Owen, Florian, Carlos G.; #735190, #735385,
|
||||||
|
#735608, #735681]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Carlos Garnacho, David King, Kalev Lember, Florian Müllner, Bastien Nocera,
|
||||||
|
Carlos Soriano, Jasper St. Pierre, Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Fran Diéguez [gl], Sweta Kothari [gu], Manoj Kumar Giri [or],
|
||||||
|
Alain Lojewski [fr], Praveen Illa [te], Arash Mousavi [fa],
|
||||||
|
Andika Triwidada [id]
|
||||||
|
|
||||||
|
3.13.90
|
||||||
|
=======
|
||||||
|
* Make use of GLSL optional [Adel; #733623]
|
||||||
|
* Update on-screen-keyboard position on monitor changes [Cosimo; #733790]
|
||||||
|
* Improve window manager animations [Giovanni; #732857]
|
||||||
|
* Handle touch events [Carlos G.; #733633]
|
||||||
|
* Try to not show "New Window" action for single-window apps
|
||||||
|
[Giovanni; #722554]
|
||||||
|
* Fix overview exceeding screen size with many apps installed
|
||||||
|
[Carlos S.; #723496]
|
||||||
|
* Add Software to default favorites [Mathieu; #734406]
|
||||||
|
* Improve app picker <-> desktop transition [Carlos S.; #732901]
|
||||||
|
* Remove <shift>-magic for switcher popups [Christophe; #732296]
|
||||||
|
* Add a special background to use for performance testing [Owen; #734610]
|
||||||
|
* Add support for default disabled search providers [Giovanni; #734110]
|
||||||
|
* Fix portals that don't redirect properly [Giovanni; #733848]
|
||||||
|
* Fix history trimming in chat notifications [Giovanni; #733899]
|
||||||
|
* Try to use default calendar application [Florian; #722333]
|
||||||
|
* Only show location menu when geolocation is in use [Zeeshan; #731122]
|
||||||
|
* Misc. bug fixes and cleanups [Giovanni, Carlos G., Zeeshan, Carlos S.,
|
||||||
|
Cosimo; #711682, #733840, #734483, #734680, #733813, #735062]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Zeeshan Ali (Khattak), Mathieu Bridon, Giovanni Campagna, Cosimo Cecchi,
|
||||||
|
Piotr Drąg, Christophe Fergeau, Adel Gadllah, Carlos Garnacho,
|
||||||
|
Florian Müllner, Carlos Soriano, Jasper St. Pierre, Olav Vitters,
|
||||||
|
Owen W. Taylor
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Aurimas Černius [lt], MarMav [el], Inaki Larranaga Murgoitio [eu],
|
||||||
|
Reinout van Schouwen [nl], ngoswami [as], Fabio Tomat [fur],
|
||||||
|
Chao-Hsiung Liao [zh_HK, zh_TW]
|
||||||
|
|
||||||
|
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
|
3.13.2
|
||||||
======
|
======
|
||||||
* Make airplane mode menu insensitive in lock screen [Giovanni; #729224]
|
* Make airplane mode menu insensitive in lock screen [Giovanni; #729224]
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.13.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.13.91],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -76,7 +76,7 @@ AC_MSG_RESULT($enable_systemd)
|
|||||||
CLUTTER_MIN_VERSION=1.15.90
|
CLUTTER_MIN_VERSION=1.15.90
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
GJS_MIN_VERSION=1.39.0
|
GJS_MIN_VERSION=1.39.0
|
||||||
MUTTER_MIN_VERSION=3.13.2
|
MUTTER_MIN_VERSION=3.13.91
|
||||||
GTK_MIN_VERSION=3.7.9
|
GTK_MIN_VERSION=3.7.9
|
||||||
GIO_MIN_VERSION=2.37.0
|
GIO_MIN_VERSION=2.37.0
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
|
@ -1,6 +1,24 @@
|
|||||||
|
CLEANFILES =
|
||||||
|
|
||||||
desktopdir=$(datadir)/applications
|
desktopdir=$(datadir)/applications
|
||||||
desktop_DATA = gnome-shell.desktop gnome-shell-wayland.desktop gnome-shell-extension-prefs.desktop
|
desktop_DATA = gnome-shell.desktop gnome-shell-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
|
# We substitute in bindir so it works as an autostart
|
||||||
# file when built in a non-system prefix
|
# file when built in a non-system prefix
|
||||||
%.desktop.in:%.desktop.in.in
|
%.desktop.in:%.desktop.in.in
|
||||||
@ -35,7 +53,6 @@ dist_theme_DATA = \
|
|||||||
theme/filter-selected-rtl.svg \
|
theme/filter-selected-rtl.svg \
|
||||||
theme/gnome-shell.css \
|
theme/gnome-shell.css \
|
||||||
theme/logged-in-indicator.svg \
|
theme/logged-in-indicator.svg \
|
||||||
theme/menu-arrow-symbolic.svg \
|
|
||||||
theme/message-tray-background.png \
|
theme/message-tray-background.png \
|
||||||
theme/more-results.svg \
|
theme/more-results.svg \
|
||||||
theme/noise-texture.png \
|
theme/noise-texture.png \
|
||||||
@ -57,6 +74,13 @@ dist_theme_DATA = \
|
|||||||
theme/ws-switch-arrow-up.png \
|
theme/ws-switch-arrow-up.png \
|
||||||
theme/ws-switch-arrow-down.png
|
theme/ws-switch-arrow-down.png
|
||||||
|
|
||||||
|
backgrounddir = $(pkgdatadir)
|
||||||
|
background_DATA = perf-background.xml
|
||||||
|
|
||||||
|
perf-background.xml: perf-background.xml.in
|
||||||
|
$(AM_V_GEN) sed -e "s|@datadir[@]|$(datadir)|" \
|
||||||
|
$< > $@ || rm $@
|
||||||
|
|
||||||
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
|
keysdir = @GNOME_KEYBINDINGS_KEYSDIR@
|
||||||
keys_in_files = 50-gnome-shell-system.xml.in
|
keys_in_files = 50-gnome-shell-system.xml.in
|
||||||
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
||||||
@ -89,15 +113,19 @@ EXTRA_DIST = \
|
|||||||
$(menu_DATA) \
|
$(menu_DATA) \
|
||||||
$(convert_DATA) \
|
$(convert_DATA) \
|
||||||
$(keys_in_files) \
|
$(keys_in_files) \
|
||||||
|
perf-background.xml.in \
|
||||||
|
org.gnome.Shell.PortalHelper.desktop.in \
|
||||||
|
org.gnome.Shell.PortalHelper.service.in \
|
||||||
org.gnome.shell.gschema.xml.in.in
|
org.gnome.shell.gschema.xml.in.in
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES += \
|
||||||
gnome-shell.desktop.in \
|
gnome-shell.desktop.in \
|
||||||
gnome-shell-wayland.desktop.in \
|
gnome-shell-wayland.desktop.in \
|
||||||
gnome-shell-extension-prefs.in \
|
gnome-shell-extension-prefs.in \
|
||||||
$(desktop_DATA) \
|
$(desktop_DATA) \
|
||||||
$(keys_DATA) \
|
$(keys_DATA) \
|
||||||
$(gsettings_SCHEMAS) \
|
$(gsettings_SCHEMAS) \
|
||||||
|
perf-background.xml \
|
||||||
gschemas.compiled \
|
gschemas.compiled \
|
||||||
org.gnome.shell.gschema.valid \
|
org.gnome.shell.gschema.valid \
|
||||||
org.gnome.shell.gschema.xml.in
|
org.gnome.shell.gschema.xml.in
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
[org.gnome.shell.overrides]
|
[org.gnome.shell.overrides]
|
||||||
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
|
attach-modal-dialogs = /desktop/gnome/shell/windows/attach_modal_dialogs
|
||||||
button-layout = /desktop/gnome/shell/windows/button_layout
|
|
||||||
edge-tiling = /desktop/gnome/shell/windows/edge_tiling
|
edge-tiling = /desktop/gnome/shell/windows/edge_tiling
|
||||||
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
|
workspaces-only-on-primary = /desktop/gnome/shell/windows/workspaces_only_on_primary
|
||||||
|
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">
|
<method name="Screencast">
|
||||||
<arg type="s" direction="in" name="file_template"/>
|
<arg type="s" direction="in" name="file_template"/>
|
||||||
<arg type="a{sv}" direction="in" name="options"/>
|
<arg type="a{sv}" direction="in" name="options"/>
|
||||||
<arg type="b" direction="in" name="flash"/>
|
|
||||||
<arg type="b" direction="out" name="success"/>
|
<arg type="b" direction="out" name="success"/>
|
||||||
<arg type="s" direction="out" name="filename_used"/>
|
<arg type="s" direction="out" name="filename_used"/>
|
||||||
</method>
|
</method>
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="favorite-apps" type="as">
|
<key name="favorite-apps" type="as">
|
||||||
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop' ]</default>
|
<default>[ 'epiphany.desktop', 'evolution.desktop', 'empathy.desktop', 'rhythmbox.desktop', 'shotwell.desktop', 'libreoffice-writer.desktop', 'org.gnome.Nautilus.desktop', 'org.gnome.Documents.desktop', 'org.gnome.Software.desktop' ]</default>
|
||||||
<_summary>List of desktop file IDs for favorite applications</_summary>
|
<_summary>List of desktop file IDs for favorite applications</_summary>
|
||||||
<_description>
|
<_description>
|
||||||
The applications corresponding to these identifiers
|
The applications corresponding to these identifiers
|
||||||
@ -40,10 +40,10 @@
|
|||||||
</key>
|
</key>
|
||||||
<key name="app-picker-view" type="u">
|
<key name="app-picker-view" type="u">
|
||||||
<default>0</default>
|
<default>0</default>
|
||||||
<summary>App Picker View</summary>
|
<_summary>App Picker View</_summary>
|
||||||
<description>
|
<_description>
|
||||||
Index of the currently selected view in the application picker.
|
Index of the currently selected view in the application picker.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
<key name="command-history" type="as">
|
<key name="command-history" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
@ -74,7 +74,6 @@
|
|||||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
<child name="keyboard" schema="org.gnome.shell.keyboard"/>
|
||||||
<child name="location" schema="org.gnome.shell.location"/>
|
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
<schema id="org.gnome.shell.calendar" path="/org/gnome/shell/calendar/"
|
||||||
@ -128,8 +127,8 @@
|
|||||||
</key>
|
</key>
|
||||||
<key name="pause-resume-tweens" type="as">
|
<key name="pause-resume-tweens" type="as">
|
||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</summary>
|
<_summary>Keybinding that pauses and resumes all running tweens, for debugging purposes</_summary>
|
||||||
<description></description>
|
<_description></_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -144,42 +143,16 @@
|
|||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
<enum id="org.gnome.shell.geoclue.AccuracyLevel">
|
|
||||||
<value value="0" nick="off"/>
|
|
||||||
<value value="1" nick="country"/>
|
|
||||||
<value value="4" nick="city"/>
|
|
||||||
<value value="5" nick="neighborhood"/>
|
|
||||||
<value value="6" nick="street"/>
|
|
||||||
<value value="8" nick="exact"/>
|
|
||||||
</enum>
|
|
||||||
<schema id="org.gnome.shell.location"
|
|
||||||
path="/org/gnome/shell/location/"
|
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
|
||||||
<key name="max-accuracy-level" enum="org.gnome.shell.geoclue.AccuracyLevel">
|
|
||||||
<default>'exact'</default>
|
|
||||||
<_summary>The maximum accuracy level of location.</_summary>
|
|
||||||
<_description>
|
|
||||||
Configures the maximum level of location accuracy applications are
|
|
||||||
allowed to see. Valid options are 'off' (disable location tracking),
|
|
||||||
'country', 'city', 'neighborhood', 'street', and 'exact' (typically
|
|
||||||
requires GPS receiver). Please keep in mind that this only controls
|
|
||||||
what GeoClue will allow applications to see and they can find user's
|
|
||||||
location on their own using network resources (albeit with street-level
|
|
||||||
accuracy at best).
|
|
||||||
</_description>
|
|
||||||
</key>
|
|
||||||
</schema>
|
|
||||||
|
|
||||||
<schema id="org.gnome.shell.app-switcher"
|
<schema id="org.gnome.shell.app-switcher"
|
||||||
path="/org/gnome/shell/app-switcher/"
|
path="/org/gnome/shell/app-switcher/"
|
||||||
gettext-domain="@GETTEXT_PACKAGE@">
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>false</default>
|
<default>false</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<_summary>Limit switcher to current workspace.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
If true, only applications that have windows on the current workspace are shown in the switcher.
|
If true, only applications that have windows on the current workspace are shown in the switcher.
|
||||||
Otherwise, all applications are included.
|
Otherwise, all applications are included.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
@ -202,11 +175,11 @@
|
|||||||
</key>
|
</key>
|
||||||
<key type="b" name="current-workspace-only">
|
<key type="b" name="current-workspace-only">
|
||||||
<default>true</default>
|
<default>true</default>
|
||||||
<summary>Limit switcher to current workspace.</summary>
|
<_summary>Limit switcher to current workspace.</_summary>
|
||||||
<description>
|
<_description>
|
||||||
If true, only windows from the current workspace are shown in the switcher.
|
If true, only windows from the current workspace are shown in the switcher.
|
||||||
Otherwise, all windows are included.
|
Otherwise, all windows are included.
|
||||||
</description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
</schema>
|
</schema>
|
||||||
|
|
||||||
|
31
data/perf-background.xml.in
Normal file
31
data/perf-background.xml.in
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<!-- With an animated background, performance will differ depending on whether
|
||||||
|
one layer or two layers are being blended together. This messes up our
|
||||||
|
benchmarks. We could just benchmark a single image, but since blended
|
||||||
|
images are present for much of the day with the GNOME default background,
|
||||||
|
we want to make sure that also performs well; for that reason we ship
|
||||||
|
an "animated" background that animates super-slowly to use during
|
||||||
|
performance tests; it will be in the blended state until 2030. -->
|
||||||
|
<background>
|
||||||
|
<starttime>
|
||||||
|
<year>1990</year>
|
||||||
|
<month>1</month>
|
||||||
|
<day>1</day>
|
||||||
|
<hour>0</hour>
|
||||||
|
<minute>00</minute>
|
||||||
|
<second>00</second>
|
||||||
|
</starttime>
|
||||||
|
|
||||||
|
<!-- One transition that takes 40 years -->
|
||||||
|
<transition type="overlay">
|
||||||
|
<duration>1261440000.0</duration>
|
||||||
|
<from>@datadir@/backgrounds/gnome/adwaita-morning.jpg</from>
|
||||||
|
<to>@datadir@/backgrounds/gnome/adwaita-day.jpg</to>
|
||||||
|
</transition>
|
||||||
|
|
||||||
|
<!-- A single slide doesn't work, so another slide for 1 minute after 40 years -->
|
||||||
|
<static>
|
||||||
|
<duration>60</duration>
|
||||||
|
<file>/usr/share/backgrounds/gnome/Sandstone.jpg</file>
|
||||||
|
</static>
|
||||||
|
|
||||||
|
</background>
|
@ -45,7 +45,7 @@ stage {
|
|||||||
/* small bold */
|
/* small bold */
|
||||||
.dash-label,
|
.dash-label,
|
||||||
.window-caption,
|
.window-caption,
|
||||||
.switcher-list,
|
.switcher-list,
|
||||||
.app-well-app > .overview-icon,
|
.app-well-app > .overview-icon,
|
||||||
.show-apps > .overview-icon,
|
.show-apps > .overview-icon,
|
||||||
.grid-search-result .overview-icon {
|
.grid-search-result .overview-icon {
|
||||||
@ -478,7 +478,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
/* Common radii */
|
/* Common radii */
|
||||||
|
|
||||||
#searchEntry,
|
.search-entry,
|
||||||
.modal-dialog-button,
|
.modal-dialog-button,
|
||||||
.notification-button,
|
.notification-button,
|
||||||
.hotplug-notification-item,
|
.hotplug-notification-item,
|
||||||
@ -500,7 +500,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
/* Entries */
|
/* Entries */
|
||||||
|
|
||||||
#searchEntry,
|
.search-entry,
|
||||||
.login-dialog StEntry,
|
.login-dialog StEntry,
|
||||||
.notification StEntry,
|
.notification StEntry,
|
||||||
.modal-dialog StEntry {
|
.modal-dialog StEntry {
|
||||||
@ -512,7 +512,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry,
|
.search-entry,
|
||||||
.login-dialog StEntry,
|
.login-dialog StEntry,
|
||||||
.run-dialog-entry,
|
.run-dialog-entry,
|
||||||
.notification StEntry {
|
.notification StEntry {
|
||||||
@ -524,8 +524,8 @@ StScrollBar StButton#vhandle:active {
|
|||||||
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
|
box-shadow: inset 0px 2px 4px rgba(0,0,0,0.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:focus,
|
.search-entry:focus,
|
||||||
#searchEntry:hover,
|
.search-entry:hover,
|
||||||
.login-dialog StEntry:focus,
|
.login-dialog StEntry:focus,
|
||||||
.notification StEntry:focus,
|
.notification StEntry:focus,
|
||||||
.modal-dialog StEntry {
|
.modal-dialog StEntry {
|
||||||
@ -542,18 +542,18 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border: 2px solid #3465a4;
|
border: 2px solid #3465a4;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry {
|
.search-entry {
|
||||||
border-color: rgba(245,245,245,0.3);
|
border-color: rgba(245,245,245,0.3);
|
||||||
color: rgb(192, 192, 192);
|
color: rgb(192, 192, 192);
|
||||||
caret-color: rgb(192, 192, 192);
|
caret-color: rgb(192, 192, 192);
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:hover {
|
.search-entry:hover {
|
||||||
color: rgb(128, 128, 128);
|
color: rgb(128, 128, 128);
|
||||||
caret-color: rgb(128, 128, 128);
|
caret-color: rgb(128, 128, 128);
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:focus {
|
.search-entry:focus {
|
||||||
color: rgb(64, 64, 64);
|
color: rgb(64, 64, 64);
|
||||||
caret-color: rgb(64, 64, 64);
|
caret-color: rgb(64, 64, 64);
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@ -917,7 +917,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
/* Search Box */
|
/* Search Box */
|
||||||
|
|
||||||
#searchEntry {
|
.search-entry {
|
||||||
width: 320px;
|
width: 320px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -926,8 +926,8 @@ StScrollBar StButton#vhandle:active {
|
|||||||
color: #c0c0c0;
|
color: #c0c0c0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:hover .search-entry-icon,
|
.search-entry:hover .search-entry-icon,
|
||||||
#searchEntry:focus .search-entry-icon {
|
.search-entry:focus .search-entry-icon {
|
||||||
color: #8d8f8a;
|
color: #8d8f8a;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1159,6 +1159,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
.show-apps:checked > .overview-icon,
|
.show-apps:checked > .overview-icon,
|
||||||
.show-apps:active > .overview-icon,
|
.show-apps:active > .overview-icon,
|
||||||
.search-provider-icon:active,
|
.search-provider-icon:active,
|
||||||
|
.grid-search-result:active .overview-icon,
|
||||||
.list-search-result:active {
|
.list-search-result:active {
|
||||||
background-gradient-start: rgba(255, 255, 255, .05);
|
background-gradient-start: rgba(255, 255, 255, .05);
|
||||||
background-gradient-end: rgba(255, 255, 255, .15);
|
background-gradient-end: rgba(255, 255, 255, .15);
|
||||||
@ -2092,6 +2093,11 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Restart message */
|
||||||
|
.restart-message {
|
||||||
|
font-size: 14pt;
|
||||||
|
}
|
||||||
|
|
||||||
/* ShellMountOperation Dialogs */
|
/* ShellMountOperation Dialogs */
|
||||||
.shell-mount-operation-icon {
|
.shell-mount-operation-icon {
|
||||||
icon-size: 48px;
|
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 |
@ -27,7 +27,9 @@ its dependencies to build from tarballs.</description>
|
|||||||
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
|
<download-page rdf:resource="http://download.gnome.org/sources/gnome-shell/" />
|
||||||
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
<bug-database rdf:resource="https://bugzilla.gnome.org/browse.cgi?product=gnome-shell" />
|
||||||
|
|
||||||
<category rdf:resource="http://api.gnome.org/doap-extensions#desktop" />
|
<category rdf:resource="http://api.gnome.org/doap-extensions#core" />
|
||||||
|
<programming-language>JavaScript</programming-language>
|
||||||
|
<programming-language>C</programming-language>
|
||||||
|
|
||||||
<maintainer>
|
<maintainer>
|
||||||
<foaf:Person>
|
<foaf:Person>
|
||||||
|
@ -13,7 +13,7 @@ misc/config.js: misc/config.js.in Makefile
|
|||||||
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
-e "s|[@]sysconfdir@|$(sysconfdir)|g" \
|
||||||
$< > $@
|
$< > $@
|
||||||
|
|
||||||
js_resource_files = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir) --generate-dependencies $(srcdir)/js-resources.gresource.xml)
|
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
|
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 $<
|
$(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
|
js-resources.c: js-resources.gresource.xml $(js_resource_files) misc/config.js
|
||||||
|
@ -54,15 +54,17 @@ const Application = new Lang.Class({
|
|||||||
this._startupUuid = null;
|
this._startupUuid = null;
|
||||||
this._loaded = false;
|
this._loaded = false;
|
||||||
this._skipMainWindow = false;
|
this._skipMainWindow = false;
|
||||||
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||||
},
|
},
|
||||||
|
|
||||||
_extensionAvailable: function(uuid) {
|
_extensionAvailable: function(uuid) {
|
||||||
let extension = ExtensionUtils.extensions[uuid];
|
let extension = ExtensionUtils.extensions[uuid];
|
||||||
|
let checkVersion = !this._settings.get_boolean('disable-extension-version-validation');
|
||||||
|
|
||||||
if (!extension)
|
if (!extension)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (ExtensionUtils.isOutOfDate(extension))
|
if (checkVersion && ExtensionUtils.isOutOfDate(extension))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
if (!extension.dir.get_child('prefs.js').query_exists(null))
|
||||||
@ -278,7 +280,7 @@ const ExtensionRow = new Lang.Class({
|
|||||||
|
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: 'org.gnome.shell' });
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.shell' });
|
||||||
this._settings.connect('changed::enabled-extensions', Lang.bind(this,
|
this._settings.connect('changed::enabled-extensions', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
this._switch.state = this._isEnabled();
|
this._switch.state = this._isEnabled();
|
||||||
|
@ -382,7 +382,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
Lang.bind(this, this._onTimedLoginRequested));
|
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,
|
this._settings.connect('changed::' + GdmUtil.BANNER_MESSAGE_KEY,
|
||||||
Lang.bind(this, this._updateBanner));
|
Lang.bind(this, this._updateBanner));
|
||||||
@ -926,6 +926,8 @@ const LoginDialog = new Lang.Class({
|
|||||||
this.actor.show();
|
this.actor.show();
|
||||||
this.actor.opacity = 0;
|
this.actor.opacity = 0;
|
||||||
|
|
||||||
|
Main.pushModal(this.actor, { keybindingMode: Shell.KeyBindingMode.LOGIN_SCREEN });
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
Tweener.addTween(this.actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: 1,
|
time: 1,
|
||||||
@ -935,7 +937,8 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
close: function() {
|
close: function() {
|
||||||
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
Main.popModal(this.actor);
|
||||||
|
Main.ctrlAltTabManager.removeGroup(this.actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
cancel: function() {
|
cancel: function() {
|
||||||
|
@ -128,7 +128,7 @@ const ShellUserVerifier = new Lang.Class({
|
|||||||
|
|
||||||
this._client = client;
|
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',
|
this._settings.connect('changed',
|
||||||
Lang.bind(this, this._updateDefaultService));
|
Lang.bind(this, this._updateDefaultService));
|
||||||
this._updateDefaultService();
|
this._updateDefaultService();
|
||||||
|
@ -25,6 +25,9 @@
|
|||||||
<file>misc/util.js</file>
|
<file>misc/util.js</file>
|
||||||
|
|
||||||
<file>perf/core.js</file>
|
<file>perf/core.js</file>
|
||||||
|
<file>perf/hwtest.js</file>
|
||||||
|
|
||||||
|
<file>portalHelper/main.js</file>
|
||||||
|
|
||||||
<file>ui/altTab.js</file>
|
<file>ui/altTab.js</file>
|
||||||
<file>ui/animation.js</file>
|
<file>ui/animation.js</file>
|
||||||
@ -39,6 +42,7 @@
|
|||||||
<file>ui/dash.js</file>
|
<file>ui/dash.js</file>
|
||||||
<file>ui/dateMenu.js</file>
|
<file>ui/dateMenu.js</file>
|
||||||
<file>ui/dnd.js</file>
|
<file>ui/dnd.js</file>
|
||||||
|
<file>ui/edgeDragAction.js</file>
|
||||||
<file>ui/endSessionDialog.js</file>
|
<file>ui/endSessionDialog.js</file>
|
||||||
<file>ui/environment.js</file>
|
<file>ui/environment.js</file>
|
||||||
<file>ui/extensionDownloader.js</file>
|
<file>ui/extensionDownloader.js</file>
|
||||||
|
@ -72,6 +72,9 @@ function run() {
|
|||||||
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
Scripting.defineScriptEvent("applicationsShowStart", "Starting to switch to applications view");
|
||||||
Scripting.defineScriptEvent("applicationsShowDone", "Done switching 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() {
|
Main.overview.connect('shown', function() {
|
||||||
Scripting.scriptEvent('overviewShowDone');
|
Scripting.scriptEvent('overviewShowDone');
|
||||||
});
|
});
|
||||||
@ -87,7 +90,10 @@ function run() {
|
|||||||
yield Scripting.destroyTestWindows();
|
yield Scripting.destroyTestWindows();
|
||||||
|
|
||||||
for (let k = 0; k < config.count; k++)
|
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.waitTestWindows();
|
||||||
yield Scripting.sleep(1000);
|
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('org.gnome.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(function(a, b) { return a - b });
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
247
js/portalHelper/main.js
Normal file
247
js/portalHelper/main.js
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
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) {
|
||||||
|
url = 'http://www.gnome.org';
|
||||||
|
this._originalUrlWasGnome = true;
|
||||||
|
} else {
|
||||||
|
this._originalUrlWasGnome = false;
|
||||||
|
}
|
||||||
|
this._uri = new Soup.URI(url);
|
||||||
|
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 (!uri.host_equal(this._uri) && this._originalUrlWasGnome) {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
||||||
|
// nmcheck.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;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
@ -151,13 +151,13 @@ const AppSwitcherPopup = new Lang.Class({
|
|||||||
this._items[this._selectedIndex].cachedWindows.length);
|
this._items[this._selectedIndex].cachedWindows.length);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
if (action == Meta.KeyBindingAction.SWITCH_GROUP) {
|
||||||
this._select(this._selectedIndex, backwards ? this._previousWindow() : this._nextWindow());
|
this._select(this._selectedIndex, this._nextWindow());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
|
||||||
this._select(this._selectedIndex, this._previousWindow());
|
this._select(this._selectedIndex, this._previousWindow());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS) {
|
||||||
this._select(backwards ? this._previous() : this._next());
|
this._select(this._next());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD) {
|
||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
} else if (this._thumbnailsFocused) {
|
} else if (this._thumbnailsFocused) {
|
||||||
@ -367,7 +367,7 @@ const WindowSwitcherPopup = new Lang.Class({
|
|||||||
|
|
||||||
_init: function(items) {
|
_init: function(items) {
|
||||||
this.parent(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() {
|
_getWindowList: function() {
|
||||||
@ -400,9 +400,9 @@ const WindowSwitcherPopup = new Lang.Class({
|
|||||||
this._select(1);
|
this._select(1);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
|
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS) {
|
||||||
this._select(backwards ? this._previous() : this._next());
|
this._select(this._next());
|
||||||
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD) {
|
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD) {
|
||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
} else {
|
} else {
|
||||||
@ -456,7 +456,7 @@ const AppSwitcher = new Lang.Class({
|
|||||||
this._arrows = [];
|
this._arrows = [];
|
||||||
|
|
||||||
let windowTracker = Shell.WindowTracker.get_default();
|
let windowTracker = Shell.WindowTracker.get_default();
|
||||||
let settings = new Gio.Settings({ schema: '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()
|
let workspace = settings.get_boolean('current-workspace-only') ? global.screen.get_active_workspace()
|
||||||
: null;
|
: null;
|
||||||
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
let allWindows = global.display.get_tab_list(Meta.TabList.NORMAL, workspace);
|
||||||
|
@ -16,6 +16,7 @@ const Atk = imports.gi.Atk;
|
|||||||
const AppFavorites = imports.ui.appFavorites;
|
const AppFavorites = imports.ui.appFavorites;
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const DND = imports.ui.dnd;
|
const DND = imports.ui.dnd;
|
||||||
|
const GrabHelper = imports.ui.grabHelper;
|
||||||
const IconGrid = imports.ui.iconGrid;
|
const IconGrid = imports.ui.iconGrid;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
@ -33,7 +34,9 @@ const MIN_COLUMNS = 4;
|
|||||||
const MIN_ROWS = 4;
|
const MIN_ROWS = 4;
|
||||||
|
|
||||||
const INACTIVE_GRID_OPACITY = 77;
|
const INACTIVE_GRID_OPACITY = 77;
|
||||||
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.40;
|
// This time needs to be less than IconGrid.EXTRA_SPACE_ANIMATION_TIME
|
||||||
|
// to not clash with other animations
|
||||||
|
const INACTIVE_GRID_OPACITY_ANIMATION_TIME = 0.24;
|
||||||
const FOLDER_SUBICON_FRACTION = .4;
|
const FOLDER_SUBICON_FRACTION = .4;
|
||||||
|
|
||||||
const MIN_FREQUENT_APPS_COUNT = 3;
|
const MIN_FREQUENT_APPS_COUNT = 3;
|
||||||
@ -42,6 +45,16 @@ const INDICATORS_BASE_TIME = 0.25;
|
|||||||
const INDICATORS_ANIMATION_DELAY = 0.125;
|
const INDICATORS_ANIMATION_DELAY = 0.125;
|
||||||
const INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
const INDICATORS_ANIMATION_MAX_TIME = 0.75;
|
||||||
|
|
||||||
|
// Follow iconGrid animations approach and divide by 2 to animate out to
|
||||||
|
// not annoy the user when the user wants to quit appDisplay.
|
||||||
|
// Also, make sure we don't exceed iconGrid animation total time or
|
||||||
|
// views switch time.
|
||||||
|
const INDICATORS_BASE_TIME_OUT = 0.125;
|
||||||
|
const INDICATORS_ANIMATION_DELAY_OUT = 0.0625;
|
||||||
|
const INDICATORS_ANIMATION_MAX_TIME_OUT =
|
||||||
|
Math.min (VIEWS_SWITCH_TIME,
|
||||||
|
IconGrid.ANIMATION_TIME_OUT + IconGrid.ANIMATION_MAX_DELAY_OUT_FOR_ITEM);
|
||||||
|
|
||||||
const PAGE_SWITCH_TIME = 0.3;
|
const PAGE_SWITCH_TIME = 0.3;
|
||||||
|
|
||||||
const VIEWS_SWITCH_TIME = 0.4;
|
const VIEWS_SWITCH_TIME = 0.4;
|
||||||
@ -176,26 +189,98 @@ const BaseAppView = new Lang.Class({
|
|||||||
this.selectApp(id);
|
this.selectApp(id);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_doSpringAnimation: function(animationDirection) {
|
||||||
|
this._grid.actor.opacity = 255;
|
||||||
|
this._grid.animateSpring(animationDirection,
|
||||||
|
Main.overview.getShowAppsButton());
|
||||||
|
},
|
||||||
|
|
||||||
|
animate: function(animationDirection, onComplete) {
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
||||||
|
let toAnimate = this._grid.actor.connect('notify::allocation', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._grid.actor.disconnect(toAnimate);
|
||||||
|
// We need to hide the grid temporary to not flash it
|
||||||
|
// for a frame
|
||||||
|
this._grid.actor.opacity = 0;
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._doSpringAnimation(animationDirection)
|
||||||
|
}));
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this._doSpringAnimation(animationDirection);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (onComplete) {
|
||||||
|
let animationDoneId = this._grid.connect('animation-done', Lang.bind(this,
|
||||||
|
function () {
|
||||||
|
this._grid.disconnect(animationDoneId);
|
||||||
|
onComplete();
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
animateSwitch: function(animationDirection) {
|
||||||
|
Tweener.removeTweens(this.actor);
|
||||||
|
Tweener.removeTweens(this._grid.actor);
|
||||||
|
|
||||||
|
let params = { time: VIEWS_SWITCH_TIME,
|
||||||
|
transition: 'easeOutQuad' };
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
||||||
|
this.actor.show();
|
||||||
|
params.opacity = 255;
|
||||||
|
params.delay = VIEWS_SWITCH_ANIMATION_DELAY;
|
||||||
|
} else {
|
||||||
|
params.opacity = 0;
|
||||||
|
params.delay = 0;
|
||||||
|
params.onComplete = Lang.bind(this, function() { this.actor.hide() });
|
||||||
|
}
|
||||||
|
|
||||||
|
Tweener.addTween(this._grid.actor, params);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(BaseAppView.prototype);
|
Signals.addSignalMethods(BaseAppView.prototype);
|
||||||
|
|
||||||
|
const PageIndicatorsActor = new Lang.Class({
|
||||||
|
Name:'PageIndicatorsActor',
|
||||||
|
Extends: St.BoxLayout,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this.parent({ style_class: 'page-indicators',
|
||||||
|
vertical: true,
|
||||||
|
x_expand: true, y_expand: true,
|
||||||
|
x_align: Clutter.ActorAlign.END,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
reactive: true,
|
||||||
|
clip_to_allocation: true });
|
||||||
|
},
|
||||||
|
|
||||||
|
vfunc_get_preferred_height: function(forWidth) {
|
||||||
|
// We want to request the natural height of all our children as our
|
||||||
|
// natural height, so we chain up to St.BoxLayout, but we only request 0
|
||||||
|
// as minimum height, since it's not that important if some indicators
|
||||||
|
// are not shown
|
||||||
|
let [, natHeight] = this.parent(forWidth);
|
||||||
|
return [0, natHeight];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const PageIndicators = new Lang.Class({
|
const PageIndicators = new Lang.Class({
|
||||||
Name:'PageIndicators',
|
Name:'PageIndicators',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.BoxLayout({ style_class: 'page-indicators',
|
this.actor = new PageIndicatorsActor();
|
||||||
vertical: true,
|
|
||||||
x_expand: true, y_expand: true,
|
|
||||||
x_align: Clutter.ActorAlign.END,
|
|
||||||
y_align: Clutter.ActorAlign.CENTER,
|
|
||||||
reactive: true });
|
|
||||||
this._nPages = 0;
|
this._nPages = 0;
|
||||||
this._currentPage = undefined;
|
this._currentPage = undefined;
|
||||||
|
|
||||||
this.actor.connect('notify::mapped',
|
this.actor.connect('notify::mapped',
|
||||||
Lang.bind(this, this._animateIndicators));
|
Lang.bind(this, function() {
|
||||||
|
this.animateIndicators(IconGrid.AnimationDirection.IN);
|
||||||
|
})
|
||||||
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
setNPages: function(nPages) {
|
setNPages: function(nPages) {
|
||||||
@ -236,7 +321,7 @@ const PageIndicators = new Lang.Class({
|
|||||||
children[i].set_checked(i == this._currentPage);
|
children[i].set_checked(i == this._currentPage);
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateIndicators: function() {
|
animateIndicators: function(animationDirection) {
|
||||||
if (!this.actor.mapped)
|
if (!this.actor.mapped)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -244,24 +329,32 @@ const PageIndicators = new Lang.Class({
|
|||||||
if (children.length == 0)
|
if (children.length == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._nPages; i++)
|
||||||
|
Tweener.removeTweens(children[i]);
|
||||||
|
|
||||||
let offset;
|
let offset;
|
||||||
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
|
if (this.actor.get_text_direction() == Clutter.TextDirection.RTL)
|
||||||
offset = -children[0].width;
|
offset = -children[0].width;
|
||||||
else
|
else
|
||||||
offset = children[0].width;
|
offset = children[0].width;
|
||||||
|
|
||||||
let delay = INDICATORS_ANIMATION_DELAY;
|
let isAnimationIn = animationDirection == IconGrid.AnimationDirection.IN;
|
||||||
let totalAnimationTime = INDICATORS_BASE_TIME + INDICATORS_ANIMATION_DELAY * this._nPages;
|
let delay = isAnimationIn ? INDICATORS_ANIMATION_DELAY :
|
||||||
if (totalAnimationTime > INDICATORS_ANIMATION_MAX_TIME)
|
INDICATORS_ANIMATION_DELAY_OUT;
|
||||||
delay -= (totalAnimationTime - INDICATORS_ANIMATION_MAX_TIME) / this._nPages;
|
let baseTime = isAnimationIn ? INDICATORS_BASE_TIME : INDICATORS_BASE_TIME_OUT;
|
||||||
|
let totalAnimationTime = baseTime + delay * this._nPages;
|
||||||
|
let maxTime = isAnimationIn ? INDICATORS_ANIMATION_MAX_TIME :
|
||||||
|
INDICATORS_ANIMATION_MAX_TIME_OUT;
|
||||||
|
if (totalAnimationTime > maxTime)
|
||||||
|
delay -= (totalAnimationTime - maxTime) / this._nPages;
|
||||||
|
|
||||||
for (let i = 0; i < this._nPages; i++) {
|
for (let i = 0; i < this._nPages; i++) {
|
||||||
children[i].translation_x = offset;
|
children[i].translation_x = isAnimationIn ? offset : 0;
|
||||||
Tweener.addTween(children[i],
|
Tweener.addTween(children[i],
|
||||||
{ translation_x: 0,
|
{ translation_x: isAnimationIn ? 0 : offset,
|
||||||
time: INDICATORS_BASE_TIME + delay * i,
|
time: baseTime + delay * i,
|
||||||
transition: 'easeInOutQuad',
|
transition: 'easeInOutQuad',
|
||||||
delay: VIEWS_SWITCH_ANIMATION_DELAY
|
delay: isAnimationIn ? VIEWS_SWITCH_ANIMATION_DELAY : 0
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -304,7 +397,7 @@ const AllView = new Lang.Class({
|
|||||||
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
this._stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
|
||||||
let box = new St.BoxLayout({ vertical: true });
|
let box = new St.BoxLayout({ vertical: true });
|
||||||
|
|
||||||
this._currentPage = 0;
|
this._grid.currentPage = 0;
|
||||||
this._stack.add_actor(this._grid.actor);
|
this._stack.add_actor(this._grid.actor);
|
||||||
this._eventBlocker = new St.Widget({ x_expand: true, y_expand: true });
|
this._eventBlocker = new St.Widget({ x_expand: true, y_expand: true });
|
||||||
this._stack.add_actor(this._eventBlocker);
|
this._stack.add_actor(this._eventBlocker);
|
||||||
@ -370,7 +463,7 @@ const AllView = new Lang.Class({
|
|||||||
Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, function() {
|
Shell.AppSystem.get_default().connect('installed-changed', Lang.bind(this, function() {
|
||||||
Main.queueDeferredWork(this._redisplayWorkId);
|
Main.queueDeferredWork(this._redisplayWorkId);
|
||||||
}));
|
}));
|
||||||
this._folderSettings = new Gio.Settings({ schema: '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() {
|
this._folderSettings.connect('changed::folder-children', Lang.bind(this, function() {
|
||||||
Main.queueDeferredWork(this._redisplayWorkId);
|
Main.queueDeferredWork(this._redisplayWorkId);
|
||||||
}));
|
}));
|
||||||
@ -436,14 +529,52 @@ const AllView = new Lang.Class({
|
|||||||
this._refilterApps();
|
this._refilterApps();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Overriden from BaseAppView
|
||||||
|
animate: function (animationDirection, onComplete) {
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.OUT &&
|
||||||
|
this._displayingPopup && this._currentPopup) {
|
||||||
|
this._currentPopup.popdown();
|
||||||
|
let spaceClosedId = this._grid.connect('space-closed', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._grid.disconnect(spaceClosedId);
|
||||||
|
// Given that we can't call this.parent() inside the
|
||||||
|
// signal handler, call again animate which will
|
||||||
|
// call the parent given that popup is already
|
||||||
|
// closed.
|
||||||
|
this.animate(animationDirection, onComplete);
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this.parent(animationDirection, onComplete);
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.OUT)
|
||||||
|
this._pageIndicators.animateIndicators(animationDirection);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
animateSwitch: function(animationDirection) {
|
||||||
|
this.parent(animationDirection);
|
||||||
|
|
||||||
|
if (this._currentPopup && this._displayingPopup &&
|
||||||
|
animationDirection == IconGrid.AnimationDirection.OUT)
|
||||||
|
Tweener.addTween(this._currentPopup.actor,
|
||||||
|
{ time: VIEWS_SWITCH_TIME,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
opacity: 0,
|
||||||
|
onComplete: function() {
|
||||||
|
this.opacity = 255;
|
||||||
|
} });
|
||||||
|
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.OUT)
|
||||||
|
this._pageIndicators.animateIndicators(animationDirection);
|
||||||
|
},
|
||||||
|
|
||||||
getCurrentPageY: function() {
|
getCurrentPageY: function() {
|
||||||
return this._grid.getPageY(this._currentPage);
|
return this._grid.getPageY(this._grid.currentPage);
|
||||||
},
|
},
|
||||||
|
|
||||||
goToPage: function(pageNumber) {
|
goToPage: function(pageNumber) {
|
||||||
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
|
pageNumber = clamp(pageNumber, 0, this._grid.nPages() - 1);
|
||||||
|
|
||||||
if (this._currentPage == pageNumber && this._displayingPopup && this._currentPopup)
|
if (this._grid.currentPage == pageNumber && this._displayingPopup && this._currentPopup)
|
||||||
return;
|
return;
|
||||||
if (this._displayingPopup && this._currentPopup)
|
if (this._displayingPopup && this._currentPopup)
|
||||||
this._currentPopup.popdown();
|
this._currentPopup.popdown();
|
||||||
@ -463,7 +594,7 @@ const AllView = new Lang.Class({
|
|||||||
let time;
|
let time;
|
||||||
// Only take the velocity into account on page changes, otherwise
|
// Only take the velocity into account on page changes, otherwise
|
||||||
// return smoothly to the current page using the default velocity
|
// return smoothly to the current page using the default velocity
|
||||||
if (this._currentPage != pageNumber) {
|
if (this._grid.currentPage != pageNumber) {
|
||||||
let minVelocity = totalHeight / (PAGE_SWITCH_TIME * 1000);
|
let minVelocity = totalHeight / (PAGE_SWITCH_TIME * 1000);
|
||||||
velocity = Math.max(minVelocity, velocity);
|
velocity = Math.max(minVelocity, velocity);
|
||||||
time = (diffToPage / velocity) / 1000;
|
time = (diffToPage / velocity) / 1000;
|
||||||
@ -474,9 +605,9 @@ const AllView = new Lang.Class({
|
|||||||
// longer than PAGE_SWITCH_TIME
|
// longer than PAGE_SWITCH_TIME
|
||||||
time = Math.min(time, PAGE_SWITCH_TIME);
|
time = Math.min(time, PAGE_SWITCH_TIME);
|
||||||
|
|
||||||
this._currentPage = pageNumber;
|
this._grid.currentPage = pageNumber;
|
||||||
Tweener.addTween(this._adjustment,
|
Tweener.addTween(this._adjustment,
|
||||||
{ value: this._grid.getPageY(this._currentPage),
|
{ value: this._grid.getPageY(this._grid.currentPage),
|
||||||
time: time,
|
time: time,
|
||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
this._pageIndicators.setCurrentPage(pageNumber);
|
this._pageIndicators.setCurrentPage(pageNumber);
|
||||||
@ -505,9 +636,9 @@ const AllView = new Lang.Class({
|
|||||||
|
|
||||||
let direction = event.get_scroll_direction();
|
let direction = event.get_scroll_direction();
|
||||||
if (direction == Clutter.ScrollDirection.UP)
|
if (direction == Clutter.ScrollDirection.UP)
|
||||||
this.goToPage(this._currentPage - 1);
|
this.goToPage(this._grid.currentPage - 1);
|
||||||
else if (direction == Clutter.ScrollDirection.DOWN)
|
else if (direction == Clutter.ScrollDirection.DOWN)
|
||||||
this.goToPage(this._currentPage + 1);
|
this.goToPage(this._grid.currentPage + 1);
|
||||||
|
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
},
|
},
|
||||||
@ -547,10 +678,10 @@ const AllView = new Lang.Class({
|
|||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
|
|
||||||
if (event.get_key_symbol() == Clutter.Page_Up) {
|
if (event.get_key_symbol() == Clutter.Page_Up) {
|
||||||
this.goToPage(this._currentPage - 1);
|
this.goToPage(this._grid.currentPage - 1);
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
} else if (event.get_key_symbol() == Clutter.Page_Down) {
|
} else if (event.get_key_symbol() == Clutter.Page_Down) {
|
||||||
this.goToPage(this._currentPage + 1);
|
this.goToPage(this._grid.currentPage + 1);
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -611,6 +742,7 @@ const AllView = new Lang.Class({
|
|||||||
|
|
||||||
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
if (this._availWidth != availWidth || this._availHeight != availHeight || oldNPages != this._grid.nPages()) {
|
||||||
this._adjustment.value = 0;
|
this._adjustment.value = 0;
|
||||||
|
this._grid.currentPage = 0;
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
this._pageIndicators.setNPages(this._grid.nPages());
|
this._pageIndicators.setNPages(this._grid.nPages());
|
||||||
@ -740,7 +872,7 @@ const AppDisplay = new Lang.Class({
|
|||||||
Name: 'AppDisplay',
|
Name: 'AppDisplay',
|
||||||
|
|
||||||
_init: function() {
|
_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',
|
this._privacySettings.connect('changed::remember-app-usage',
|
||||||
Lang.bind(this, this._updateFrequentVisibility));
|
Lang.bind(this, this._updateFrequentVisibility));
|
||||||
|
|
||||||
@ -772,6 +904,19 @@ const AppDisplay = new Lang.Class({
|
|||||||
let layout = new ControlsBoxLayout({ homogeneous: true });
|
let layout = new ControlsBoxLayout({ homogeneous: true });
|
||||||
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
this._controls = new St.Widget({ style_class: 'app-view-controls',
|
||||||
layout_manager: layout });
|
layout_manager: layout });
|
||||||
|
this._controls.connect('notify::mapped', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
// controls are faded either with their parent or
|
||||||
|
// explicitly in animate(); we can't know how they'll be
|
||||||
|
// shown next, so make sure to restore their opacity
|
||||||
|
// when they are hidden
|
||||||
|
if (this._controls.mapped)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Tweener.removeTweens(this._controls);
|
||||||
|
this._controls.opacity = 255;
|
||||||
|
}));
|
||||||
|
|
||||||
layout.hookup_style(this._controls);
|
layout.hookup_style(this._controls);
|
||||||
this.actor.add_actor(new St.Bin({ child: this._controls }));
|
this.actor.add_actor(new St.Bin({ child: this._controls }));
|
||||||
|
|
||||||
@ -795,23 +940,39 @@ const AppDisplay = new Lang.Class({
|
|||||||
this._updateFrequentVisibility();
|
this._updateFrequentVisibility();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
animate: function(animationDirection, onComplete) {
|
||||||
|
let currentView = this._views[global.settings.get_uint('app-picker-view')].view;
|
||||||
|
|
||||||
|
// Animate controls opacity using iconGrid animation time, since
|
||||||
|
// it will be the time the AllView or FrequentView takes to show
|
||||||
|
// it entirely.
|
||||||
|
let finalOpacity;
|
||||||
|
if (animationDirection == IconGrid.AnimationDirection.IN) {
|
||||||
|
this._controls.opacity = 0;
|
||||||
|
finalOpacity = 255;
|
||||||
|
} else {
|
||||||
|
finalOpacity = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
Tweener.addTween(this._controls,
|
||||||
|
{ time: IconGrid.ANIMATION_TIME_IN,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
opacity: finalOpacity,
|
||||||
|
});
|
||||||
|
|
||||||
|
currentView.animate(animationDirection, onComplete);
|
||||||
|
},
|
||||||
|
|
||||||
_showView: function(activeIndex) {
|
_showView: function(activeIndex) {
|
||||||
for (let i = 0; i < this._views.length; i++) {
|
for (let i = 0; i < this._views.length; i++) {
|
||||||
let actor = this._views[i].view.actor;
|
|
||||||
|
|
||||||
let params = { time: VIEWS_SWITCH_TIME,
|
|
||||||
opacity: (i == activeIndex) ? 255 : 0,
|
|
||||||
delay: (i == activeIndex) ? VIEWS_SWITCH_ANIMATION_DELAY : 0 };
|
|
||||||
if (i == activeIndex)
|
|
||||||
actor.visible = true;
|
|
||||||
else
|
|
||||||
params.onComplete = function() { actor.hide(); };
|
|
||||||
Tweener.addTween(actor, params);
|
|
||||||
|
|
||||||
if (i == activeIndex)
|
if (i == activeIndex)
|
||||||
this._views[i].control.add_style_pseudo_class('checked');
|
this._views[i].control.add_style_pseudo_class('checked');
|
||||||
else
|
else
|
||||||
this._views[i].control.remove_style_pseudo_class('checked');
|
this._views[i].control.remove_style_pseudo_class('checked');
|
||||||
|
|
||||||
|
let animationDirection = i == activeIndex ? IconGrid.AnimationDirection.IN :
|
||||||
|
IconGrid.AnimationDirection.OUT;
|
||||||
|
this._views[i].view.animateSwitch(animationDirection);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -893,26 +1054,6 @@ const AppSearchProvider = new Lang.Class({
|
|||||||
this.getInitialResultSet(terms, callback, cancellable);
|
this.getInitialResultSet(terms, callback, cancellable);
|
||||||
},
|
},
|
||||||
|
|
||||||
activateResult: function(result) {
|
|
||||||
let app = this._appSys.lookup_app(result);
|
|
||||||
let event = Clutter.get_current_event();
|
|
||||||
let modifiers = event ? event.get_state() : 0;
|
|
||||||
let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK;
|
|
||||||
|
|
||||||
if (openNewWindow)
|
|
||||||
app.open_new_window(-1);
|
|
||||||
else
|
|
||||||
app.activate();
|
|
||||||
},
|
|
||||||
|
|
||||||
dragActivateResult: function(id, params) {
|
|
||||||
params = Params.parse(params, { workspace: -1,
|
|
||||||
timestamp: 0 });
|
|
||||||
|
|
||||||
let app = this._appSys.lookup_app(id);
|
|
||||||
app.open_new_window(workspace);
|
|
||||||
},
|
|
||||||
|
|
||||||
createResultObject: function (resultMeta) {
|
createResultObject: function (resultMeta) {
|
||||||
let app = this._appSys.lookup_app(resultMeta['id']);
|
let app = this._appSys.lookup_app(resultMeta['id']);
|
||||||
return new AppIcon(app);
|
return new AppIcon(app);
|
||||||
@ -944,14 +1085,20 @@ const FolderView = new Lang.Class({
|
|||||||
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
Util.ensureActorVisibleInScrollView(this.actor, actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Overriden from BaseAppView
|
||||||
|
animate: function(animationDirection) {
|
||||||
|
this._grid.animatePulse(animationDirection);
|
||||||
|
},
|
||||||
|
|
||||||
createFolderIcon: function(size) {
|
createFolderIcon: function(size) {
|
||||||
let layout = new Clutter.TableLayout();
|
let layout = new Clutter.GridLayout();
|
||||||
let icon = new St.Widget({ layout_manager: layout,
|
let icon = new St.Widget({ layout_manager: layout,
|
||||||
style_class: 'app-folder-icon' });
|
style_class: 'app-folder-icon' });
|
||||||
layout.hookup_style(icon);
|
layout.hookup_style(icon);
|
||||||
let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
|
let subSize = Math.floor(FOLDER_SUBICON_FRACTION * size);
|
||||||
|
|
||||||
let numItems = this._allItems.length;
|
let numItems = this._allItems.length;
|
||||||
|
let rtl = icon.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
for (let i = 0; i < 4; i++) {
|
for (let i = 0; i < 4; i++) {
|
||||||
let bin;
|
let bin;
|
||||||
if (i < numItems) {
|
if (i < numItems) {
|
||||||
@ -960,7 +1107,7 @@ const FolderView = new Lang.Class({
|
|||||||
} else {
|
} else {
|
||||||
bin = new St.Bin({ width: subSize, height: subSize });
|
bin = new St.Bin({ width: subSize, height: subSize });
|
||||||
}
|
}
|
||||||
layout.pack(bin, i % 2, Math.floor(i / 2));
|
layout.attach(bin, rtl ? (i + 1) % 2 : i % 2, Math.floor(i / 2), 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return icon;
|
return icon;
|
||||||
@ -1249,18 +1396,53 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
function() {
|
function() {
|
||||||
this.actor.destroy();
|
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));
|
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress));
|
||||||
},
|
},
|
||||||
|
|
||||||
_onKeyPress: function(actor, event) {
|
_onKeyPress: function(actor, event) {
|
||||||
if (!this._isOpen)
|
if (global.stage.get_key_focus() != actor)
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
if (event.get_key_symbol() != Clutter.KEY_Escape)
|
// Since we need to only grab focus on one item child when the user
|
||||||
return Clutter.EVENT_PROPAGATE;
|
// 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();
|
// Use TAB_FORWARD for down key and right key
|
||||||
return Clutter.EVENT_STOP;
|
// 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() {
|
toggle: function() {
|
||||||
@ -1274,15 +1456,27 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
if (this._isOpen)
|
if (this._isOpen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._isOpen = this._grabHelper.grab({ actor: this.actor,
|
||||||
|
onUngrab: Lang.bind(this, this.popdown) });
|
||||||
|
|
||||||
|
if (!this._isOpen)
|
||||||
|
return;
|
||||||
|
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
|
|
||||||
this._boxPointer.setArrowActor(this._source.actor);
|
this._boxPointer.setArrowActor(this._source.actor);
|
||||||
|
// We need to hide the icons of the view until the boxpointer animation
|
||||||
|
// is completed so we can animate the icons after as we like without
|
||||||
|
// showing them while boxpointer is animating.
|
||||||
|
this._view.actor.opacity = 0;
|
||||||
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
this._boxPointer.show(BoxPointer.PopupAnimation.FADE |
|
||||||
BoxPointer.PopupAnimation.SLIDE);
|
BoxPointer.PopupAnimation.SLIDE,
|
||||||
|
Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._view.actor.opacity = 255;
|
||||||
|
this._view.animate(IconGrid.AnimationDirection.IN);
|
||||||
|
}));
|
||||||
|
|
||||||
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
|
||||||
|
|
||||||
this._isOpen = true;
|
|
||||||
this.emit('open-state-changed', true);
|
this.emit('open-state-changed', true);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1290,6 +1484,8 @@ const AppFolderPopup = new Lang.Class({
|
|||||||
if (!this._isOpen)
|
if (!this._isOpen)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._grabHelper.ungrab({ actor: this.actor });
|
||||||
|
|
||||||
this._boxPointer.hide(BoxPointer.PopupAnimation.FADE |
|
this._boxPointer.hide(BoxPointer.PopupAnimation.FADE |
|
||||||
BoxPointer.PopupAnimation.SLIDE);
|
BoxPointer.PopupAnimation.SLIDE);
|
||||||
this._isOpen = false;
|
this._isOpen = false;
|
||||||
@ -1340,7 +1536,9 @@ const AppIcon = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.label_actor = this.icon.label;
|
this.actor.label_actor = this.icon.label;
|
||||||
|
|
||||||
|
this.actor.connect('leave-event', Lang.bind(this, this._onLeaveEvent));
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||||
|
this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent));
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||||
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
|
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
|
||||||
|
|
||||||
@ -1396,17 +1594,26 @@ const AppIcon = new Lang.Class({
|
|||||||
this.actor.remove_style_class_name('running');
|
this.actor.remove_style_class_name('running');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setPopupTimeout: function() {
|
||||||
|
this._removeMenuTimeout();
|
||||||
|
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._menuTimeoutId = 0;
|
||||||
|
this.popupMenu();
|
||||||
|
return GLib.SOURCE_REMOVE;
|
||||||
|
}));
|
||||||
|
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
|
||||||
|
},
|
||||||
|
|
||||||
|
_onLeaveEvent: function(actor, event) {
|
||||||
|
this.actor.fake_release();
|
||||||
|
this._removeMenuTimeout();
|
||||||
|
},
|
||||||
|
|
||||||
_onButtonPress: function(actor, event) {
|
_onButtonPress: function(actor, event) {
|
||||||
let button = event.get_button();
|
let button = event.get_button();
|
||||||
if (button == 1) {
|
if (button == 1) {
|
||||||
this._removeMenuTimeout();
|
this._setPopupTimeout();
|
||||||
this._menuTimeoutId = Mainloop.timeout_add(MENU_POPUP_TIMEOUT,
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
this._menuTimeoutId = 0;
|
|
||||||
this.popupMenu();
|
|
||||||
return GLib.SOURCE_REMOVE;
|
|
||||||
}));
|
|
||||||
GLib.Source.set_name_by_id(this._menuTimeoutId, '[gnome-shell] this.popupMenu');
|
|
||||||
} else if (button == 3) {
|
} else if (button == 3) {
|
||||||
this.popupMenu();
|
this.popupMenu();
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
@ -1414,16 +1621,16 @@ const AppIcon = new Lang.Class({
|
|||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onTouchEvent: function (actor, event) {
|
||||||
|
if (event.type() == Clutter.EventType.TOUCH_BEGIN)
|
||||||
|
this._setPopupTimeout();
|
||||||
|
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
},
|
||||||
|
|
||||||
_onClicked: function(actor, button) {
|
_onClicked: function(actor, button) {
|
||||||
this._removeMenuTimeout();
|
this._removeMenuTimeout();
|
||||||
|
this.activate(button);
|
||||||
if (button == 1) {
|
|
||||||
this._onActivate(Clutter.get_current_event());
|
|
||||||
} else if (button == 2) {
|
|
||||||
this.app.open_new_window(-1);
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onKeyboardPopupMenu: function() {
|
_onKeyboardPopupMenu: function() {
|
||||||
@ -1477,19 +1684,28 @@ const AppIcon = new Lang.Class({
|
|||||||
this.emit('menu-state-changed', false);
|
this.emit('menu-state-changed', false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onActivate: function (event) {
|
activate: function (button) {
|
||||||
let modifiers = event.get_state();
|
let event = Clutter.get_current_event();
|
||||||
|
let modifiers = event ? event.get_state() : 0;
|
||||||
|
let openNewWindow = modifiers & Clutter.ModifierType.CONTROL_MASK &&
|
||||||
|
this.app.state == Shell.AppState.RUNNING ||
|
||||||
|
button && button == 2;
|
||||||
|
|
||||||
if (modifiers & Clutter.ModifierType.CONTROL_MASK
|
if (this.app.state == Shell.AppState.STOPPED || openNewWindow)
|
||||||
&& this.app.state == Shell.AppState.RUNNING) {
|
this.animateLaunch();
|
||||||
|
|
||||||
|
if (openNewWindow)
|
||||||
this.app.open_new_window(-1);
|
this.app.open_new_window(-1);
|
||||||
} else {
|
else
|
||||||
this.app.activate();
|
this.app.activate();
|
||||||
}
|
|
||||||
|
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
animateLaunch: function() {
|
||||||
|
this.icon.animateZoomOut();
|
||||||
|
},
|
||||||
|
|
||||||
shellWorkspaceLaunch : function(params) {
|
shellWorkspaceLaunch : function(params) {
|
||||||
params = Params.parse(params, { workspace: -1,
|
params = Params.parse(params, { workspace: -1,
|
||||||
timestamp: 0 });
|
timestamp: 0 });
|
||||||
@ -1568,12 +1784,17 @@ const AppIconMenu = new Lang.Class({
|
|||||||
if (!this._source.app.is_window_backed()) {
|
if (!this._source.app.is_window_backed()) {
|
||||||
this._appendSeparator();
|
this._appendSeparator();
|
||||||
|
|
||||||
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
if (this._source.app.can_open_new_window()) {
|
||||||
this._newWindowMenuItem.connect('activate', Lang.bind(this, function() {
|
this._newWindowMenuItem = this._appendMenuItem(_("New Window"));
|
||||||
this._source.app.open_new_window(-1);
|
this._newWindowMenuItem.connect('activate', Lang.bind(this, function() {
|
||||||
this.emit('activate-window', null);
|
if (this._source.app.state == Shell.AppState.STOPPED)
|
||||||
}));
|
this._source.animateLaunch();
|
||||||
this._appendSeparator();
|
|
||||||
|
this._source.app.open_new_window(-1);
|
||||||
|
this.emit('activate-window', null);
|
||||||
|
}));
|
||||||
|
this._appendSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
let appInfo = this._source.app.get_app_info();
|
let appInfo = this._source.app.get_app_info();
|
||||||
let actions = appInfo.list_actions();
|
let actions = appInfo.list_actions();
|
||||||
|
@ -6,6 +6,28 @@ const Signals = imports.signals;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
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-contacts.desktop': 'org.gnome.Contacts.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',
|
||||||
|
'totem.desktop': 'org.gnome.Totem.desktop',
|
||||||
|
};
|
||||||
|
|
||||||
const AppFavorites = new Lang.Class({
|
const AppFavorites = new Lang.Class({
|
||||||
Name: 'AppFavorites',
|
Name: 'AppFavorites',
|
||||||
|
|
||||||
@ -24,6 +46,21 @@ const AppFavorites = new Lang.Class({
|
|||||||
|
|
||||||
reload: function() {
|
reload: function() {
|
||||||
let ids = global.settings.get_strv(this.FAVORITE_APPS_KEY);
|
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 appSys = Shell.AppSystem.get_default();
|
||||||
let apps = ids.map(function (id) {
|
let apps = ids.map(function (id) {
|
||||||
return appSys.lookup_app(id);
|
return appSys.lookup_app(id);
|
||||||
|
@ -311,7 +311,8 @@ const Background = new Lang.Class({
|
|||||||
params = Params.parse(params, { monitorIndex: 0,
|
params = Params.parse(params, { monitorIndex: 0,
|
||||||
layoutManager: Main.layoutManager,
|
layoutManager: Main.layoutManager,
|
||||||
effects: Meta.BackgroundEffects.NONE,
|
effects: Meta.BackgroundEffects.NONE,
|
||||||
settings: null });
|
settings: null,
|
||||||
|
overrideImage: null });
|
||||||
this.actor = new Meta.BackgroundGroup();
|
this.actor = new Meta.BackgroundGroup();
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
|
||||||
@ -319,6 +320,7 @@ const Background = new Lang.Class({
|
|||||||
Lang.bind(this, this._destroy));
|
Lang.bind(this, this._destroy));
|
||||||
|
|
||||||
this._settings = params.settings;
|
this._settings = params.settings;
|
||||||
|
this._overrideImage = params.overrideImage;
|
||||||
this._monitorIndex = params.monitorIndex;
|
this._monitorIndex = params.monitorIndex;
|
||||||
this._layoutManager = params.layoutManager;
|
this._layoutManager = params.layoutManager;
|
||||||
this._effects = params.effects;
|
this._effects = params.effects;
|
||||||
@ -448,7 +450,7 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
let image = this._images[index];
|
let image = this._images[index];
|
||||||
if (image.content)
|
if (image.content)
|
||||||
this._cache.removeImageContent(content);
|
this._cache.removeImageContent(image.content);
|
||||||
image.content = content;
|
image.content = content;
|
||||||
this._watchCacheFile(filename);
|
this._watchCacheFile(filename);
|
||||||
},
|
},
|
||||||
@ -582,18 +584,23 @@ const Background = new Lang.Class({
|
|||||||
|
|
||||||
this._loadPattern();
|
this._loadPattern();
|
||||||
|
|
||||||
this._style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
|
|
||||||
if (this._style == GDesktopEnums.BackgroundStyle.NONE) {
|
|
||||||
this._setLoaded();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let uri = this._settings.get_string(PICTURE_URI_KEY);
|
|
||||||
let filename;
|
let filename;
|
||||||
if (GLib.uri_parse_scheme(uri) != null)
|
if (this._overrideImage != null) {
|
||||||
filename = Gio.File.new_for_uri(uri).get_path();
|
filename = this._overrideImage;
|
||||||
else
|
this._style = GDesktopEnums.BackgroundStyle.ZOOM; // Hardcode
|
||||||
filename = uri;
|
} else {
|
||||||
|
this._style = this._settings.get_enum(BACKGROUND_STYLE_KEY);
|
||||||
|
if (this._style == GDesktopEnums.BackgroundStyle.NONE) {
|
||||||
|
this._setLoaded();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let uri = this._settings.get_string(PICTURE_URI_KEY);
|
||||||
|
if (GLib.uri_parse_scheme(uri) != null)
|
||||||
|
filename = Gio.File.new_for_uri(uri).get_path();
|
||||||
|
else
|
||||||
|
filename = uri;
|
||||||
|
}
|
||||||
|
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
this._setLoaded();
|
this._setLoaded();
|
||||||
@ -659,7 +666,10 @@ const SystemBackground = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._cache.removeImageContent(this.actor.content);
|
let content = this.actor.content;
|
||||||
|
|
||||||
|
if (content)
|
||||||
|
this._cache.removeImageContent(content);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(SystemBackground.prototype);
|
Signals.addSignalMethods(SystemBackground.prototype);
|
||||||
@ -725,7 +735,9 @@ const BackgroundManager = new Lang.Class({
|
|||||||
controlPosition: true,
|
controlPosition: true,
|
||||||
settingsSchema: BACKGROUND_SCHEMA });
|
settingsSchema: BACKGROUND_SCHEMA });
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: params.settingsSchema });
|
// Allow override the background image setting for performance testing
|
||||||
|
this._overrideImage = GLib.getenv('SHELL_BACKGROUND_IMAGE');
|
||||||
|
this._settings = new Gio.Settings({ schema_id: params.settingsSchema });
|
||||||
this._container = params.container;
|
this._container = params.container;
|
||||||
this._layoutManager = params.layoutManager;
|
this._layoutManager = params.layoutManager;
|
||||||
this._effects = params.effects;
|
this._effects = params.effects;
|
||||||
@ -786,7 +798,8 @@ const BackgroundManager = new Lang.Class({
|
|||||||
let background = new Background({ monitorIndex: this._monitorIndex,
|
let background = new Background({ monitorIndex: this._monitorIndex,
|
||||||
layoutManager: this._layoutManager,
|
layoutManager: this._layoutManager,
|
||||||
effects: this._effects,
|
effects: this._effects,
|
||||||
settings: this._settings });
|
settings: this._settings,
|
||||||
|
overrideImage: this._overrideImage });
|
||||||
this._container.add_child(background.actor);
|
this._container.add_child(background.actor);
|
||||||
|
|
||||||
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
let monitor = this._layoutManager.monitors[this._monitorIndex];
|
||||||
|
@ -33,8 +33,7 @@ function addBackgroundMenu(actor, layoutManager) {
|
|||||||
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
actor._backgroundManager = new PopupMenu.PopupMenuManager({ actor: actor });
|
||||||
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
actor._backgroundManager.addMenu(actor._backgroundMenu);
|
||||||
|
|
||||||
function openMenu() {
|
function openMenu(x, y) {
|
||||||
let [x, y] = global.get_pointer();
|
|
||||||
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
Main.layoutManager.setDummyCursorGeometry(x, y, 0, 0);
|
||||||
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
|
actor._backgroundMenu.open(BoxPointer.PopupAnimation.NONE);
|
||||||
}
|
}
|
||||||
@ -42,22 +41,32 @@ function addBackgroundMenu(actor, layoutManager) {
|
|||||||
let clickAction = new Clutter.ClickAction();
|
let clickAction = new Clutter.ClickAction();
|
||||||
clickAction.connect('long-press', function(action, actor, state) {
|
clickAction.connect('long-press', function(action, actor, state) {
|
||||||
if (state == Clutter.LongPressState.QUERY)
|
if (state == Clutter.LongPressState.QUERY)
|
||||||
return action.get_button() == 1 && !actor._backgroundMenu.isOpen;
|
return ((action.get_button() == 0 ||
|
||||||
|
action.get_button() == 1) &&
|
||||||
|
!actor._backgroundMenu.isOpen);
|
||||||
if (state == Clutter.LongPressState.ACTIVATE) {
|
if (state == Clutter.LongPressState.ACTIVATE) {
|
||||||
openMenu();
|
let [x, y] = action.get_coords();
|
||||||
|
openMenu(x, y);
|
||||||
actor._backgroundManager.ignoreRelease();
|
actor._backgroundManager.ignoreRelease();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
clickAction.connect('clicked', function(action) {
|
clickAction.connect('clicked', function(action) {
|
||||||
if (action.get_button() == 3)
|
if (action.get_button() == 3) {
|
||||||
openMenu();
|
let [x, y] = action.get_coords();
|
||||||
|
openMenu(x, y);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
actor.add_action(clickAction);
|
actor.add_action(clickAction);
|
||||||
|
|
||||||
|
let grabOpBeginId = global.display.connect('grab-op-begin', function () {
|
||||||
|
clickAction.release();
|
||||||
|
});
|
||||||
|
|
||||||
actor.connect('destroy', function() {
|
actor.connect('destroy', function() {
|
||||||
actor._backgroundMenu.destroy();
|
actor._backgroundMenu.destroy();
|
||||||
actor._backgroundMenu = null;
|
actor._backgroundMenu = null;
|
||||||
actor._backgroundManager = null;
|
actor._backgroundManager = null;
|
||||||
|
global.display.disconnect(grabOpBeginId);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -383,7 +383,7 @@ const Calendar = new Lang.Class({
|
|||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._weekStart = Shell.util_get_week_start();
|
this._weekStart = Shell.util_get_week_start();
|
||||||
this._settings = new Gio.Settings({ schema: '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._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
|
||||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||||
@ -409,7 +409,7 @@ const Calendar = new Lang.Class({
|
|||||||
this._shouldDateGrabFocus = false;
|
this._shouldDateGrabFocus = false;
|
||||||
|
|
||||||
this.actor = new St.Widget({ style_class: 'calendar',
|
this.actor = new St.Widget({ style_class: 'calendar',
|
||||||
layout_manager: new Clutter.TableLayout(),
|
layout_manager: new Clutter.GridLayout(),
|
||||||
reactive: true });
|
reactive: true });
|
||||||
|
|
||||||
this.actor.connect('scroll-event',
|
this.actor.connect('scroll-event',
|
||||||
@ -447,8 +447,7 @@ const Calendar = new Lang.Class({
|
|||||||
|
|
||||||
// Top line of the calendar '<| September 2009 |>'
|
// Top line of the calendar '<| September 2009 |>'
|
||||||
this._topBox = new St.BoxLayout();
|
this._topBox = new St.BoxLayout();
|
||||||
layout.pack(this._topBox, 0, 0);
|
layout.attach(this._topBox, 0, 0, offsetCols + 7, 1);
|
||||||
layout.set_span(this._topBox, offsetCols + 7, 1);
|
|
||||||
|
|
||||||
this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
|
this._backButton = new St.Button({ style_class: 'calendar-change-month-back',
|
||||||
accessible_name: _("Previous month"),
|
accessible_name: _("Previous month"),
|
||||||
@ -480,8 +479,12 @@ const Calendar = new Lang.Class({
|
|||||||
let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay());
|
let customDayAbbrev = _getCalendarDayAbbreviation(iter.getDay());
|
||||||
let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading',
|
let label = new St.Label({ style_class: 'calendar-day-base calendar-day-heading',
|
||||||
text: customDayAbbrev });
|
text: customDayAbbrev });
|
||||||
let col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
|
let col;
|
||||||
layout.pack(label, col, 1);
|
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.attach(label, col, 1, 1, 1);
|
||||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -648,15 +651,19 @@ const Calendar = new Lang.Class({
|
|||||||
button.style_class = styleClass;
|
button.style_class = styleClass;
|
||||||
|
|
||||||
let offsetCols = this._useWeekdate ? 1 : 0;
|
let offsetCols = this._useWeekdate ? 1 : 0;
|
||||||
let col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
|
let col;
|
||||||
layout.pack(button, col, row);
|
if (rtl)
|
||||||
|
col = 6 - (7 + iter.getDay() - this._weekStart) % 7;
|
||||||
|
else
|
||||||
|
col = offsetCols + (7 + iter.getDay() - this._weekStart) % 7;
|
||||||
|
layout.attach(button, col, row, 1, 1);
|
||||||
|
|
||||||
this._buttons.push(button);
|
this._buttons.push(button);
|
||||||
|
|
||||||
if (this._useWeekdate && iter.getDay() == 4) {
|
if (this._useWeekdate && iter.getDay() == 4) {
|
||||||
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
|
let label = new St.Label({ text: _getCalendarWeekForDate(iter).toString(),
|
||||||
style_class: 'calendar-day-base calendar-week-number'});
|
style_class: 'calendar-day-base calendar-week-number'});
|
||||||
layout.pack(label, 0, row);
|
layout.attach(label, rtl ? 7 : 0, row, 1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
iter.setTime(iter.getTime() + MSECS_IN_DAY);
|
||||||
@ -699,12 +706,12 @@ const EventsList = new Lang.Class({
|
|||||||
Name: 'EventsList',
|
Name: 'EventsList',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
let layout = new Clutter.TableLayout();
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
this.actor = new St.Widget({ style_class: 'events-table',
|
this.actor = new St.Widget({ style_class: 'events-table',
|
||||||
layout_manager: layout });
|
layout_manager: layout });
|
||||||
layout.hookup_style(this.actor);
|
layout.hookup_style(this.actor);
|
||||||
this._date = new Date();
|
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._desktopSettings.connect('changed', Lang.bind(this, this._update));
|
||||||
this._weekStart = Shell.util_get_week_start();
|
this._weekStart = Shell.util_get_week_start();
|
||||||
},
|
},
|
||||||
@ -722,34 +729,34 @@ const EventsList = new Lang.Class({
|
|||||||
dayString = '';
|
dayString = '';
|
||||||
|
|
||||||
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
|
let dayLabel = new St.Label({ style_class: 'events-day-dayname',
|
||||||
text: dayString });
|
text: dayString,
|
||||||
|
x_align: Clutter.ActorAlign.END,
|
||||||
|
y_align: Clutter.ActorAlign.START });
|
||||||
dayLabel.clutter_text.line_wrap = false;
|
dayLabel.clutter_text.line_wrap = false;
|
||||||
dayLabel.clutter_text.ellipsize = false;
|
dayLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
|
let rtl = this.actor.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
|
|
||||||
let layout = this.actor.layout_manager;
|
let layout = this.actor.layout_manager;
|
||||||
layout.pack(dayLabel, 0, index);
|
layout.attach(dayLabel, rtl ? 2 : 0, index, 1, 1);
|
||||||
layout.child_set(dayLabel, { x_expand: false,
|
|
||||||
x_align: Clutter.TableAlignment.END,
|
|
||||||
y_align: Clutter.TableAlignment.START });
|
|
||||||
|
|
||||||
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
let clockFormat = this._desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
||||||
let timeString = _formatEventTime(event, clockFormat);
|
let timeString = _formatEventTime(event, clockFormat);
|
||||||
let timeLabel = new St.Label({ style_class: 'events-day-time',
|
let timeLabel = new St.Label({ style_class: 'events-day-time',
|
||||||
text: timeString });
|
text: timeString,
|
||||||
|
y_align: Clutter.ActorAlign.START });
|
||||||
timeLabel.clutter_text.line_wrap = false;
|
timeLabel.clutter_text.line_wrap = false;
|
||||||
timeLabel.clutter_text.ellipsize = false;
|
timeLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
layout.pack(timeLabel, 1, index);
|
layout.attach(timeLabel, 1, index, 1, 1);
|
||||||
layout.child_set(timeLabel, { x_expand: false,
|
|
||||||
y_align: Clutter.TableAlignment.START });
|
|
||||||
|
|
||||||
let titleLabel = new St.Label({ style_class: 'events-day-task',
|
let titleLabel = new St.Label({ style_class: 'events-day-task',
|
||||||
text: event.summary });
|
text: event.summary,
|
||||||
|
x_expand: true });
|
||||||
titleLabel.clutter_text.line_wrap = true;
|
titleLabel.clutter_text.line_wrap = true;
|
||||||
titleLabel.clutter_text.ellipsize = false;
|
titleLabel.clutter_text.ellipsize = false;
|
||||||
|
|
||||||
layout.pack(titleLabel, 2, index);
|
layout.attach(titleLabel, rtl ? 0 : 2, index, 1, 1);
|
||||||
layout.child_set(titleLabel, { x_expand: true });
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
|
_addPeriod: function(header, index, begin, end, includeDayName, showNothingScheduled) {
|
||||||
@ -760,8 +767,7 @@ const EventsList = new Lang.Class({
|
|||||||
|
|
||||||
let label = new St.Label({ style_class: 'events-day-header', text: header });
|
let label = new St.Label({ style_class: 'events-day-header', text: header });
|
||||||
let layout = this.actor.layout_manager;
|
let layout = this.actor.layout_manager;
|
||||||
layout.pack(label, 0, index);
|
layout.attach(label, 0, index, 3, 1);
|
||||||
layout.child_set(label, { column_span: 3, x_expand: false });
|
|
||||||
index++;
|
index++;
|
||||||
|
|
||||||
for (let n = 0; n < events.length; n++) {
|
for (let n = 0; n < events.length; n++) {
|
||||||
|
@ -23,7 +23,7 @@ const AutomountManager = new Lang.Class({
|
|||||||
Name: 'AutomountManager',
|
Name: 'AutomountManager',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
||||||
this._volumeQueue = [];
|
this._volumeQueue = [];
|
||||||
this._session = new GnomeSession.SessionManager();
|
this._session = new GnomeSession.SessionManager();
|
||||||
this._session.connectSignal('InhibitorAdded',
|
this._session.connectSignal('InhibitorAdded',
|
||||||
|
@ -96,7 +96,7 @@ const ContentTypeDiscoverer = new Lang.Class({
|
|||||||
|
|
||||||
_init: function(callback) {
|
_init: function(callback) {
|
||||||
this._callback = callback;
|
this._callback = callback;
|
||||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
||||||
},
|
},
|
||||||
|
|
||||||
guessContentTypes: function(mount) {
|
guessContentTypes: function(mount) {
|
||||||
@ -441,7 +441,7 @@ const AutorunTransientDispatcher = new Lang.Class({
|
|||||||
_init: function(manager) {
|
_init: function(manager) {
|
||||||
this._manager = manager;
|
this._manager = manager;
|
||||||
this._sources = [];
|
this._sources = [];
|
||||||
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: SETTINGS_SCHEMA });
|
||||||
},
|
},
|
||||||
|
|
||||||
_getAutorunSettingForType: function(contentType) {
|
_getAutorunSettingForType: function(contentType) {
|
||||||
|
@ -80,44 +80,46 @@ const KeyringDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_buildControlTable: function() {
|
_buildControlTable: function() {
|
||||||
let layout = new Clutter.TableLayout();
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
|
let table = new St.Widget({ style_class: 'keyring-dialog-control-table',
|
||||||
layout_manager: layout });
|
layout_manager: layout });
|
||||||
layout.hookup_style(table);
|
layout.hookup_style(table);
|
||||||
let row = 0;
|
let row = 0;
|
||||||
|
|
||||||
if (this.prompt.password_visible) {
|
if (this.prompt.password_visible) {
|
||||||
let label = new St.Label({ style_class: 'prompt-dialog-password-label' });
|
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||||
|
x_align: Clutter.ActorAlign.START,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
label.set_text(_("Password:"));
|
label.set_text(_("Password:"));
|
||||||
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
layout.pack(label, 0, row);
|
layout.attach(label, 0, row, 1, 1);
|
||||||
layout.child_set(label, { x_expand: false, y_fill: false,
|
|
||||||
x_align: Clutter.TableAlignment.START });
|
|
||||||
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._passwordEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||||
text: '',
|
text: '',
|
||||||
can_focus: true });
|
can_focus: true,
|
||||||
|
x_expand: true });
|
||||||
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
this._passwordEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||||
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._passwordEntry, { isPassword: true });
|
||||||
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
|
this._passwordEntry.clutter_text.connect('activate', Lang.bind(this, this._onPasswordActivate));
|
||||||
layout.pack(this._passwordEntry, 1, row);
|
layout.attach(this._passwordEntry, 1, row, 1, 1);
|
||||||
row++;
|
row++;
|
||||||
} else {
|
} else {
|
||||||
this._passwordEntry = null;
|
this._passwordEntry = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.prompt.confirm_visible) {
|
if (this.prompt.confirm_visible) {
|
||||||
var label = new St.Label(({ style_class: 'prompt-dialog-password-label' }));
|
var label = new St.Label(({ style_class: 'prompt-dialog-password-label',
|
||||||
|
x_align: Clutter.ActorAlign.START,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER }));
|
||||||
label.set_text(_("Type again:"));
|
label.set_text(_("Type again:"));
|
||||||
layout.pack(label, 0, row);
|
layout.attach(label, 0, row, 1, 1);
|
||||||
layout.child_set(label, { x_expand: false, y_fill: false,
|
|
||||||
x_align: Clutter.TableAlignment.START });
|
|
||||||
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
this._confirmEntry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||||
text: '',
|
text: '',
|
||||||
can_focus: true });
|
can_focus: true,
|
||||||
|
x_expand: true });
|
||||||
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
this._confirmEntry.clutter_text.set_password_char('\u25cf'); // ● U+25CF BLACK CIRCLE
|
||||||
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._confirmEntry, { isPassword: true });
|
||||||
this._confirmEntry.clutter_text.connect('activate', Lang.bind(this, this._onConfirmActivate));
|
this._confirmEntry.clutter_text.connect('activate', Lang.bind(this, this._onConfirmActivate));
|
||||||
layout.pack(this._confirmEntry, 1, row);
|
layout.attach(this._confirmEntry, 1, row, 1, 1);
|
||||||
row++;
|
row++;
|
||||||
} else {
|
} else {
|
||||||
this._confirmEntry = null;
|
this._confirmEntry = null;
|
||||||
@ -130,15 +132,15 @@ const KeyringDialog = new Lang.Class({
|
|||||||
let choice = new CheckBox.CheckBox();
|
let choice = new CheckBox.CheckBox();
|
||||||
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('choice-label', choice.getLabelActor(), 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
|
this.prompt.bind_property('choice-chosen', choice.actor, 'checked', GObject.BindingFlags.SYNC_CREATE | GObject.BindingFlags.BIDIRECTIONAL);
|
||||||
layout.pack(choice.actor, 1, row);
|
layout.attach(choice.actor, 1, row, 1, 1);
|
||||||
row++;
|
row++;
|
||||||
}
|
}
|
||||||
|
|
||||||
let warning = new St.Label({ style_class: 'prompt-dialog-error-label' });
|
let warning = new St.Label({ style_class: 'prompt-dialog-error-label',
|
||||||
|
x_align: Clutter.ActorAlign.START });
|
||||||
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
warning.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
warning.clutter_text.line_wrap = true;
|
warning.clutter_text.line_wrap = true;
|
||||||
layout.pack(warning, 1, row);
|
layout.attach(warning, 1, row, 1, 1);
|
||||||
layout.child_set(warning, { x_fill: false, x_align: Clutter.TableAlignment.START });
|
|
||||||
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('warning-visible', warning, 'visible', GObject.BindingFlags.SYNC_CREATE);
|
||||||
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);
|
this.prompt.bind_property('warning', warning, 'text', GObject.BindingFlags.SYNC_CREATE);
|
||||||
|
|
||||||
|
@ -72,24 +72,28 @@ const NetworkSecretDialog = new Lang.Class({
|
|||||||
expand: true });
|
expand: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
let layout = new Clutter.TableLayout();
|
let layout = new Clutter.GridLayout({ orientation: Clutter.Orientation.VERTICAL });
|
||||||
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
let secretTable = new St.Widget({ style_class: 'network-dialog-secret-table',
|
||||||
layout_manager: layout });
|
layout_manager: layout });
|
||||||
layout.hookup_style(secretTable);
|
layout.hookup_style(secretTable);
|
||||||
|
|
||||||
|
let rtl = secretTable.get_text_direction() == Clutter.TextDirection.RTL;
|
||||||
let initialFocusSet = false;
|
let initialFocusSet = false;
|
||||||
let pos = 0;
|
let pos = 0;
|
||||||
for (let i = 0; i < this._content.secrets.length; i++) {
|
for (let i = 0; i < this._content.secrets.length; i++) {
|
||||||
let secret = this._content.secrets[i];
|
let secret = this._content.secrets[i];
|
||||||
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
|
let label = new St.Label({ style_class: 'prompt-dialog-password-label',
|
||||||
text: secret.label });
|
text: secret.label,
|
||||||
|
x_align: Clutter.ActorAlign.START,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
label.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
|
||||||
let reactive = secret.key != null;
|
let reactive = secret.key != null;
|
||||||
|
|
||||||
secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
secret.entry = new St.Entry({ style_class: 'prompt-dialog-password-entry',
|
||||||
text: secret.value, can_focus: reactive,
|
text: secret.value, can_focus: reactive,
|
||||||
reactive: reactive });
|
reactive: reactive,
|
||||||
|
x_expand: true });
|
||||||
ShellEntry.addContextMenu(secret.entry,
|
ShellEntry.addContextMenu(secret.entry,
|
||||||
{ isPassword: secret.password });
|
{ isPassword: secret.password });
|
||||||
|
|
||||||
@ -116,10 +120,13 @@ const NetworkSecretDialog = new Lang.Class({
|
|||||||
} else
|
} else
|
||||||
secret.valid = true;
|
secret.valid = true;
|
||||||
|
|
||||||
layout.pack(label, 0, pos);
|
if (rtl) {
|
||||||
layout.child_set(label, { x_expand: false, y_fill: false,
|
layout.attach(secret.entry, 0, pos, 1, 1);
|
||||||
x_align: Clutter.TableAlignment.START });
|
layout.attach(label, 1, pos, 1, 1);
|
||||||
layout.pack(secret.entry, 1, pos);
|
} else {
|
||||||
|
layout.attach(label, 0, pos, 1, 1);
|
||||||
|
layout.attach(secret.entry, 1, pos, 1, 1);
|
||||||
|
}
|
||||||
pos++;
|
pos++;
|
||||||
|
|
||||||
if (secret.password)
|
if (secret.password)
|
||||||
|
@ -863,13 +863,6 @@ const ChatNotification = new Lang.Class({
|
|||||||
for (let i = 0; i < expired.length; i++)
|
for (let i = 0; i < expired.length; i++)
|
||||||
expired[i].actor.destroy();
|
expired[i].actor.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
let groups = this._contentArea.get_children();
|
|
||||||
for (let i = 0; i < groups.length; i++) {
|
|
||||||
let group = groups[i];
|
|
||||||
if (group.get_n_children() == 0)
|
|
||||||
group.destroy();
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -911,16 +904,19 @@ const ChatNotification = new Lang.Class({
|
|||||||
this._lastGroup = group;
|
this._lastGroup = group;
|
||||||
let emptyLine = new St.Label({ style_class: 'chat-empty-line' });
|
let emptyLine = new St.Label({ style_class: 'chat-empty-line' });
|
||||||
this.addActor(emptyLine);
|
this.addActor(emptyLine);
|
||||||
|
this._history.unshift({ actor: emptyLine, time: timestamp,
|
||||||
|
realMessage: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
this._lastMessageBox = new St.BoxLayout({ vertical: false });
|
let lineBox = new St.BoxLayout({ vertical: false });
|
||||||
this._lastMessageBox.add(body, props.childProps);
|
lineBox.add(body, props.childProps);
|
||||||
this.addActor(this._lastMessageBox);
|
this.addActor(lineBox);
|
||||||
|
this._lastMessageBox = lineBox;
|
||||||
|
|
||||||
this.updated();
|
this.updated();
|
||||||
|
|
||||||
let timestamp = props.timestamp;
|
let timestamp = props.timestamp;
|
||||||
this._history.unshift({ actor: body, time: timestamp,
|
this._history.unshift({ actor: lineBox, time: timestamp,
|
||||||
realMessage: group != 'meta' });
|
realMessage: group != 'meta' });
|
||||||
|
|
||||||
if (!props.noTimestamp) {
|
if (!props.noTimestamp) {
|
||||||
@ -946,7 +942,7 @@ const ChatNotification = new Lang.Class({
|
|||||||
|
|
||||||
let format;
|
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 clockFormat = desktopSettings.get_string(CLOCK_FORMAT_KEY);
|
||||||
let hasAmPm = date.toLocaleFormat('%p') != '';
|
let hasAmPm = date.toLocaleFormat('%p') != '';
|
||||||
|
|
||||||
|
@ -156,11 +156,11 @@ const CtrlAltTabPopup = new Lang.Class({
|
|||||||
this._select(this._selectedIndex);
|
this._select(this._selectedIndex);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == Meta.KeyBindingAction.SWITCH_PANELS)
|
if (action == Meta.KeyBindingAction.SWITCH_PANELS)
|
||||||
this._select(backwards ? this._previous() : this._next());
|
this._select(this._next());
|
||||||
else if (action == Meta.KeyBindingAction.SWITCH_PANELS_BACKWARD)
|
else if (action == Meta.KeyBindingAction.SWITCH_PANELS_BACKWARD)
|
||||||
this._select(backwards ? this._next() : this._previous());
|
this._select(this._previous());
|
||||||
else if (keysym == Clutter.Left)
|
else if (keysym == Clutter.Left)
|
||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
else if (keysym == Clutter.Right)
|
else if (keysym == Clutter.Right)
|
||||||
|
@ -18,8 +18,7 @@ const PanelMenu = imports.ui.panelMenu;
|
|||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Calendar = imports.ui.calendar;
|
const Calendar = imports.ui.calendar;
|
||||||
|
|
||||||
function _onVertSepRepaint (area)
|
function _onVertSepRepaint(area) {
|
||||||
{
|
|
||||||
let cr = area.get_context();
|
let cr = area.get_context();
|
||||||
let themeNode = area.get_theme_node();
|
let themeNode = area.get_theme_node();
|
||||||
let [width, height] = area.get_surface_size();
|
let [width, height] = area.get_surface_size();
|
||||||
@ -33,7 +32,7 @@ function _onVertSepRepaint (area)
|
|||||||
cr.setLineWidth(stippleWidth);
|
cr.setLineWidth(stippleWidth);
|
||||||
cr.stroke();
|
cr.stroke();
|
||||||
cr.$dispose();
|
cr.$dispose();
|
||||||
};
|
}
|
||||||
|
|
||||||
const DateMenuButton = new Lang.Class({
|
const DateMenuButton = new Lang.Class({
|
||||||
Name: 'DateMenuButton',
|
Name: 'DateMenuButton',
|
||||||
@ -212,10 +211,13 @@ const DateMenuButton = new Lang.Class({
|
|||||||
return this._calendarApp;
|
return this._calendarApp;
|
||||||
|
|
||||||
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
|
let apps = Gio.AppInfo.get_recommended_for_type('text/calendar');
|
||||||
if (apps && (apps.length > 0))
|
if (apps && (apps.length > 0)) {
|
||||||
this._calendarApp = apps[0];
|
let app = Gio.AppInfo.get_default_for_type('text/calendar', false);
|
||||||
else
|
let defaultInRecommended = apps.some(function(a) { return a.equal(app); });
|
||||||
|
this._calendarApp = defaultInRecommended ? app : apps[0];
|
||||||
|
} else {
|
||||||
this._calendarApp = null;
|
this._calendarApp = null;
|
||||||
|
}
|
||||||
return this._calendarApp;
|
return this._calendarApp;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
78
js/ui/edgeDragAction.js
Normal file
78
js/ui/edgeDragAction.js
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
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);
|
@ -32,11 +32,9 @@ const FocusCaretTracker = new Lang.Class({
|
|||||||
Name: 'FocusCaretTracker',
|
Name: 'FocusCaretTracker',
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
Atspi.init();
|
|
||||||
Atspi.set_timeout(250, 250);
|
|
||||||
|
|
||||||
this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
|
this._atspiListener = Atspi.EventListener.new(Lang.bind(this, this._onChanged));
|
||||||
|
|
||||||
|
this._atspiInited = false;
|
||||||
this._focusListenerRegistered = false;
|
this._focusListenerRegistered = false;
|
||||||
this._caretListenerRegistered = false;
|
this._caretListenerRegistered = false;
|
||||||
},
|
},
|
||||||
@ -48,12 +46,20 @@ const FocusCaretTracker = new Lang.Class({
|
|||||||
this.emit('caret-moved', event);
|
this.emit('caret-moved', event);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_initAtspi: function() {
|
||||||
|
if (!this._atspiInited) {
|
||||||
|
Atspi.init();
|
||||||
|
Atspi.set_timeout(250, 250);
|
||||||
|
this._atspiInited = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
registerFocusListener: function() {
|
registerFocusListener: function() {
|
||||||
if (this._focusListenerRegistered)
|
if (this._focusListenerRegistered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Ignore the return value, we get an exception if they fail
|
this._initAtspi();
|
||||||
// And they should never fail
|
|
||||||
this._atspiListener.register(STATECHANGED + ':focused');
|
this._atspiListener.register(STATECHANGED + ':focused');
|
||||||
this._atspiListener.register(STATECHANGED + ':selected');
|
this._atspiListener.register(STATECHANGED + ':selected');
|
||||||
this._focusListenerRegistered = true;
|
this._focusListenerRegistered = true;
|
||||||
@ -63,6 +69,8 @@ const FocusCaretTracker = new Lang.Class({
|
|||||||
if (this._caretListenerRegistered)
|
if (this._caretListenerRegistered)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
this._initAtspi();
|
||||||
|
|
||||||
this._atspiListener.register(CARETMOVED);
|
this._atspiListener.register(CARETMOVED);
|
||||||
this._caretListenerRegistered = true;
|
this._caretListenerRegistered = true;
|
||||||
},
|
},
|
||||||
|
@ -56,7 +56,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
this._grabStack = [];
|
this._grabStack = [];
|
||||||
|
|
||||||
this._actors = [];
|
this._actors = [];
|
||||||
this._ignoreRelease = false;
|
this._ignoreUntilRelease = false;
|
||||||
|
|
||||||
this._modalCount = 0;
|
this._modalCount = 0;
|
||||||
},
|
},
|
||||||
@ -215,7 +215,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
|
|
||||||
_popGrabHelper(this);
|
_popGrabHelper(this);
|
||||||
|
|
||||||
this._ignoreRelease = false;
|
this._ignoreUntilRelease = false;
|
||||||
|
|
||||||
Main.popModal(this._owner);
|
Main.popModal(this._owner);
|
||||||
global.sync_pointer();
|
global.sync_pointer();
|
||||||
@ -228,7 +228,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
// like the ComboBoxMenu that go away on press, but need to eat
|
// like the ComboBoxMenu that go away on press, but need to eat
|
||||||
// the next release event.
|
// the next release event.
|
||||||
ignoreRelease: function() {
|
ignoreRelease: function() {
|
||||||
this._ignoreRelease = true;
|
this._ignoreUntilRelease = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
// ungrab:
|
// ungrab:
|
||||||
@ -283,12 +283,22 @@ const GrabHelper = new Lang.Class({
|
|||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let motion = type == Clutter.EventType.MOTION;
|
||||||
let press = type == Clutter.EventType.BUTTON_PRESS;
|
let press = type == Clutter.EventType.BUTTON_PRESS;
|
||||||
let release = type == Clutter.EventType.BUTTON_RELEASE;
|
let release = type == Clutter.EventType.BUTTON_RELEASE;
|
||||||
let button = press || release;
|
let button = press || release;
|
||||||
|
|
||||||
if (release && this._ignoreRelease) {
|
let touchUpdate = type == Clutter.EventType.TOUCH_UPDATE;
|
||||||
this._ignoreRelease = false;
|
let touchBegin = type == Clutter.EventType.TOUCH_BEGIN;
|
||||||
|
let touchEnd = type == Clutter.EventType.TOUCH_END;
|
||||||
|
let touch = touchUpdate || touchBegin || touchEnd;
|
||||||
|
|
||||||
|
if (touch && !global.display.is_pointer_emulating_sequence (event.get_event_sequence()))
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
|
if (this._ignoreUntilRelease && (motion || release || touch)) {
|
||||||
|
if (release || touchEnd)
|
||||||
|
this._ignoreUntilRelease = false;
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,11 +308,12 @@ const GrabHelper = new Lang.Class({
|
|||||||
if (Main.keyboard.shouldTakeEvent(event))
|
if (Main.keyboard.shouldTakeEvent(event))
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
if (button) {
|
if (button || touchBegin) {
|
||||||
// If we have a press event, ignore the next event,
|
// If we have a press event, ignore the next
|
||||||
// which should be a release event.
|
// motion/release events.
|
||||||
if (press)
|
if (press || touchBegin)
|
||||||
this._ignoreRelease = true;
|
this._ignoreUntilRelease = true;
|
||||||
|
|
||||||
let i = this._actorInGrabStack(event.get_source()) + 1;
|
let i = this._actorInGrabStack(event.get_source()) + 1;
|
||||||
this.ungrab({ actor: this._grabStack[i].actor, isUser: true });
|
this.ungrab({ actor: this._grabStack[i].actor, isUser: true });
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
|
@ -11,6 +11,9 @@ const Main = imports.ui.main;
|
|||||||
|
|
||||||
const MAX_CANDIDATES_PER_PAGE = 16;
|
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({
|
const CandidateArea = new Lang.Class({
|
||||||
Name: 'CandidateArea',
|
Name: 'CandidateArea',
|
||||||
|
|
||||||
@ -89,7 +92,7 @@ const CandidateArea = new Lang.Class({
|
|||||||
if (!visible)
|
if (!visible)
|
||||||
continue;
|
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];
|
box._candidateLabel.text = candidates[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,12 +10,29 @@ const St = imports.gi.St;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const ICON_SIZE = 96;
|
const ICON_SIZE = 96;
|
||||||
const MIN_ICON_SIZE = 16;
|
const MIN_ICON_SIZE = 16;
|
||||||
|
|
||||||
const EXTRA_SPACE_ANIMATION_TIME = 0.25;
|
const EXTRA_SPACE_ANIMATION_TIME = 0.25;
|
||||||
|
|
||||||
|
const ANIMATION_TIME_IN = 0.350;
|
||||||
|
const ANIMATION_TIME_OUT = 1/2 * ANIMATION_TIME_IN;
|
||||||
|
const ANIMATION_MAX_DELAY_FOR_ITEM = 2/3 * ANIMATION_TIME_IN;
|
||||||
|
const ANIMATION_MAX_DELAY_OUT_FOR_ITEM = 2/3 * ANIMATION_TIME_OUT;
|
||||||
|
const ANIMATION_FADE_IN_TIME_FOR_ITEM = 1/4 * ANIMATION_TIME_IN;
|
||||||
|
|
||||||
|
const ANIMATION_BOUNCE_ICON_SCALE = 1.1;
|
||||||
|
|
||||||
|
const AnimationDirection = {
|
||||||
|
IN: 0,
|
||||||
|
OUT: 1
|
||||||
|
};
|
||||||
|
|
||||||
|
const APPICON_ANIMATION_OUT_SCALE = 3;
|
||||||
|
const APPICON_ANIMATION_OUT_TIME = 0.25;
|
||||||
|
|
||||||
const BaseIcon = new Lang.Class({
|
const BaseIcon = new Lang.Class({
|
||||||
Name: 'BaseIcon',
|
Name: 'BaseIcon',
|
||||||
|
|
||||||
@ -173,9 +190,55 @@ const BaseIcon = new Lang.Class({
|
|||||||
|
|
||||||
_onIconThemeChanged: function() {
|
_onIconThemeChanged: function() {
|
||||||
this._createIconTexture(this.iconSize);
|
this._createIconTexture(this.iconSize);
|
||||||
|
},
|
||||||
|
|
||||||
|
animateZoomOut: function() {
|
||||||
|
// Animate only the child instead of the entire actor, so the
|
||||||
|
// styles like hover and running are not applied while
|
||||||
|
// animating.
|
||||||
|
zoomOutActor(this.actor.child);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
function clamp(value, min, max) {
|
||||||
|
return Math.max(Math.min(value, max), min);
|
||||||
|
};
|
||||||
|
|
||||||
|
function zoomOutActor(actor) {
|
||||||
|
let actorClone = new Clutter.Clone({ source: actor,
|
||||||
|
reactive: false });
|
||||||
|
let [width, height] = actor.get_transformed_size();
|
||||||
|
let [x, y] = actor.get_transformed_position();
|
||||||
|
actorClone.set_size(width, height);
|
||||||
|
actorClone.set_position(x, y);
|
||||||
|
actorClone.opacity = 255;
|
||||||
|
actorClone.set_pivot_point(0.5, 0.5);
|
||||||
|
|
||||||
|
Main.uiGroup.add_actor(actorClone);
|
||||||
|
|
||||||
|
// Avoid monitor edges to not zoom outside the current monitor
|
||||||
|
let monitor = Main.layoutManager.findMonitorForActor(actor);
|
||||||
|
let scaledWidth = width * APPICON_ANIMATION_OUT_SCALE;
|
||||||
|
let scaledHeight = height * APPICON_ANIMATION_OUT_SCALE;
|
||||||
|
let scaledX = x - (scaledWidth - width) / 2;
|
||||||
|
let scaledY = y - (scaledHeight - height) / 2;
|
||||||
|
let containedX = clamp(scaledX, monitor.x, monitor.x + monitor.width - scaledWidth);
|
||||||
|
let containedY = clamp(scaledY, monitor.y, monitor.y + monitor.height - scaledHeight);
|
||||||
|
|
||||||
|
Tweener.addTween(actorClone,
|
||||||
|
{ time: APPICON_ANIMATION_OUT_TIME,
|
||||||
|
scale_x: APPICON_ANIMATION_OUT_SCALE,
|
||||||
|
scale_y: APPICON_ANIMATION_OUT_SCALE,
|
||||||
|
translation_x: containedX - scaledX,
|
||||||
|
translation_y: containedY - scaledY,
|
||||||
|
opacity: 0,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: function() {
|
||||||
|
actorClone.destroy();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const IconGrid = new Lang.Class({
|
const IconGrid = new Lang.Class({
|
||||||
Name: 'IconGrid',
|
Name: 'IconGrid',
|
||||||
|
|
||||||
@ -338,15 +401,207 @@ const IconGrid = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_calculateChildBox: function(child, x, y, box) {
|
/**
|
||||||
let [childMinWidth, childMinHeight, childNaturalWidth, childNaturalHeight] =
|
* Intended to be override by subclasses if they need a different
|
||||||
child.get_preferred_size();
|
* set of items to be animated.
|
||||||
|
*/
|
||||||
|
_getChildrenToAnimate: function() {
|
||||||
|
return this._getVisibleChildren();
|
||||||
|
},
|
||||||
|
|
||||||
|
_animationDone: function() {
|
||||||
|
this._animating = false;
|
||||||
|
this.emit('animation-done');
|
||||||
|
},
|
||||||
|
|
||||||
|
animatePulse: function(animationDirection) {
|
||||||
|
if (animationDirection != AnimationDirection.IN)
|
||||||
|
throw new Error("Pulse animation only implements 'in' animation direction");
|
||||||
|
|
||||||
|
if (this._animating)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._animating = true;
|
||||||
|
|
||||||
|
let actors = this._getChildrenToAnimate();
|
||||||
|
if (actors.length == 0) {
|
||||||
|
this._animationDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (let index = 0; index < actors.length; index++) {
|
||||||
|
let actor = actors[index];
|
||||||
|
actor.opacity = 0;
|
||||||
|
actor.reactive = false;
|
||||||
|
|
||||||
|
let delay = index / actors.length * ANIMATION_MAX_DELAY_FOR_ITEM;
|
||||||
|
let [originalX, originalY] = actor.get_transformed_position();
|
||||||
|
let [originalWidth, originalHeight,,] = this._getAllocatedChildSizeAndSpacing(actor);
|
||||||
|
|
||||||
|
let actorClone = new Clutter.Clone({ source: actor });
|
||||||
|
Main.uiGroup.add_actor(actorClone);
|
||||||
|
|
||||||
|
actorClone.set_position(originalX, originalY);
|
||||||
|
actorClone.set_scale(0, 0);
|
||||||
|
actorClone.set_pivot_point(0.5, 0.5);
|
||||||
|
actorClone.set_size(originalWidth, originalHeight);
|
||||||
|
|
||||||
|
let bounceUpTime = ANIMATION_TIME_IN / 4;
|
||||||
|
// Defeat onComplete anonymous function closure
|
||||||
|
let isLastItem = index == actors.length - 1;
|
||||||
|
Tweener.addTween(actorClone,
|
||||||
|
{ time: bounceUpTime,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
delay: delay,
|
||||||
|
scale_x: ANIMATION_BOUNCE_ICON_SCALE,
|
||||||
|
scale_y: ANIMATION_BOUNCE_ICON_SCALE,
|
||||||
|
onComplete: Lang.bind(this, function() {
|
||||||
|
Tweener.addTween(actorClone,
|
||||||
|
{ time: ANIMATION_TIME_IN - bounceUpTime,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
scale_x: 1,
|
||||||
|
scale_y: 1,
|
||||||
|
onComplete: Lang.bind(this, function() {
|
||||||
|
if (isLastItem)
|
||||||
|
this._animationDone();
|
||||||
|
|
||||||
|
actor.opacity = 255;
|
||||||
|
actor.reactive = true;
|
||||||
|
actorClone.destroy();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
animateSpring: function(animationDirection, sourceActor) {
|
||||||
|
if (this._animating)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this._animating = true;
|
||||||
|
|
||||||
|
let actors = this._getChildrenToAnimate();
|
||||||
|
if (actors.length == 0) {
|
||||||
|
this._animationDone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let [sourceX, sourceY] = sourceActor.get_transformed_position();
|
||||||
|
let [sourceWidth, sourceHeight] = sourceActor.get_size();
|
||||||
|
// Get the center
|
||||||
|
let [sourceCenterX, sourceCenterY] = [sourceX + sourceWidth / 2, sourceY + sourceHeight / 2];
|
||||||
|
// Design decision, 1/2 of the source actor size.
|
||||||
|
let [sourceScaledWidth, sourceScaledHeight] = [sourceWidth / 2, sourceHeight / 2];
|
||||||
|
|
||||||
|
actors.forEach(function(actor) {
|
||||||
|
let [actorX, actorY] = actor._transformedPosition = actor.get_transformed_position();
|
||||||
|
let [x, y] = [actorX - sourceX, actorY - sourceY];
|
||||||
|
actor._distance = Math.sqrt(x * x + y * y);
|
||||||
|
});
|
||||||
|
let maxDist = actors.reduce(function(prev, cur) {
|
||||||
|
return Math.max(prev, cur._distance);
|
||||||
|
}, 0);
|
||||||
|
let minDist = actors.reduce(function(prev, cur) {
|
||||||
|
return Math.min(prev, cur._distance);
|
||||||
|
}, Infinity);
|
||||||
|
let normalization = maxDist - minDist;
|
||||||
|
|
||||||
|
for (let index = 0; index < actors.length; index++) {
|
||||||
|
let actor = actors[index];
|
||||||
|
actor.opacity = 0;
|
||||||
|
actor.reactive = false;
|
||||||
|
|
||||||
|
let actorClone = new Clutter.Clone({ source: actor });
|
||||||
|
Main.uiGroup.add_actor(actorClone);
|
||||||
|
|
||||||
|
let [width, height,,] = this._getAllocatedChildSizeAndSpacing(actor);
|
||||||
|
actorClone.set_size(width, height);
|
||||||
|
let scaleX = sourceScaledWidth / width;
|
||||||
|
let scaleY = sourceScaledHeight / height;
|
||||||
|
let [adjustedSourcePositionX, adjustedSourcePositionY] = [sourceCenterX - sourceScaledWidth / 2, sourceCenterY - sourceScaledHeight / 2];
|
||||||
|
|
||||||
|
// Defeat onComplete anonymous function closure
|
||||||
|
let isLastItem = index == actors.length - 1;
|
||||||
|
|
||||||
|
let movementParams, fadeParams;
|
||||||
|
if (animationDirection == AnimationDirection.IN) {
|
||||||
|
actorClone.opacity = 0;
|
||||||
|
actorClone.set_scale(scaleX, scaleY);
|
||||||
|
|
||||||
|
actorClone.set_position(adjustedSourcePositionX, adjustedSourcePositionY);
|
||||||
|
|
||||||
|
let delay = (1 - (actor._distance - minDist) / normalization) * ANIMATION_MAX_DELAY_FOR_ITEM;
|
||||||
|
let [finalX, finalY] = actor._transformedPosition;
|
||||||
|
movementParams = { time: ANIMATION_TIME_IN,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
delay: delay,
|
||||||
|
x: finalX,
|
||||||
|
y: finalY,
|
||||||
|
scale_x: 1,
|
||||||
|
scale_y: 1,
|
||||||
|
onComplete: Lang.bind(this, function() {
|
||||||
|
if (isLastItem)
|
||||||
|
this._animationDone();
|
||||||
|
|
||||||
|
actor.opacity = 255;
|
||||||
|
actor.reactive = true;
|
||||||
|
actorClone.destroy();
|
||||||
|
})};
|
||||||
|
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
delay: delay,
|
||||||
|
opacity: 255 };
|
||||||
|
} else {
|
||||||
|
let [startX, startY] = actor._transformedPosition;
|
||||||
|
actorClone.set_position(startX, startY);
|
||||||
|
|
||||||
|
let delay = (actor._distance - minDist) / normalization * ANIMATION_MAX_DELAY_OUT_FOR_ITEM;
|
||||||
|
movementParams = { time: ANIMATION_TIME_OUT,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
delay: delay,
|
||||||
|
x: adjustedSourcePositionX,
|
||||||
|
y: adjustedSourcePositionY,
|
||||||
|
scale_x: scaleX,
|
||||||
|
scale_y: scaleY,
|
||||||
|
onComplete: Lang.bind(this, function() {
|
||||||
|
if (isLastItem) {
|
||||||
|
this._animationDone();
|
||||||
|
this._restoreItemsOpacity();
|
||||||
|
}
|
||||||
|
actorClone.destroy();
|
||||||
|
})};
|
||||||
|
fadeParams = { time: ANIMATION_FADE_IN_TIME_FOR_ITEM,
|
||||||
|
transition: 'easeInOutQuad',
|
||||||
|
delay: ANIMATION_TIME_OUT + delay - ANIMATION_FADE_IN_TIME_FOR_ITEM,
|
||||||
|
opacity: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Tweener.addTween(actorClone, movementParams);
|
||||||
|
Tweener.addTween(actorClone, fadeParams);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_restoreItemsOpacity: function() {
|
||||||
|
for (let index = 0; index < this._items.length; index++) {
|
||||||
|
this._items[index].actor.opacity = 255;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getAllocatedChildSizeAndSpacing: function(child) {
|
||||||
|
let [,, natWidth, natHeight] = child.get_preferred_size();
|
||||||
|
let width = Math.min(this._getHItemSize(), natWidth);
|
||||||
|
let xSpacing = Math.max(0, width - natWidth) / 2;
|
||||||
|
let height = Math.min(this._getVItemSize(), natHeight);
|
||||||
|
let ySpacing = Math.max(0, height - natHeight) / 2;
|
||||||
|
return [width, height, xSpacing, ySpacing];
|
||||||
|
},
|
||||||
|
|
||||||
|
_calculateChildBox: function(child, x, y, box) {
|
||||||
/* Center the item in its allocation horizontally */
|
/* Center the item in its allocation horizontally */
|
||||||
let width = Math.min(this._getHItemSize(), childNaturalWidth);
|
let [width, height, childXSpacing, childYSpacing] =
|
||||||
let childXSpacing = Math.max(0, width - childNaturalWidth) / 2;
|
this._getAllocatedChildSizeAndSpacing(child);
|
||||||
let height = Math.min(this._getVItemSize(), childNaturalHeight);
|
|
||||||
let childYSpacing = Math.max(0, height - childNaturalHeight) / 2;
|
|
||||||
|
|
||||||
let childBox = new Clutter.ActorBox();
|
let childBox = new Clutter.ActorBox();
|
||||||
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) {
|
||||||
@ -522,21 +777,17 @@ const IconGrid = new Lang.Class({
|
|||||||
this._fixedHItemSize = Math.max(this._hItemSize - neededSpacePerItem, MIN_ICON_SIZE);
|
this._fixedHItemSize = Math.max(this._hItemSize - neededSpacePerItem, MIN_ICON_SIZE);
|
||||||
this._fixedVItemSize = Math.max(this._vItemSize - neededSpacePerItem, MIN_ICON_SIZE);
|
this._fixedVItemSize = Math.max(this._vItemSize - neededSpacePerItem, MIN_ICON_SIZE);
|
||||||
|
|
||||||
if (this._fixedHItemSize < MIN_ICON_SIZE)
|
|
||||||
this._fixedHItemSize = MIN_ICON_SIZE;
|
|
||||||
if (this._fixedVItemSize < MIN_ICON_SIZE)
|
|
||||||
this._fixedVItemSize = MIN_ICON_SIZE;
|
|
||||||
|
|
||||||
this._updateSpacingForSize(availWidth, availHeight);
|
this._updateSpacingForSize(availWidth, availHeight);
|
||||||
}
|
}
|
||||||
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateChildrenScale(scale); }));
|
Lang.bind(this, this._updateIconSizes));
|
||||||
},
|
},
|
||||||
|
|
||||||
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
|
// Note that this is ICON_SIZE as used by BaseIcon, not elsewhere in IconGrid; it's a bit messed up
|
||||||
_updateChildrenScale: function(scale) {
|
_updateIconSizes: function() {
|
||||||
|
let scale = Math.min(this._fixedHItemSize, this._fixedVItemSize) / Math.max(this._hItemSize, this._vItemSize);
|
||||||
|
let newIconSize = Math.floor(ICON_SIZE * scale);
|
||||||
for (let i in this._items) {
|
for (let i in this._items) {
|
||||||
let newIconSize = Math.floor(ICON_SIZE * scale);
|
|
||||||
this._items[i].icon.setIconSize(newIconSize);
|
this._items[i].icon.setIconSize(newIconSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -550,6 +801,7 @@ const PaginatedIconGrid = new Lang.Class({
|
|||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
this.parent(params);
|
this.parent(params);
|
||||||
this._nPages = 0;
|
this._nPages = 0;
|
||||||
|
this.currentPage = 0;
|
||||||
this._rowsPerPage = 0;
|
this._rowsPerPage = 0;
|
||||||
this._spaceBetweenPages = 0;
|
this._spaceBetweenPages = 0;
|
||||||
this._childrenPerPage = 0;
|
this._childrenPerPage = 0;
|
||||||
@ -613,6 +865,15 @@ const PaginatedIconGrid = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Overriden from IconGrid
|
||||||
|
_getChildrenToAnimate: function() {
|
||||||
|
let children = this._getVisibleChildren();
|
||||||
|
let firstIndex = this._childrenPerPage * this.currentPage;
|
||||||
|
let lastIndex = firstIndex + this._childrenPerPage;
|
||||||
|
|
||||||
|
return children.slice(firstIndex, lastIndex);
|
||||||
|
},
|
||||||
|
|
||||||
_computePages: function (availWidthPerPage, availHeightPerPage) {
|
_computePages: function (availWidthPerPage, availHeightPerPage) {
|
||||||
let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage);
|
let [nColumns, usedWidth] = this._computeLayout(availWidthPerPage);
|
||||||
let nRows;
|
let nRows;
|
||||||
|
@ -23,6 +23,12 @@ const KEYBOARD_TYPE = 'keyboard-type';
|
|||||||
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
|
const A11Y_APPLICATIONS_SCHEMA = 'org.gnome.desktop.a11y.applications';
|
||||||
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
|
const SHOW_KEYBOARD = 'screen-keyboard-enabled';
|
||||||
|
|
||||||
|
const CURSOR_BUS_NAME = 'org.gnome.SettingsDaemon.Cursor';
|
||||||
|
const CURSOR_OBJECT_PATH = '/org/gnome/SettingsDaemon/Cursor';
|
||||||
|
|
||||||
|
const CARIBOU_BUS_NAME = 'org.gnome.Caribou.Daemon';
|
||||||
|
const CARIBOU_OBJECT_PATH = '/org/gnome/Caribou/Daemon';
|
||||||
|
|
||||||
const CaribouKeyboardIface = '<node> \
|
const CaribouKeyboardIface = '<node> \
|
||||||
<interface name="org.gnome.Caribou.Keyboard"> \
|
<interface name="org.gnome.Caribou.Keyboard"> \
|
||||||
<method name="Show"> \
|
<method name="Show"> \
|
||||||
@ -47,13 +53,28 @@ const CaribouKeyboardIface = '<node> \
|
|||||||
</interface> \
|
</interface> \
|
||||||
</node>';
|
</node>';
|
||||||
|
|
||||||
|
const CaribouDaemonIface = '<node> \
|
||||||
|
<interface name="org.gnome.Caribou.Daemon"> \
|
||||||
|
<method name="Run" /> \
|
||||||
|
<method name="Quit" /> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const CursorManagerIface = '<node> \
|
||||||
|
<interface name="org.gnome.SettingsDaemon.Cursor"> \
|
||||||
|
<property name="ShowOSK" type="b" access="read" /> \
|
||||||
|
</interface> \
|
||||||
|
</node>';
|
||||||
|
|
||||||
|
const CaribouDaemonProxy = Gio.DBusProxy.makeProxyWrapper(CaribouDaemonIface);
|
||||||
|
const CursorManagerProxy = Gio.DBusProxy.makeProxyWrapper(CursorManagerIface);
|
||||||
|
|
||||||
const Key = new Lang.Class({
|
const Key = new Lang.Class({
|
||||||
Name: 'Key',
|
Name: 'Key',
|
||||||
|
|
||||||
_init : function(key) {
|
_init : function(key) {
|
||||||
this._key = key;
|
this._key = key;
|
||||||
|
this.actor = this._makeKey(key, GLib.markup_escape_text(key.label, -1));
|
||||||
this.actor = this._makeKey();
|
|
||||||
|
|
||||||
this._extended_keys = this._key.get_extended_keys();
|
this._extended_keys = this._key.get_extended_keys();
|
||||||
this._extended_keyboard = null;
|
this._extended_keyboard = null;
|
||||||
@ -76,20 +97,19 @@ const Key = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_makeKey: function () {
|
_makeKey: function (key, label) {
|
||||||
let label = GLib.markup_escape_text(this._key.label, -1);
|
|
||||||
let button = new St.Button ({ label: label,
|
let button = new St.Button ({ label: label,
|
||||||
style_class: 'keyboard-key' });
|
style_class: 'keyboard-key' });
|
||||||
|
|
||||||
button.key_width = this._key.width;
|
button.key_width = this._key.width;
|
||||||
button.connect('button-press-event', Lang.bind(this,
|
button.connect('button-press-event', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
this._key.press();
|
key.press();
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
}));
|
}));
|
||||||
button.connect('button-release-event', Lang.bind(this,
|
button.connect('button-release-event', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
this._key.release();
|
key.release();
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@ -112,18 +132,9 @@ const Key = new Lang.Class({
|
|||||||
for (let i = 0; i < this._extended_keys.length; ++i) {
|
for (let i = 0; i < this._extended_keys.length; ++i) {
|
||||||
let extended_key = this._extended_keys[i];
|
let extended_key = this._extended_keys[i];
|
||||||
let label = this._getUnichar(extended_key);
|
let label = this._getUnichar(extended_key);
|
||||||
let key = new St.Button({ label: label, style_class: 'keyboard-key' });
|
let key = this._makeKey(extended_key, label);
|
||||||
|
|
||||||
key.extended_key = extended_key;
|
key.extended_key = extended_key;
|
||||||
key.connect('button-press-event', Lang.bind(this,
|
|
||||||
function () {
|
|
||||||
extended_key.press();
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}));
|
|
||||||
key.connect('button-release-event', Lang.bind(this,
|
|
||||||
function () {
|
|
||||||
extended_key.release();
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}));
|
|
||||||
this._extended_keyboard.add(key);
|
this._extended_keyboard.add(key);
|
||||||
}
|
}
|
||||||
this._boxPointer.bin.add_actor(this._extended_keyboard);
|
this._boxPointer.bin.add_actor(this._extended_keyboard);
|
||||||
@ -161,11 +172,33 @@ const Keyboard = new Lang.Class({
|
|||||||
|
|
||||||
this._timestamp = global.display.get_current_time_roundtrip();
|
this._timestamp = global.display.get_current_time_roundtrip();
|
||||||
|
|
||||||
this._keyboardSettings = new Gio.Settings({ schema: KEYBOARD_SCHEMA });
|
this._keyboardSettings = new Gio.Settings({ schema_id: KEYBOARD_SCHEMA });
|
||||||
this._keyboardSettings.connect('changed', Lang.bind(this, this._settingsChanged));
|
this._keyboardSettings.connect('changed', Lang.bind(this, this._sync));
|
||||||
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._a11yApplicationsSettings.connect('changed', Lang.bind(this, this._sync));
|
||||||
this._settingsChanged();
|
this._watchNameId = Gio.bus_watch_name(Gio.BusType.SESSION, CURSOR_BUS_NAME, 0,
|
||||||
|
Lang.bind(this, this._sync),
|
||||||
|
Lang.bind(this, this._sync));
|
||||||
|
this._daemonProxy = new CaribouDaemonProxy(Gio.DBus.session, CARIBOU_BUS_NAME,
|
||||||
|
CARIBOU_OBJECT_PATH,
|
||||||
|
Lang.bind(this, function(proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
this._cursorProxy = new CursorManagerProxy(Gio.DBus.session, CURSOR_BUS_NAME,
|
||||||
|
CURSOR_OBJECT_PATH,
|
||||||
|
Lang.bind(this, function(proxy, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._cursorProxy.connect('g-properties-changed',
|
||||||
|
Lang.bind(this, this._sync));
|
||||||
|
this._sync();
|
||||||
|
}));
|
||||||
|
this._sync();
|
||||||
|
|
||||||
this._showIdleId = 0;
|
this._showIdleId = 0;
|
||||||
this._subkeysBoxPointer = null;
|
this._subkeysBoxPointer = null;
|
||||||
@ -183,8 +216,9 @@ const Keyboard = new Lang.Class({
|
|||||||
this._redraw();
|
this._redraw();
|
||||||
},
|
},
|
||||||
|
|
||||||
_settingsChanged: function (settings, key) {
|
_sync: function () {
|
||||||
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD);
|
this._enableKeyboard = this._a11yApplicationsSettings.get_boolean(SHOW_KEYBOARD) ||
|
||||||
|
this._cursorProxy.ShowOSK;
|
||||||
if (!this._enableKeyboard && !this._keyboard)
|
if (!this._enableKeyboard && !this._keyboard)
|
||||||
return;
|
return;
|
||||||
if (this._enableKeyboard && this._keyboard &&
|
if (this._enableKeyboard && this._keyboard &&
|
||||||
@ -214,9 +248,22 @@ const Keyboard = new Lang.Class({
|
|||||||
this.actor = null;
|
this.actor = null;
|
||||||
|
|
||||||
this._destroySource();
|
this._destroySource();
|
||||||
|
this._daemonProxy.QuitRemote(function (result, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
_setupKeyboard: function() {
|
_setupKeyboard: function() {
|
||||||
|
this._daemonProxy.RunRemote(function (result, error) {
|
||||||
|
if (error) {
|
||||||
|
log(error.message);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
|
this.actor = new St.BoxLayout({ name: 'keyboard', vertical: true, reactive: true });
|
||||||
Main.layoutManager.keyboardBox.add_actor(this.actor);
|
Main.layoutManager.keyboardBox.add_actor(this.actor);
|
||||||
Main.layoutManager.trackChrome(this.actor);
|
Main.layoutManager.trackChrome(this.actor);
|
||||||
|
@ -163,7 +163,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
// Normally, the stage is always covered so Clutter doesn't need to clear
|
// Normally, the stage is always covered so Clutter doesn't need to clear
|
||||||
// it; however it becomes visible during the startup animation
|
// it; however it becomes visible during the startup animation
|
||||||
// See the comment below for a longer explanation
|
// 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.
|
// Set up stage hierarchy to group all UI actors under one container.
|
||||||
this.uiGroup = new Shell.GenericContainer({ name: 'uiGroup' });
|
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
|
// A dummy actor that tracks the mouse or text cursor, based on the
|
||||||
// position and size set in setDummyCursorGeometry.
|
// 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);
|
this.uiGroup.add_actor(this.dummyCursor);
|
||||||
|
|
||||||
global.stage.remove_actor(global.top_window_group);
|
global.stage.remove_actor(global.top_window_group);
|
||||||
@ -408,6 +408,12 @@ const LayoutManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_updateKeyboardBox: function() {
|
||||||
|
this.keyboardBox.set_position(this.keyboardMonitor.x,
|
||||||
|
this.keyboardMonitor.y + this.keyboardMonitor.height);
|
||||||
|
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
|
||||||
|
},
|
||||||
|
|
||||||
_updateBoxes: function() {
|
_updateBoxes: function() {
|
||||||
this.screenShieldGroup.set_position(0, 0);
|
this.screenShieldGroup.set_position(0, 0);
|
||||||
this.screenShieldGroup.set_size(global.screen_width, global.screen_height);
|
this.screenShieldGroup.set_size(global.screen_width, global.screen_height);
|
||||||
@ -417,6 +423,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
if (this.keyboardIndex < 0)
|
if (this.keyboardIndex < 0)
|
||||||
this.keyboardIndex = this.primaryIndex;
|
this.keyboardIndex = this.primaryIndex;
|
||||||
|
else
|
||||||
|
this._updateKeyboardBox();
|
||||||
|
|
||||||
this.trayBox.set_position(this.bottomMonitor.x,
|
this.trayBox.set_position(this.bottomMonitor.x,
|
||||||
this.bottomMonitor.y + this.bottomMonitor.height);
|
this.bottomMonitor.y + this.bottomMonitor.height);
|
||||||
@ -541,9 +549,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
set keyboardIndex(v) {
|
set keyboardIndex(v) {
|
||||||
this._keyboardIndex = v;
|
this._keyboardIndex = v;
|
||||||
this.keyboardBox.set_position(this.keyboardMonitor.x,
|
this._updateKeyboardBox();
|
||||||
this.keyboardMonitor.y + this.keyboardMonitor.height);
|
|
||||||
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get keyboardIndex() {
|
get keyboardIndex() {
|
||||||
@ -597,7 +603,9 @@ const LayoutManager = new Lang.Class({
|
|||||||
reactive: true });
|
reactive: true });
|
||||||
this.addChrome(this._coverPane);
|
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;
|
this.panelBox.translation_y = -this.panelBox.height;
|
||||||
} else {
|
} else {
|
||||||
this._updateBackgrounds();
|
this._updateBackgrounds();
|
||||||
@ -636,7 +644,9 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_startupAnimation: function() {
|
_startupAnimation: function() {
|
||||||
if (Main.sessionMode.isGreeter)
|
if (Meta.is_restart())
|
||||||
|
this._startupAnimationComplete();
|
||||||
|
else if (Main.sessionMode.isGreeter)
|
||||||
this._startupAnimationGreeter();
|
this._startupAnimationGreeter();
|
||||||
else
|
else
|
||||||
this._startupAnimationSession();
|
this._startupAnimationSession();
|
||||||
@ -1017,43 +1027,6 @@ const LayoutManager = new Lang.Class({
|
|||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// Ensure that the strut rects goes all the way to the screen edge,
|
|
||||||
// as this really what mutter expects. 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 strutRect = new Meta.Rectangle({ x: x1, y: y1, width: x2 - x1, height: y2 - y1});
|
||||||
let strut = new Meta.Strut({ rect: strutRect, side: side });
|
let strut = new Meta.Strut({ rect: strutRect, side: side });
|
||||||
struts.push(strut);
|
struts.push(strut);
|
||||||
|
@ -105,8 +105,8 @@ const Lightbox = new Lang.Class({
|
|||||||
this._container = container;
|
this._container = container;
|
||||||
this._children = container.get_children();
|
this._children = container.get_children();
|
||||||
this._fadeFactor = params.fadeFactor;
|
this._fadeFactor = params.fadeFactor;
|
||||||
this._radialEffect = params.radialEffect;
|
this._radialEffect = Clutter.feature_available(Clutter.FeatureFlags.SHADERS_GLSL) && params.radialEffect;
|
||||||
if (params.radialEffect)
|
if (this._radialEffect)
|
||||||
this.actor = new RadialShaderQuad({ x: 0,
|
this.actor = new RadialShaderQuad({ x: 0,
|
||||||
y: 0,
|
y: 0,
|
||||||
reactive: params.inhibitEvents });
|
reactive: params.inhibitEvents });
|
||||||
|
@ -797,7 +797,7 @@ const LookingGlass = new Lang.Class({
|
|||||||
reactive: true });
|
reactive: true });
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent));
|
this.actor.connect('key-press-event', Lang.bind(this, this._globalKeyPressEvent));
|
||||||
|
|
||||||
this._interfaceSettings = new Gio.Settings({ schema: 'org.gnome.desktop.interface' });
|
this._interfaceSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
|
||||||
this._interfaceSettings.connect('changed::monospace-font-name',
|
this._interfaceSettings.connect('changed::monospace-font-name',
|
||||||
Lang.bind(this, this._updateFont));
|
Lang.bind(this, this._updateFont));
|
||||||
this._updateFont();
|
this._updateFont();
|
||||||
|
@ -441,8 +441,8 @@ const Magnifier = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_settingsInit: function(zoomRegion) {
|
_settingsInit: function(zoomRegion) {
|
||||||
this._appSettings = new Gio.Settings({ schema: APPLICATIONS_SCHEMA });
|
this._appSettings = new Gio.Settings({ schema_id: APPLICATIONS_SCHEMA });
|
||||||
this._settings = new Gio.Settings({ schema: MAGNIFIER_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: MAGNIFIER_SCHEMA });
|
||||||
|
|
||||||
if (zoomRegion) {
|
if (zoomRegion) {
|
||||||
// Mag factor is accurate to two decimal places.
|
// Mag factor is accurate to two decimal places.
|
||||||
|
@ -18,6 +18,7 @@ const ExtensionSystem = imports.ui.extensionSystem;
|
|||||||
const ExtensionDownloader = imports.ui.extensionDownloader;
|
const ExtensionDownloader = imports.ui.extensionDownloader;
|
||||||
const Keyboard = imports.ui.keyboard;
|
const Keyboard = imports.ui.keyboard;
|
||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
const OsdWindow = imports.ui.osdWindow;
|
const OsdWindow = imports.ui.osdWindow;
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
@ -74,7 +75,6 @@ let _startDate;
|
|||||||
let _defaultCssStylesheet = null;
|
let _defaultCssStylesheet = null;
|
||||||
let _cssStylesheet = null;
|
let _cssStylesheet = null;
|
||||||
let _a11ySettings = null;
|
let _a11ySettings = null;
|
||||||
let dynamicWorkspacesSchema = null;
|
|
||||||
|
|
||||||
function _sessionUpdated() {
|
function _sessionUpdated() {
|
||||||
_loadDefaultStylesheet();
|
_loadDefaultStylesheet();
|
||||||
@ -111,7 +111,6 @@ function start() {
|
|||||||
|
|
||||||
sessionMode = new SessionMode.SessionMode();
|
sessionMode = new SessionMode.SessionMode();
|
||||||
sessionMode.connect('updated', _sessionUpdated);
|
sessionMode.connect('updated', _sessionUpdated);
|
||||||
_initializePrefs();
|
|
||||||
_initializeUI();
|
_initializeUI();
|
||||||
|
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
@ -120,17 +119,6 @@ function start() {
|
|||||||
_sessionUpdated();
|
_sessionUpdated();
|
||||||
}
|
}
|
||||||
|
|
||||||
function _initializePrefs() {
|
|
||||||
let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
|
|
||||||
for (let i = 0; i < keys.length; i++)
|
|
||||||
Meta.prefs_override_preference_schema(keys[i], sessionMode.overridesSchema);
|
|
||||||
|
|
||||||
if (keys.indexOf('dynamic-workspaces') > -1)
|
|
||||||
dynamicWorkspacesSchema = sessionMode.overridesSchema;
|
|
||||||
else
|
|
||||||
dynamicWorkspacesSchema = 'org.gnome.mutter';
|
|
||||||
}
|
|
||||||
|
|
||||||
function _initializeUI() {
|
function _initializeUI() {
|
||||||
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
|
||||||
// also initialize ShellAppSystem first. ShellAppSystem
|
// also initialize ShellAppSystem first. ShellAppSystem
|
||||||
@ -173,13 +161,23 @@ function _initializeUI() {
|
|||||||
layoutManager.init();
|
layoutManager.init();
|
||||||
overview.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 () {
|
global.display.connect('overlay-key', Lang.bind(overview, function () {
|
||||||
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
|
if (!_a11ySettings.get_boolean (STICKY_KEYS_ENABLE))
|
||||||
overview.toggle();
|
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
|
// Provide the bus object for gnome-session to
|
||||||
// initiate logouts.
|
// initiate logouts.
|
||||||
EndSessionDialog.init();
|
EndSessionDialog.init();
|
||||||
@ -246,8 +244,7 @@ function _loadDefaultStylesheet() {
|
|||||||
* Returns: A file path that contains the theme CSS,
|
* Returns: A file path that contains the theme CSS,
|
||||||
* null if using the default
|
* null if using the default
|
||||||
*/
|
*/
|
||||||
function getThemeStylesheet()
|
function getThemeStylesheet() {
|
||||||
{
|
|
||||||
return _cssStylesheet;
|
return _cssStylesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,8 +255,7 @@ function getThemeStylesheet()
|
|||||||
*
|
*
|
||||||
* Set the theme CSS file that the shell will load
|
* Set the theme CSS file that the shell will load
|
||||||
*/
|
*/
|
||||||
function setThemeStylesheet(cssStylesheet)
|
function setThemeStylesheet(cssStylesheet) {
|
||||||
{
|
|
||||||
_cssStylesheet = cssStylesheet;
|
_cssStylesheet = cssStylesheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -621,3 +617,28 @@ function queueDeferredWork(workId) {
|
|||||||
GLib.Source.set_name_by_id(_deferredTimeoutId, '[gnome-shell] _runAllDeferredWork');
|
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();
|
||||||
|
}
|
||||||
|
@ -15,6 +15,7 @@ const Signals = imports.signals;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Tp = imports.gi.TelepathyGLib;
|
const Tp = imports.gi.TelepathyGLib;
|
||||||
|
|
||||||
|
const EdgeDragAction = imports.ui.edgeDragAction;
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
const GnomeSession = imports.misc.gnomeSession;
|
const GnomeSession = imports.misc.gnomeSession;
|
||||||
@ -111,7 +112,6 @@ const FocusGrabber = new Lang.Class({
|
|||||||
if (this._focused)
|
if (this._focused)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._prevFocusedWindow = global.display.focus_window;
|
|
||||||
this._prevKeyFocusActor = global.stage.get_key_focus();
|
this._prevKeyFocusActor = global.stage.get_key_focus();
|
||||||
|
|
||||||
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
|
this._focusActorChangedId = global.stage.connect('notify::key-focus', Lang.bind(this, this._focusActorChanged));
|
||||||
@ -316,7 +316,7 @@ const NotificationGenericPolicy = new Lang.Class({
|
|||||||
|
|
||||||
this.id = 'generic';
|
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));
|
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -366,8 +366,8 @@ const NotificationApplicationPolicy = new Lang.Class({
|
|||||||
this.id = id;
|
this.id = id;
|
||||||
this._canonicalId = this._canonicalizeId(id);
|
this._canonicalId = this._canonicalizeId(id);
|
||||||
|
|
||||||
this._masterSettings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications' });
|
this._masterSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications' });
|
||||||
this._settings = new Gio.Settings({ schema: 'org.gnome.desktop.notifications.application',
|
this._settings = new Gio.Settings({ schema_id: 'org.gnome.desktop.notifications.application',
|
||||||
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
|
path: '/org/gnome/desktop/notifications/application/' + this._canonicalId + '/' });
|
||||||
|
|
||||||
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
this._masterSettings.connect('changed', Lang.bind(this, this._changed));
|
||||||
@ -504,7 +504,6 @@ const Notification = new Lang.Class({
|
|||||||
this.bannerBodyMarkup = false;
|
this.bannerBodyMarkup = false;
|
||||||
this._bannerBodyAdded = false;
|
this._bannerBodyAdded = false;
|
||||||
this._titleFitsInBannerMode = true;
|
this._titleFitsInBannerMode = true;
|
||||||
this._titleDirection = Clutter.TextDirection.DEFAULT;
|
|
||||||
this._spacing = 0;
|
this._spacing = 0;
|
||||||
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
|
this._scrollPolicy = Gtk.PolicyType.AUTOMATIC;
|
||||||
this._imageBin = null;
|
this._imageBin = null;
|
||||||
@ -643,10 +642,11 @@ const Notification = new Lang.Class({
|
|||||||
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
|
title = title ? _fixMarkup(title.replace(/\n/g, ' '), false) : '';
|
||||||
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
|
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
|
||||||
|
|
||||||
|
let titleDirection;
|
||||||
if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL)
|
if (Pango.find_base_dir(title, -1) == Pango.Direction.RTL)
|
||||||
this._titleDirection = Clutter.TextDirection.RTL;
|
titleDirection = Clutter.TextDirection.RTL;
|
||||||
else
|
else
|
||||||
this._titleDirection = Clutter.TextDirection.LTR;
|
titleDirection = Clutter.TextDirection.LTR;
|
||||||
|
|
||||||
// Let the title's text direction control the overall direction
|
// Let the title's text direction control the overall direction
|
||||||
// of the notification - in case where different scripts are used
|
// of the notification - in case where different scripts are used
|
||||||
@ -654,7 +654,7 @@ const Notification = new Lang.Class({
|
|||||||
// arguably for action buttons as well. Labels other than the title
|
// arguably for action buttons as well. Labels other than the title
|
||||||
// will be allocated at the available width, so that their alignment
|
// will be allocated at the available width, so that their alignment
|
||||||
// is done correctly automatically.
|
// is done correctly automatically.
|
||||||
this._table.set_text_direction(this._titleDirection);
|
this._table.set_text_direction(titleDirection);
|
||||||
|
|
||||||
// Unless the notification has custom content, we save this.bannerBodyText
|
// Unless the notification has custom content, we save this.bannerBodyText
|
||||||
// to add it to the content of the notification if the notification is
|
// to add it to the content of the notification if the notification is
|
||||||
@ -923,7 +923,7 @@ const Notification = new Lang.Class({
|
|||||||
let [titleMinH, titleNatH] = this._titleLabel.get_preferred_height(availWidth);
|
let [titleMinH, titleNatH] = this._titleLabel.get_preferred_height(availWidth);
|
||||||
let [bannerMinW, bannerNatW] = this._bannerLabel.get_preferred_width(availWidth);
|
let [bannerMinW, bannerNatW] = this._bannerLabel.get_preferred_width(availWidth);
|
||||||
|
|
||||||
let rtl = (this._titleDirection == Clutter.TextDirection.RTL);
|
let rtl = (this._table.text_direction == Clutter.TextDirection.RTL);
|
||||||
let x = rtl ? availWidth : 0;
|
let x = rtl ? availWidth : 0;
|
||||||
|
|
||||||
if (this._secondaryIcon) {
|
if (this._secondaryIcon) {
|
||||||
@ -1901,14 +1901,14 @@ const MessageTray = new Lang.Class({
|
|||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
|
|
||||||
Main.wm.addKeybinding('toggle-message-tray',
|
Main.wm.addKeybinding('toggle-message-tray',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.MESSAGE_TRAY |
|
Shell.KeyBindingMode.MESSAGE_TRAY |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this.toggleAndNavigate));
|
Lang.bind(this, this.toggleAndNavigate));
|
||||||
Main.wm.addKeybinding('focus-active-notification',
|
Main.wm.addKeybinding('focus-active-notification',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.MESSAGE_TRAY |
|
Shell.KeyBindingMode.MESSAGE_TRAY |
|
||||||
@ -1934,6 +1934,10 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
this._messageTrayMenuButton = new MessageTrayMenuButton(this);
|
this._messageTrayMenuButton = new MessageTrayMenuButton(this);
|
||||||
this.actor.add_actor(this._messageTrayMenuButton.actor);
|
this.actor.add_actor(this._messageTrayMenuButton.actor);
|
||||||
|
|
||||||
|
let gesture = new EdgeDragAction.EdgeDragAction(St.Side.BOTTOM);
|
||||||
|
gesture.connect('activated', Lang.bind(this, this.toggle));
|
||||||
|
global.stage.add_action(gesture);
|
||||||
},
|
},
|
||||||
|
|
||||||
close: function() {
|
close: function() {
|
||||||
|
@ -43,6 +43,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
styleClass: null,
|
styleClass: null,
|
||||||
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
keybindingMode: Shell.KeyBindingMode.SYSTEM_MODAL,
|
||||||
shouldFadeIn: true,
|
shouldFadeIn: true,
|
||||||
|
shouldFadeOut: true,
|
||||||
destroyOnClose: true });
|
destroyOnClose: true });
|
||||||
|
|
||||||
this.state = State.CLOSED;
|
this.state = State.CLOSED;
|
||||||
@ -50,6 +51,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
this._keybindingMode = params.keybindingMode;
|
this._keybindingMode = params.keybindingMode;
|
||||||
this._shellReactive = params.shellReactive;
|
this._shellReactive = params.shellReactive;
|
||||||
this._shouldFadeIn = params.shouldFadeIn;
|
this._shouldFadeIn = params.shouldFadeIn;
|
||||||
|
this._shouldFadeOut = params.shouldFadeOut;
|
||||||
this._destroyOnClose = params.destroyOnClose;
|
this._destroyOnClose = params.destroyOnClose;
|
||||||
|
|
||||||
this._group = new St.Widget({ visible: false,
|
this._group = new St.Widget({ visible: false,
|
||||||
@ -307,6 +309,15 @@ const ModalDialog = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_closeComplete: function() {
|
||||||
|
this.state = State.CLOSED;
|
||||||
|
this._group.hide();
|
||||||
|
this.emit('closed');
|
||||||
|
|
||||||
|
if (this._destroyOnClose)
|
||||||
|
this.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
close: function(timestamp) {
|
close: function(timestamp) {
|
||||||
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
if (this.state == State.CLOSED || this.state == State.CLOSING)
|
||||||
return;
|
return;
|
||||||
@ -315,20 +326,16 @@ const ModalDialog = new Lang.Class({
|
|||||||
this.popModal(timestamp);
|
this.popModal(timestamp);
|
||||||
this._savedKeyFocus = null;
|
this._savedKeyFocus = null;
|
||||||
|
|
||||||
Tweener.addTween(this._group,
|
if (this._shouldFadeOut)
|
||||||
{ opacity: 0,
|
Tweener.addTween(this._group,
|
||||||
time: OPEN_AND_CLOSE_TIME,
|
{ opacity: 0,
|
||||||
transition: 'easeOutQuad',
|
time: OPEN_AND_CLOSE_TIME,
|
||||||
onComplete: Lang.bind(this,
|
transition: 'easeOutQuad',
|
||||||
function() {
|
onComplete: Lang.bind(this,
|
||||||
this.state = State.CLOSED;
|
this._closeComplete)
|
||||||
this._group.hide();
|
})
|
||||||
this.emit('closed');
|
else
|
||||||
|
this._closeComplete();
|
||||||
if (this._destroyOnClose)
|
|
||||||
this.destroy();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Drop modal status without closing the dialog; this makes the
|
// Drop modal status without closing the dialog; this makes the
|
||||||
|
@ -120,15 +120,12 @@ const FdoNotificationDaemon = new Lang.Class({
|
|||||||
|
|
||||||
this._nextNotificationId = 1;
|
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._trayManager = new Shell.TrayManager();
|
||||||
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
this._trayIconAddedId = this._trayManager.connect('tray-icon-added', Lang.bind(this, this._onTrayIconAdded));
|
||||||
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
this._trayIconRemovedId = this._trayManager.connect('tray-icon-removed', Lang.bind(this, this._onTrayIconRemoved));
|
||||||
|
|
||||||
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);
|
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({
|
const GtkNotificationDaemonNotification = new Lang.Class({
|
||||||
Name: 'GtkNotificationDaemonNotification',
|
Name: 'GtkNotificationDaemonNotification',
|
||||||
@ -705,12 +708,20 @@ const GtkNotificationDaemonNotification = new Lang.Class({
|
|||||||
"body": body,
|
"body": body,
|
||||||
"icon": gicon,
|
"icon": gicon,
|
||||||
"urgent": urgent,
|
"urgent": urgent,
|
||||||
|
"priority": priority,
|
||||||
"buttons": buttons,
|
"buttons": buttons,
|
||||||
"default-action": defaultAction,
|
"default-action": defaultAction,
|
||||||
"default-action-target": defaultActionTarget } = notification;
|
"default-action-target": defaultActionTarget } = notification;
|
||||||
|
|
||||||
this.setUrgency(urgent.unpack() ? MessageTray.Urgency.CRITICAL
|
if (priority) {
|
||||||
: MessageTray.Urgency.NORMAL);
|
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) {
|
if (buttons) {
|
||||||
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
buttons.deep_unpack().forEach(Lang.bind(this, function(button) {
|
||||||
|
@ -242,7 +242,7 @@ const Overview = new Lang.Class({
|
|||||||
opacity: 0 });
|
opacity: 0 });
|
||||||
this._overview.add_actor(this._panelGhost);
|
this._overview.add_actor(this._panelGhost);
|
||||||
|
|
||||||
this._searchEntry = new St.Entry({ name: 'searchEntry',
|
this._searchEntry = new St.Entry({ style_class: 'search-entry',
|
||||||
/* Translators: this is the text displayed
|
/* Translators: this is the text displayed
|
||||||
in the search entry when no search is
|
in the search entry when no search is
|
||||||
active; it should not exceed ~30
|
active; it should not exceed ~30
|
||||||
@ -425,8 +425,6 @@ const Overview = new Lang.Class({
|
|||||||
this.emit('windows-restacked', stackIndices);
|
this.emit('windows-restacked', stackIndices);
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Public methods ////
|
|
||||||
|
|
||||||
beginItemDrag: function(source) {
|
beginItemDrag: function(source) {
|
||||||
this.emit('item-drag-begin');
|
this.emit('item-drag-begin');
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
@ -455,23 +453,6 @@ const Overview = new Lang.Class({
|
|||||||
this._inDrag = false;
|
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() {
|
focusSearch: function() {
|
||||||
this.show();
|
this.show();
|
||||||
this._searchEntry.grab_key_focus();
|
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
|
// Checks if the Activities button is currently sensitive to
|
||||||
// clicks. The first call to this function within the
|
// clicks. The first call to this function within the
|
||||||
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
// OVERVIEW_ACTIVATION_TIMEOUT time of the hot corner being
|
||||||
@ -583,8 +501,6 @@ const Overview = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Private methods ////
|
|
||||||
|
|
||||||
_syncGrab: function() {
|
_syncGrab: function() {
|
||||||
// We delay grab changes during animation so that when removing the
|
// 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
|
// overview we don't have a problem with the release of a press/release
|
||||||
@ -614,28 +530,49 @@ const Overview = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateNotVisible: function() {
|
// show:
|
||||||
if (!this.visible || this.animationInProgress)
|
//
|
||||||
|
// 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;
|
return;
|
||||||
|
|
||||||
|
Main.layoutManager.showOverview();
|
||||||
|
this._animateVisible();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
_animateVisible: function() {
|
||||||
|
if (this.visible || this.animationInProgress)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.visible = true;
|
||||||
this.animationInProgress = true;
|
this.animationInProgress = true;
|
||||||
this.visibleTarget = false;
|
this.visibleTarget = true;
|
||||||
|
this._activationTime = Date.now() / 1000;
|
||||||
|
|
||||||
this.viewSelector.zoomFromOverview();
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
|
this.viewSelector.show();
|
||||||
|
|
||||||
// Make other elements fade out.
|
this._stack.opacity = 0;
|
||||||
Tweener.addTween(this._stack,
|
Tweener.addTween(this._stack,
|
||||||
{ opacity: 0,
|
{ opacity: 255,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
time: ANIMATION_TIME,
|
time: ANIMATION_TIME,
|
||||||
onComplete: this._hideDone,
|
onComplete: this._showDone,
|
||||||
onCompleteScope: this
|
onCompleteScope: this
|
||||||
});
|
});
|
||||||
this._unshadeBackgrounds();
|
this._shadeBackgrounds();
|
||||||
|
|
||||||
this._coverPane.raise_top();
|
this._coverPane.raise_top();
|
||||||
this._coverPane.show();
|
this._coverPane.show();
|
||||||
this.emit('hiding');
|
this.emit('showing');
|
||||||
},
|
},
|
||||||
|
|
||||||
_showDone: function() {
|
_showDone: function() {
|
||||||
@ -652,6 +589,57 @@ const Overview = new Lang.Class({
|
|||||||
global.sync_pointer();
|
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;
|
||||||
|
|
||||||
|
this.animationInProgress = true;
|
||||||
|
this.visibleTarget = false;
|
||||||
|
|
||||||
|
this.viewSelector.animateFromOverview();
|
||||||
|
|
||||||
|
// Make other elements fade out.
|
||||||
|
Tweener.addTween(this._stack,
|
||||||
|
{ opacity: 0,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
time: ANIMATION_TIME,
|
||||||
|
onComplete: this._hideDone,
|
||||||
|
onCompleteScope: this
|
||||||
|
});
|
||||||
|
this._unshadeBackgrounds();
|
||||||
|
|
||||||
|
this._coverPane.raise_top();
|
||||||
|
this._coverPane.show();
|
||||||
|
this.emit('hiding');
|
||||||
|
},
|
||||||
|
|
||||||
_hideDone: function() {
|
_hideDone: function() {
|
||||||
// Re-enable unredirection
|
// Re-enable unredirection
|
||||||
Meta.enable_unredirect_for_screen(global.screen);
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
@ -677,6 +665,20 @@ const Overview = new Lang.Class({
|
|||||||
this._fakePointerEvent();
|
this._fakePointerEvent();
|
||||||
this._needsFakePointerEvent = false;
|
this._needsFakePointerEvent = false;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
toggle: function() {
|
||||||
|
if (this.isDummy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this.visible)
|
||||||
|
this.hide();
|
||||||
|
else
|
||||||
|
this.show();
|
||||||
|
},
|
||||||
|
|
||||||
|
getShowAppsButton: function() {
|
||||||
|
return this._dash.showAppsButton;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(Overview.prototype);
|
Signals.addSignalMethods(Overview.prototype);
|
||||||
|
@ -36,7 +36,7 @@ const SlideLayout = new Lang.Class({
|
|||||||
|
|
||||||
_init: function(params) {
|
_init: function(params) {
|
||||||
this._slideX = 1;
|
this._slideX = 1;
|
||||||
this._translationX = 0;
|
this._translationX = undefined;
|
||||||
this._direction = SlideDirection.LEFT;
|
this._direction = SlideDirection.LEFT;
|
||||||
|
|
||||||
this.parent(params);
|
this.parent(params);
|
||||||
@ -118,7 +118,6 @@ const SlidingControl = new Lang.Class({
|
|||||||
style_class: 'overview-controls',
|
style_class: 'overview-controls',
|
||||||
clip_to_allocation: true });
|
clip_to_allocation: true });
|
||||||
|
|
||||||
Main.overview.connect('showing', Lang.bind(this, this._onOverviewShowing));
|
|
||||||
Main.overview.connect('hiding', Lang.bind(this, this._onOverviewHiding));
|
Main.overview.connect('hiding', Lang.bind(this, this._onOverviewHiding));
|
||||||
|
|
||||||
Main.overview.connect('item-drag-begin', Lang.bind(this, this._onDragBegin));
|
Main.overview.connect('item-drag-begin', Lang.bind(this, this._onDragBegin));
|
||||||
@ -162,7 +161,8 @@ const SlidingControl = new Lang.Class({
|
|||||||
let translationEnd = 0;
|
let translationEnd = 0;
|
||||||
let translation = this._getTranslation();
|
let translation = this._getTranslation();
|
||||||
|
|
||||||
if (this._visible) {
|
let shouldShow = (this._getSlide() > 0);
|
||||||
|
if (shouldShow) {
|
||||||
translationStart = translation;
|
translationStart = translation;
|
||||||
} else {
|
} else {
|
||||||
translationEnd = translation;
|
translationEnd = translation;
|
||||||
@ -177,14 +177,9 @@ const SlidingControl = new Lang.Class({
|
|||||||
transition: 'easeOutQuad' });
|
transition: 'easeOutQuad' });
|
||||||
},
|
},
|
||||||
|
|
||||||
_onOverviewShowing: function() {
|
|
||||||
this._visible = true;
|
|
||||||
this.layout.slideX = this._getSlide();
|
|
||||||
this.layout.translationX = this._getTranslation();
|
|
||||||
this.slideIn();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onOverviewHiding: function() {
|
_onOverviewHiding: function() {
|
||||||
|
// We need to explicitly slideOut since showing pages
|
||||||
|
// doesn't imply sliding out, instead, hiding the overview does.
|
||||||
this.slideOut();
|
this.slideOut();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -198,7 +193,7 @@ const SlidingControl = new Lang.Class({
|
|||||||
|
|
||||||
_onDragBegin: function() {
|
_onDragBegin: function() {
|
||||||
this._inDrag = true;
|
this._inDrag = true;
|
||||||
this.layout.translationX = 0;
|
this._updateTranslation();
|
||||||
this._updateSlide();
|
this._updateSlide();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -223,7 +218,6 @@ const SlidingControl = new Lang.Class({
|
|||||||
|
|
||||||
slideIn: function() {
|
slideIn: function() {
|
||||||
this._visible = true;
|
this._visible = true;
|
||||||
this._updateTranslation();
|
|
||||||
// we will update slideX and the translation from pageEmpty
|
// we will update slideX and the translation from pageEmpty
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ const St = imports.gi.St;
|
|||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
|
|
||||||
const Animation = imports.ui.animation;
|
const Animation = imports.ui.animation;
|
||||||
const Config = imports.misc.config;
|
const Config = imports.misc.config;
|
||||||
const CtrlAltTab = imports.ui.ctrlAltTab;
|
const CtrlAltTab = imports.ui.ctrlAltTab;
|
||||||
@ -572,7 +571,6 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
this.actor.label_actor = this._label;
|
this.actor.label_actor = this._label;
|
||||||
|
|
||||||
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
||||||
this.actor.connect_after('button-release-event', Lang.bind(this, this._onButtonRelease));
|
|
||||||
this.actor.connect_after('key-release-event', Lang.bind(this, this._onKeyRelease));
|
this.actor.connect_after('key-release-event', Lang.bind(this, this._onKeyRelease));
|
||||||
|
|
||||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||||
@ -601,16 +599,21 @@ const ActivitiesButton = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onCapturedEvent: function(actor, event) {
|
_onCapturedEvent: function(actor, event) {
|
||||||
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
|
if (event.type() == Clutter.EventType.BUTTON_PRESS ||
|
||||||
|
event.type() == Clutter.EventType.TOUCH_BEGIN) {
|
||||||
if (!Main.overview.shouldToggleByCornerOrButton())
|
if (!Main.overview.shouldToggleByCornerOrButton())
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onButtonRelease: function() {
|
_onEvent: function(actor, event) {
|
||||||
Main.overview.toggle();
|
this.parent(actor, event);
|
||||||
this.menu.close();
|
|
||||||
|
if (event.type() == Clutter.EventType.TOUCH_END ||
|
||||||
|
event.type() == Clutter.EventType.BUTTON_RELEASE)
|
||||||
|
Main.overview.toggle();
|
||||||
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -41,8 +41,7 @@ const ButtonBox = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||||
let children = actor.get_children();
|
let child = actor.get_first_child();
|
||||||
let child = children.length > 0 ? children[0] : null;
|
|
||||||
|
|
||||||
if (child) {
|
if (child) {
|
||||||
[alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1);
|
[alloc.min_size, alloc.natural_size] = child.get_preferred_width(-1);
|
||||||
@ -55,8 +54,7 @@ const ButtonBox = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredHeight: function(actor, forWidth, alloc) {
|
_getPreferredHeight: function(actor, forWidth, alloc) {
|
||||||
let children = actor.get_children();
|
let child = actor.get_first_child();
|
||||||
let child = children.length > 0 ? children[0] : null;
|
|
||||||
|
|
||||||
if (child) {
|
if (child) {
|
||||||
[alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1);
|
[alloc.min_size, alloc.natural_size] = child.get_preferred_height(-1);
|
||||||
@ -66,13 +64,11 @@ const ButtonBox = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_allocate: function(actor, box, flags) {
|
_allocate: function(actor, box, flags) {
|
||||||
let children = actor.get_children();
|
let child = actor.get_first_child();
|
||||||
if (children.length == 0)
|
if (!child)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let child = children[0];
|
|
||||||
let [minWidth, natWidth] = child.get_preferred_width(-1);
|
let [minWidth, natWidth] = child.get_preferred_width(-1);
|
||||||
let [minHeight, natHeight] = child.get_preferred_height(-1);
|
|
||||||
|
|
||||||
let availWidth = box.x2 - box.x1;
|
let availWidth = box.x2 - box.x1;
|
||||||
let availHeight = box.y2 - box.y1;
|
let availHeight = box.y2 - box.y1;
|
||||||
@ -104,8 +100,7 @@ const Button = new Lang.Class({
|
|||||||
accessible_name: nameText ? nameText : "",
|
accessible_name: nameText ? nameText : "",
|
||||||
accessible_role: Atk.Role.MENU });
|
accessible_role: Atk.Role.MENU });
|
||||||
|
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
this.actor.connect('event', Lang.bind(this, this._onEvent));
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
|
|
||||||
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged));
|
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibilityChanged));
|
||||||
|
|
||||||
if (dontCreateMenu)
|
if (dontCreateMenu)
|
||||||
@ -135,32 +130,13 @@ const Button = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onButtonPress: function(actor, event) {
|
_onEvent: function(actor, event) {
|
||||||
if (!this.menu)
|
if (this.menu &&
|
||||||
return Clutter.EVENT_PROPAGATE;
|
(event.type() == Clutter.EventType.TOUCH_BEGIN ||
|
||||||
|
event.type() == Clutter.EventType.BUTTON_PRESS))
|
||||||
this.menu.toggle();
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSourceKeyPress: function(actor, event) {
|
|
||||||
if (!this.menu)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
let symbol = event.get_key_symbol();
|
|
||||||
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
|
|
||||||
this.menu.toggle();
|
this.menu.toggle();
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
} else if (symbol == Clutter.KEY_Escape && this.menu.isOpen) {
|
return Clutter.EVENT_PROPAGATE;
|
||||||
this.menu.close();
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
} else if (symbol == Clutter.KEY_Down) {
|
|
||||||
if (!this.menu.isOpen)
|
|
||||||
this.menu.toggle();
|
|
||||||
this.menu.actor.navigate_focus(this.actor, Gtk.DirectionType.DOWN, false);
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
} else
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onVisibilityChanged: function() {
|
_onVisibilityChanged: function() {
|
||||||
|
@ -1,9 +1,7 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
@ -15,7 +13,6 @@ const GrabHelper = imports.ui.grabHelper;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
const Separator = imports.ui.separator;
|
const Separator = imports.ui.separator;
|
||||||
const Slider = imports.ui.slider;
|
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
const Ornament = {
|
const Ornament = {
|
||||||
@ -24,17 +21,6 @@ const Ornament = {
|
|||||||
CHECK: 2,
|
CHECK: 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
function _ensureStyle(actor) {
|
|
||||||
if (actor.get_children) {
|
|
||||||
let children = actor.get_children();
|
|
||||||
for (let i = 0; i < children.length; i++)
|
|
||||||
_ensureStyle(children[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (actor instanceof St.Widget)
|
|
||||||
actor.ensure_style();
|
|
||||||
}
|
|
||||||
|
|
||||||
function isPopupMenuItemVisible(child) {
|
function isPopupMenuItemVisible(child) {
|
||||||
if (child._delegate instanceof PopupMenuSection)
|
if (child._delegate instanceof PopupMenuSection)
|
||||||
if (child._delegate.isEmpty())
|
if (child._delegate.isEmpty())
|
||||||
@ -46,33 +32,28 @@ function isPopupMenuItemVisible(child) {
|
|||||||
* @side Side to which the arrow points.
|
* @side Side to which the arrow points.
|
||||||
*/
|
*/
|
||||||
function arrowIcon(side) {
|
function arrowIcon(side) {
|
||||||
let rotation;
|
let iconName;
|
||||||
switch (side) {
|
switch (side) {
|
||||||
case St.Side.TOP:
|
case St.Side.TOP:
|
||||||
rotation = 180;
|
iconName = 'pan-up-symbolic';
|
||||||
break;
|
break;
|
||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
rotation = - 90;
|
iconName = 'pan-end-symbolic';
|
||||||
break;
|
break;
|
||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
rotation = 0;
|
iconName = 'pan-down-symbolic';
|
||||||
break;
|
break;
|
||||||
case St.Side.LEFT:
|
case St.Side.LEFT:
|
||||||
rotation = 90;
|
iconName = 'pan-start-symbolic';
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
let gicon = new Gio.FileIcon({ file: Gio.File.new_for_path(global.datadir +
|
|
||||||
'/theme/menu-arrow-symbolic.svg') });
|
|
||||||
|
|
||||||
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
|
let arrow = new St.Icon({ style_class: 'popup-menu-arrow',
|
||||||
gicon: gicon,
|
icon_name: iconName,
|
||||||
accessible_role: Atk.Role.ARROW,
|
accessible_role: Atk.Role.ARROW,
|
||||||
y_expand: true,
|
y_expand: true,
|
||||||
y_align: Clutter.ActorAlign.CENTER });
|
y_align: Clutter.ActorAlign.CENTER });
|
||||||
|
|
||||||
arrow.rotation_angle_z = rotation;
|
|
||||||
|
|
||||||
return arrow;
|
return arrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +92,7 @@ const PopupBaseMenuItem = new Lang.Class({
|
|||||||
|
|
||||||
if (this._activatable) {
|
if (this._activatable) {
|
||||||
this.actor.connect('button-release-event', Lang.bind(this, this._onButtonReleaseEvent));
|
this.actor.connect('button-release-event', Lang.bind(this, this._onButtonReleaseEvent));
|
||||||
|
this.actor.connect('touch-event', Lang.bind(this, this._onTouchEvent));
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
|
||||||
}
|
}
|
||||||
if (params.reactive && params.hover)
|
if (params.reactive && params.hover)
|
||||||
@ -137,6 +119,14 @@ const PopupBaseMenuItem = new Lang.Class({
|
|||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onTouchEvent: function (actor, event) {
|
||||||
|
if (event.type() == Clutter.EventType.TOUCH_END) {
|
||||||
|
this.activate(event);
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
}
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
},
|
||||||
|
|
||||||
_onKeyPressEvent: function (actor, event) {
|
_onKeyPressEvent: function (actor, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let symbol = event.get_key_symbol();
|
||||||
|
|
||||||
@ -383,9 +373,9 @@ const PopupImageMenuItem = new Lang.Class({
|
|||||||
this.parent(params);
|
this.parent(params);
|
||||||
|
|
||||||
this.label = new St.Label({ text: text });
|
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._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);
|
this.setIcon(iconName);
|
||||||
},
|
},
|
||||||
@ -741,6 +731,10 @@ const PopupMenu = new Lang.Class({
|
|||||||
global.focus_manager.add_group(this.actor);
|
global.focus_manager.add_group(this.actor);
|
||||||
this.actor.reactive = true;
|
this.actor.reactive = true;
|
||||||
|
|
||||||
|
if (this.sourceActor)
|
||||||
|
this._keyPressId = this.sourceActor.connect('key-press-event',
|
||||||
|
Lang.bind(this, this._onKeyPress));
|
||||||
|
|
||||||
this._openedSubMenu = null;
|
this._openedSubMenu = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -751,6 +745,40 @@ const PopupMenu = new Lang.Class({
|
|||||||
this._openedSubMenu = submenu;
|
this._openedSubMenu = submenu;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_onKeyPress: function(actor, event) {
|
||||||
|
let navKey;
|
||||||
|
switch (this._boxPointer.arrowSide) {
|
||||||
|
case St.Side.TOP:
|
||||||
|
navKey = Clutter.KEY_Down;
|
||||||
|
break;
|
||||||
|
case St.Side.BOTTOM:
|
||||||
|
navKey = Clutter.KEY_Up;
|
||||||
|
break;
|
||||||
|
case St.Side.LEFT:
|
||||||
|
navKey = Clutter.KEY_Right;
|
||||||
|
break;
|
||||||
|
case St.Side.RIGHT:
|
||||||
|
navKey = Clutter.KEY_Left;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let symbol = event.get_key_symbol();
|
||||||
|
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
|
||||||
|
this.toggle();
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
} else if (symbol == Clutter.KEY_Escape && this.isOpen) {
|
||||||
|
this.close();
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
} else if (symbol == navKey) {
|
||||||
|
if (!this.isOpen)
|
||||||
|
this.toggle();
|
||||||
|
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
} else
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
setArrowOrigin: function(origin) {
|
setArrowOrigin: function(origin) {
|
||||||
this._boxPointer.setArrowOrigin(origin);
|
this._boxPointer.setArrowOrigin(origin);
|
||||||
},
|
},
|
||||||
@ -791,6 +819,12 @@ const PopupMenu = new Lang.Class({
|
|||||||
|
|
||||||
this.isOpen = false;
|
this.isOpen = false;
|
||||||
this.emit('open-state-changed', false);
|
this.emit('open-state-changed', false);
|
||||||
|
},
|
||||||
|
|
||||||
|
destroy: function() {
|
||||||
|
if (this._keyPressId)
|
||||||
|
this.sourceActor.disconnect(this._keyPressId);
|
||||||
|
this.parent();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -110,6 +110,13 @@ function loadRemoteSearchProviders(callback) {
|
|||||||
else
|
else
|
||||||
remoteProvider = new RemoteSearchProvider(appInfo, busName, objectPath);
|
remoteProvider = new RemoteSearchProvider(appInfo, busName, objectPath);
|
||||||
|
|
||||||
|
remoteProvider.defaultEnabled = true;
|
||||||
|
try {
|
||||||
|
remoteProvider.defaultEnabled = !keyfile.get_boolean(group, 'DefaultDisabled');
|
||||||
|
} catch(e) {
|
||||||
|
// ignore error
|
||||||
|
}
|
||||||
|
|
||||||
objectPaths[objectPath] = remoteProvider;
|
objectPaths[objectPath] = remoteProvider;
|
||||||
loadedProviders.push(remoteProvider);
|
loadedProviders.push(remoteProvider);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
@ -117,7 +124,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')) {
|
if (searchSettings.get_boolean('disable-external')) {
|
||||||
callback([]);
|
callback([]);
|
||||||
return;
|
return;
|
||||||
@ -132,8 +139,14 @@ function loadRemoteSearchProviders(callback) {
|
|||||||
|
|
||||||
loadedProviders = loadedProviders.filter(function(provider) {
|
loadedProviders = loadedProviders.filter(function(provider) {
|
||||||
let appId = provider.appInfo.get_id();
|
let appId = provider.appInfo.get_id();
|
||||||
let disabled = searchSettings.get_strv('disabled');
|
|
||||||
return disabled.indexOf(appId) == -1;
|
if (provider.defaultEnabled) {
|
||||||
|
let disabled = searchSettings.get_strv('disabled');
|
||||||
|
return disabled.indexOf(appId) == -1;
|
||||||
|
} else {
|
||||||
|
let enabled = searchSettings.get_strv('enabled');
|
||||||
|
return enabled.indexOf(appId) != -1;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
loadedProviders.sort(function(providerA, providerB) {
|
loadedProviders.sort(function(providerA, providerB) {
|
||||||
|
@ -38,8 +38,8 @@ const RunDialog = new Lang.Class({
|
|||||||
this.parent({ styleClass: 'run-dialog',
|
this.parent({ styleClass: 'run-dialog',
|
||||||
destroyOnClose: false });
|
destroyOnClose: false });
|
||||||
|
|
||||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||||
this._terminalSettings = new Gio.Settings({ schema: TERMINAL_SCHEMA });
|
this._terminalSettings = new Gio.Settings({ schema_id: TERMINAL_SCHEMA });
|
||||||
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
global.settings.connect('changed::development-tools', Lang.bind(this, function () {
|
||||||
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
this._enableInternalCommands = global.settings.get_boolean('development-tools');
|
||||||
}));
|
}));
|
||||||
@ -50,14 +50,10 @@ const RunDialog = new Lang.Class({
|
|||||||
Main.createLookingGlass().open();
|
Main.createLookingGlass().open();
|
||||||
}),
|
}),
|
||||||
|
|
||||||
'r': Lang.bind(this, function() {
|
'r': Lang.bind(this, this._restart),
|
||||||
global.reexec_self();
|
|
||||||
}),
|
|
||||||
|
|
||||||
// Developer brain backwards compatibility
|
// Developer brain backwards compatibility
|
||||||
'restart': Lang.bind(this, function() {
|
'restart': Lang.bind(this, this._restart),
|
||||||
global.reexec_self();
|
|
||||||
}),
|
|
||||||
|
|
||||||
'debugexit': Lang.bind(this, function() {
|
'debugexit': Lang.bind(this, function() {
|
||||||
Meta.quit(Meta.ExitCode.ERROR);
|
Meta.quit(Meta.ExitCode.ERROR);
|
||||||
@ -186,6 +182,10 @@ const RunDialog = new Lang.Class({
|
|||||||
let results = someResults.reduce(function(a, b) {
|
let results = someResults.reduce(function(a, b) {
|
||||||
return a.concat(b);
|
return a.concat(b);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
if (!results.length)
|
||||||
|
return null;
|
||||||
|
|
||||||
let common = results.reduce(_getCommon, null);
|
let common = results.reduce(_getCommon, null);
|
||||||
return common.substr(text.length);
|
return common.substr(text.length);
|
||||||
},
|
},
|
||||||
@ -271,6 +271,12 @@ const RunDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_restart: function() {
|
||||||
|
this._shouldFadeOut = false;
|
||||||
|
this.close();
|
||||||
|
Meta.restart(_("Restarting…"));
|
||||||
|
},
|
||||||
|
|
||||||
open: function() {
|
open: function() {
|
||||||
this._history.lastItem();
|
this._history.lastItem();
|
||||||
this._errorBox.hide();
|
this._errorBox.hide();
|
||||||
|
@ -444,14 +444,12 @@ function clamp(value, min, max) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* To test screen shield, make sure to kill gnome-screensaver.
|
|
||||||
*
|
|
||||||
* If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
|
* If you are setting org.gnome.desktop.session.idle-delay directly in dconf,
|
||||||
* rather than through System Settings, you also need to set
|
* rather than through System Settings, you also need to set
|
||||||
* org.gnome.settings-daemon.plugins.power.sleep-display-ac and
|
* org.gnome.settings-daemon.plugins.power.sleep-display-ac and
|
||||||
* org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value.
|
* org.gnome.settings-daemon.plugins.power.sleep-display-battery to the same value.
|
||||||
* This will ensure that the screen blanks at the right time when it fades out.
|
* This will ensure that the screen blanks at the right time when it fades out.
|
||||||
* https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependance.
|
* https://bugzilla.gnome.org/show_bug.cgi?id=668703 explains the dependency.
|
||||||
*/
|
*/
|
||||||
const ScreenShield = new Lang.Class({
|
const ScreenShield = new Lang.Class({
|
||||||
Name: 'ScreenShield',
|
Name: 'ScreenShield',
|
||||||
@ -563,7 +561,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.deactivate(false); }));
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
|
||||||
|
|
||||||
this._isModal = false;
|
this._isModal = false;
|
||||||
this._hasLockScreen = false;
|
this._hasLockScreen = false;
|
||||||
@ -689,10 +687,10 @@ const ScreenShield = new Lang.Class({
|
|||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
|
||||||
let delta = 0;
|
let delta = 0;
|
||||||
if (event.get_scroll_direction() == Clutter.ScrollDirection.UP)
|
if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
|
||||||
|
delta = Math.abs(event.get_scroll_delta()[0]);
|
||||||
|
else
|
||||||
delta = 5;
|
delta = 5;
|
||||||
else if (event.get_scroll_direction() == Clutter.ScrollDirection.SMOOTH)
|
|
||||||
delta = Math.max(0, event.get_scroll_delta()[0]);
|
|
||||||
|
|
||||||
this._lockScreenScrollCounter += delta;
|
this._lockScreenScrollCounter += delta;
|
||||||
|
|
||||||
@ -902,17 +900,11 @@ const ScreenShield = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
showDialog: function() {
|
showDialog: function() {
|
||||||
// Ensure that the stage window is mapped, before taking a grab
|
if (!this._becomeModal()) {
|
||||||
// otherwise X errors out
|
// In the login screen, this is a hard error. Fail-whale
|
||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
log('Could not acquire modal grab for the login screen. Aborting login process.');
|
||||||
if (!this._becomeModal()) {
|
Meta.quit(Meta.ExitCode.ERROR);
|
||||||
// In the login screen, this is a hard error. Fail-whale
|
}
|
||||||
log('Could not acquire modal grab for the login screen. Aborting login process.');
|
|
||||||
Meta.quit(Meta.ExitCode.ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
this._isGreeter = Main.sessionMode.isGreeter;
|
this._isGreeter = Main.sessionMode.isGreeter;
|
||||||
|
@ -68,6 +68,13 @@ const ScreenshotService = new Lang.Class({
|
|||||||
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
Gio.DBus.session.own_name('org.gnome.Shell.Screenshot', Gio.BusNameOwnerFlags.REPLACE, null, null);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_checkArea: function(x, y, width, height) {
|
||||||
|
return x >= 0 && y >= 0 &&
|
||||||
|
width > 0 && height > 0 &&
|
||||||
|
x + width <= global.screen_width &&
|
||||||
|
y + height <= global.screen_height;
|
||||||
|
},
|
||||||
|
|
||||||
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
|
_onScreenshotComplete: function(obj, result, area, filenameUsed, flash, invocation) {
|
||||||
if (flash && result) {
|
if (flash && result) {
|
||||||
let flashspot = new Flashspot(area);
|
let flashspot = new Flashspot(area);
|
||||||
@ -78,13 +85,31 @@ const ScreenshotService = new Lang.Class({
|
|||||||
invocation.return_value(retval);
|
invocation.return_value(retval);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_scaleArea: function(x, y, width, height) {
|
||||||
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
|
x *= scaleFactor;
|
||||||
|
y *= scaleFactor;
|
||||||
|
width *= scaleFactor;
|
||||||
|
height *= scaleFactor;
|
||||||
|
return [x, y, width, height];
|
||||||
|
},
|
||||||
|
|
||||||
|
_unscaleArea: function(x, y, width, height) {
|
||||||
|
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor;
|
||||||
|
x /= scaleFactor;
|
||||||
|
y /= scaleFactor;
|
||||||
|
width /= scaleFactor;
|
||||||
|
height /= scaleFactor;
|
||||||
|
return [x, y, width, height];
|
||||||
|
},
|
||||||
|
|
||||||
ScreenshotAreaAsync : function (params, invocation) {
|
ScreenshotAreaAsync : function (params, invocation) {
|
||||||
let [x, y, width, height, flash, filename, callback] = params;
|
let [x, y, width, height, flash, filename, callback] = params;
|
||||||
if (x < 0 || y < 0 ||
|
[x, y, width, height] = this._scaleArea(x, y, width, height);
|
||||||
width <= 0 || height <= 0 ||
|
if (!this._checkArea(x, y, width, height)) {
|
||||||
x + width > global.screen_width || y + height > global.screen_height) {
|
invocation.return_error_literal(Gio.IOErrorEnum,
|
||||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
Gio.IOErrorEnum.CANCELLED,
|
||||||
"Invalid params");
|
"Invalid params");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let screenshot = new Shell.Screenshot();
|
let screenshot = new Shell.Screenshot();
|
||||||
@ -115,9 +140,9 @@ const ScreenshotService = new Lang.Class({
|
|||||||
selectArea.connect('finished', Lang.bind(this,
|
selectArea.connect('finished', Lang.bind(this,
|
||||||
function(selectArea, areaRectangle) {
|
function(selectArea, areaRectangle) {
|
||||||
if (areaRectangle) {
|
if (areaRectangle) {
|
||||||
let retval = GLib.Variant.new('(iiii)',
|
let retRectangle = this._unscaleArea(areaRectangle.x, areaRectangle.y,
|
||||||
[areaRectangle.x, areaRectangle.y,
|
areaRectangle.width, areaRectangle.height);
|
||||||
areaRectangle.width, areaRectangle.height]);
|
let retval = GLib.Variant.new('(iiii)', retRectangle);
|
||||||
invocation.return_value(retval);
|
invocation.return_value(retval);
|
||||||
} else {
|
} else {
|
||||||
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
invocation.return_error_literal(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED,
|
||||||
@ -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});
|
let flashspot = new Flashspot({ x : x, y : y, width: width, height: height});
|
||||||
flashspot.fire();
|
flashspot.fire();
|
||||||
|
invocation.return_value(null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ const Meta = imports.gi.Meta;
|
|||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
// This module provides functionality for driving the shell user interface
|
// This module provides functionality for driving the shell user interface
|
||||||
// in an automated fashion. The primary current use case for this is
|
// 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="i" direction="in" /> \
|
||||||
<arg type="b" direction="in" /> \
|
<arg type="b" direction="in" /> \
|
||||||
<arg type="b" direction="in" /> \
|
<arg type="b" direction="in" /> \
|
||||||
|
<arg type="b" direction="in" /> \
|
||||||
</method> \
|
</method> \
|
||||||
<method name="WaitWindows" /> \
|
<method name="WaitWindows" /> \
|
||||||
<method name="DestroyWindows" /> \
|
<method name="DestroyWindows" /> \
|
||||||
@ -97,11 +99,36 @@ function _getPerfHelper() {
|
|||||||
return _perfHelper;
|
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:
|
* createTestWindow:
|
||||||
* @width: width of window, in pixels
|
* @params: options for window creation.
|
||||||
* @height: height of window, in pixels
|
* width - width of window, in pixels (default 640)
|
||||||
* @alpha: whether the window should be alpha transparent
|
* 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
|
* @maximized: whethe the window should be created maximized
|
||||||
*
|
*
|
||||||
* Creates a window using gnome-shell-perf-helper for testing purposes.
|
* 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
|
* because of the normal X asynchronous mapping process, to actually wait
|
||||||
* until the window has been mapped and exposed, use waitTestWindows().
|
* until the window has been mapped and exposed, use waitTestWindows().
|
||||||
*/
|
*/
|
||||||
function createTestWindow(width, height, alpha, maximized) {
|
function createTestWindow(width, height, params) {
|
||||||
let cb;
|
params = Params.parse(params, { width: 640,
|
||||||
|
height: 480,
|
||||||
|
alpha: false,
|
||||||
|
maximized: false,
|
||||||
|
redraws: false });
|
||||||
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.CreateWindowRemote,
|
||||||
perfHelper.CreateWindowRemote(width, height, alpha, maximized,
|
params.width, params.height,
|
||||||
function(result, excp) {
|
params.alpha, params.maximized, params.redraws);
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,17 +157,8 @@ function createTestWindow(width, height, alpha, maximized) {
|
|||||||
* created with createTestWindow have been mapped and exposed.
|
* created with createTestWindow have been mapped and exposed.
|
||||||
*/
|
*/
|
||||||
function waitTestWindows() {
|
function waitTestWindows() {
|
||||||
let cb;
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.WaitWindowsRemote);
|
||||||
perfHelper.WaitWindowsRemote(function(result, excp) {
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -155,17 +171,8 @@ function waitTestWindows() {
|
|||||||
* process because of normal X asynchronicity.
|
* process because of normal X asynchronicity.
|
||||||
*/
|
*/
|
||||||
function destroyTestWindows() {
|
function destroyTestWindows() {
|
||||||
let cb;
|
|
||||||
let perfHelper = _getPerfHelper();
|
let perfHelper = _getPerfHelper();
|
||||||
|
return _callRemote(perfHelper, perfHelper.DestroyWindowsRemote);
|
||||||
perfHelper.DestroyWindowsRemote(function(result, excp) {
|
|
||||||
if (cb)
|
|
||||||
cb();
|
|
||||||
});
|
|
||||||
|
|
||||||
return function(callback) {
|
|
||||||
cb = callback;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -208,6 +215,10 @@ function _step(g, finish, onError) {
|
|||||||
let waitFunction = g.next();
|
let waitFunction = g.next();
|
||||||
waitFunction(function() {
|
waitFunction(function() {
|
||||||
_step(g, finish, onError);
|
_step(g, finish, onError);
|
||||||
|
},
|
||||||
|
function(err) {
|
||||||
|
if (onError)
|
||||||
|
onError(err);
|
||||||
});
|
});
|
||||||
} catch (err if err instanceof StopIteration) {
|
} catch (err if err instanceof StopIteration) {
|
||||||
if (finish)
|
if (finish)
|
||||||
@ -306,8 +317,8 @@ function _collect(scriptModule, outputFile) {
|
|||||||
print ('------------------------------------------------------------');
|
print ('------------------------------------------------------------');
|
||||||
for (let i = 0; i < metrics.length; i++) {
|
for (let i = 0; i < metrics.length; i++) {
|
||||||
let metric = metrics[i];
|
let metric = metrics[i];
|
||||||
print ('# ' + scriptModule.METRIC_DESCRIPTIONS[metric]);
|
print ('# ' + scriptModule.METRICS[metric].description);
|
||||||
print (metric + ': ' + scriptModule.METRICS[metric]);
|
print (metric + ': ' + scriptModule.METRICS[metric].value + scriptModule.METRICS[metric].units);
|
||||||
}
|
}
|
||||||
print ('------------------------------------------------------------');
|
print ('------------------------------------------------------------');
|
||||||
}
|
}
|
||||||
@ -360,7 +371,12 @@ function runPerfScript(scriptModule, outputFile) {
|
|||||||
|
|
||||||
_step(g,
|
_step(g,
|
||||||
function() {
|
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);
|
Meta.exit(Meta.ExitCode.SUCCESS);
|
||||||
},
|
},
|
||||||
function(err) {
|
function(err) {
|
||||||
|
139
js/ui/search.js
139
js/ui/search.js
@ -6,6 +6,7 @@ const Gio = imports.gi.Gio;
|
|||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Atk = imports.gi.Atk;
|
const Atk = imports.gi.Atk;
|
||||||
|
|
||||||
@ -31,7 +32,8 @@ const SearchSystem = new Lang.Class({
|
|||||||
|
|
||||||
this._registerProvider(new AppDisplay.AppSearchProvider());
|
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::enabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
|
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
|
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
|
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
@ -163,13 +165,6 @@ const SearchResult = new Lang.Class({
|
|||||||
|
|
||||||
activate: function() {
|
activate: function() {
|
||||||
this.emit('activate', this.metaInfo.id);
|
this.emit('activate', this.metaInfo.id);
|
||||||
},
|
|
||||||
|
|
||||||
setSelected: function(selected) {
|
|
||||||
if (selected)
|
|
||||||
this.actor.add_style_pseudo_class('selected');
|
|
||||||
else
|
|
||||||
this.actor.remove_style_pseudo_class('selected');
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(SearchResult.prototype);
|
Signals.addSignalMethods(SearchResult.prototype);
|
||||||
@ -230,59 +225,11 @@ const GridSearchResult = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.style_class = 'grid-search-result';
|
this.actor.style_class = 'grid-search-result';
|
||||||
|
|
||||||
let content = provider.createResultObject(metaInfo);
|
this.icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
||||||
let dragSource = null;
|
{ createIcon: this.metaInfo['createIcon'] });
|
||||||
|
let content = new St.Bin({ child: this.icon.actor });
|
||||||
if (content == null) {
|
this.actor.set_child(content);
|
||||||
let actor = new St.Bin();
|
this.actor.label_actor = this.icon.label;
|
||||||
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
|
||||||
{ createIcon: this.metaInfo['createIcon'] });
|
|
||||||
actor.set_child(icon.actor);
|
|
||||||
actor.label_actor = icon.label;
|
|
||||||
dragSource = icon.icon;
|
|
||||||
content = { actor: actor, icon: icon };
|
|
||||||
} else {
|
|
||||||
if (content._delegate && content._delegate.getDragActorSource)
|
|
||||||
dragSource = content._delegate.getDragActorSource();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.set_child(content.actor);
|
|
||||||
this.actor.label_actor = content.actor.label_actor;
|
|
||||||
this.icon = content.icon;
|
|
||||||
|
|
||||||
let draggable = DND.makeDraggable(this.actor);
|
|
||||||
draggable.connect('drag-begin',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
Main.overview.beginItemDrag(this);
|
|
||||||
}));
|
|
||||||
draggable.connect('drag-cancelled',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
Main.overview.cancelledItemDrag(this);
|
|
||||||
}));
|
|
||||||
draggable.connect('drag-end',
|
|
||||||
Lang.bind(this, function() {
|
|
||||||
Main.overview.endItemDrag(this);
|
|
||||||
}));
|
|
||||||
|
|
||||||
if (!dragSource)
|
|
||||||
// not exactly right, but alignment problems are hard to notice
|
|
||||||
dragSource = content;
|
|
||||||
this._dragActorSource = dragSource;
|
|
||||||
},
|
|
||||||
|
|
||||||
getDragActorSource: function() {
|
|
||||||
return this._dragActorSource;
|
|
||||||
},
|
|
||||||
|
|
||||||
getDragActor: function() {
|
|
||||||
return this.metaInfo['createIcon'](Main.overview.dashIconSize);
|
|
||||||
},
|
|
||||||
|
|
||||||
shellWorkspaceLaunch: function(params) {
|
|
||||||
if (this.provider.dragActivateResult)
|
|
||||||
this.provider.dragActivateResult(this.metaInfo.id, params);
|
|
||||||
else
|
|
||||||
this.provider.activateResult(this.metaInfo.id, this.terms);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -314,7 +261,11 @@ const SearchResultsBase = new Lang.Class({
|
|||||||
this._terms = [];
|
this._terms = [];
|
||||||
},
|
},
|
||||||
|
|
||||||
_clearResultDisplay: function() {
|
_createResultDisplay: function(meta) {
|
||||||
|
if (this.provider.createResultObject)
|
||||||
|
return this.provider.createResultObject(meta);
|
||||||
|
|
||||||
|
return null;
|
||||||
},
|
},
|
||||||
|
|
||||||
clear: function() {
|
clear: function() {
|
||||||
@ -416,6 +367,7 @@ const ListSearchResults = new Lang.Class({
|
|||||||
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
this.providerIcon.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
this.providerIcon.connect('clicked', Lang.bind(this,
|
this.providerIcon.connect('clicked', Lang.bind(this,
|
||||||
function() {
|
function() {
|
||||||
|
this.providerIcon.animateLaunch();
|
||||||
provider.launchSearch(this._terms);
|
provider.launchSearch(this._terms);
|
||||||
Main.overview.toggle();
|
Main.overview.toggle();
|
||||||
}));
|
}));
|
||||||
@ -433,7 +385,7 @@ const ListSearchResults = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_setMoreIconVisible: function(visible) {
|
_setMoreIconVisible: function(visible) {
|
||||||
this.providerIcon.moreIcon.visible = true;
|
this.providerIcon.moreIcon.visible = visible;
|
||||||
},
|
},
|
||||||
|
|
||||||
_getMaxDisplayedResults: function() {
|
_getMaxDisplayedResults: function() {
|
||||||
@ -445,7 +397,7 @@ const ListSearchResults = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_createResultDisplay: function(meta) {
|
_createResultDisplay: function(meta) {
|
||||||
return new ListSearchResult(this.provider, meta);
|
return this.parent(meta) || new ListSearchResult(this.provider, meta);
|
||||||
},
|
},
|
||||||
|
|
||||||
_addItem: function(display) {
|
_addItem: function(display) {
|
||||||
@ -465,8 +417,14 @@ const GridSearchResults = new Lang.Class({
|
|||||||
Name: 'GridSearchResults',
|
Name: 'GridSearchResults',
|
||||||
Extends: SearchResultsBase,
|
Extends: SearchResultsBase,
|
||||||
|
|
||||||
_init: function(provider) {
|
_init: function(provider, parentContainer) {
|
||||||
this.parent(provider);
|
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,
|
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_GRID_SEARCH_RESULTS_ROWS,
|
||||||
xAlign: St.Align.START });
|
xAlign: St.Align.START });
|
||||||
@ -477,16 +435,9 @@ const GridSearchResults = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getMaxDisplayedResults: function() {
|
_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) {
|
|
||||||
for (let i = 0; i < metas.length; i++) {
|
|
||||||
let display = new GridSearchResult(this.provider, metas[i]);
|
|
||||||
display.connect('activate', Lang.bind(this, this._activateResult));
|
|
||||||
display.actor.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
|
||||||
this._grid.addItem(display);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_clearResultDisplay: function () {
|
_clearResultDisplay: function () {
|
||||||
@ -494,7 +445,7 @@ const GridSearchResults = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_createResultDisplay: function(meta) {
|
_createResultDisplay: function(meta) {
|
||||||
return new GridSearchResult(this.provider, meta);
|
return this.parent(meta) || new GridSearchResult(this.provider, meta);
|
||||||
},
|
},
|
||||||
|
|
||||||
_addItem: function(display) {
|
_addItem: function(display) {
|
||||||
@ -577,7 +528,7 @@ const SearchResults = new Lang.Class({
|
|||||||
if (provider.appInfo)
|
if (provider.appInfo)
|
||||||
providerDisplay = new ListSearchResults(provider);
|
providerDisplay = new ListSearchResults(provider);
|
||||||
else
|
else
|
||||||
providerDisplay = new GridSearchResults(provider);
|
providerDisplay = new GridSearchResults(provider, this._content);
|
||||||
|
|
||||||
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
providerDisplay.connect('key-focus-in', Lang.bind(this, this._keyFocusIn));
|
||||||
this._content.add(providerDisplay.actor);
|
this._content.add(providerDisplay.actor);
|
||||||
@ -630,13 +581,8 @@ const SearchResults = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (newDefaultResult != this._defaultResult) {
|
if (newDefaultResult != this._defaultResult) {
|
||||||
if (this._defaultResult)
|
this._setSelected(this._defaultResult, false);
|
||||||
this._defaultResult.setSelected(false);
|
this._setSelected(newDefaultResult, this._highlightDefault);
|
||||||
if (newDefaultResult) {
|
|
||||||
newDefaultResult.setSelected(this._highlightDefault);
|
|
||||||
if (this._highlightDefault)
|
|
||||||
Util.ensureActorVisibleInScrollView(this._scrollView, newDefaultResult.actor);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._defaultResult = newDefaultResult;
|
this._defaultResult = newDefaultResult;
|
||||||
}
|
}
|
||||||
@ -673,11 +619,7 @@ const SearchResults = new Lang.Class({
|
|||||||
|
|
||||||
highlightDefault: function(highlight) {
|
highlightDefault: function(highlight) {
|
||||||
this._highlightDefault = highlight;
|
this._highlightDefault = highlight;
|
||||||
if (this._defaultResult) {
|
this._setSelected(this._defaultResult, highlight);
|
||||||
this._defaultResult.setSelected(highlight);
|
|
||||||
if (highlight)
|
|
||||||
Util.ensureActorVisibleInScrollView(this._scrollView, this._defaultResult.actor);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
navigateFocus: function(direction) {
|
navigateFocus: function(direction) {
|
||||||
@ -692,6 +634,18 @@ const SearchResults = new Lang.Class({
|
|||||||
|
|
||||||
let from = this._defaultResult ? this._defaultResult.actor : null;
|
let from = this._defaultResult ? this._defaultResult.actor : null;
|
||||||
this.actor.navigate_focus(from, direction, false);
|
this.actor.navigate_focus(from, direction, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
_setSelected: function(result, selected) {
|
||||||
|
if (!result)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (selected) {
|
||||||
|
result.actor.add_style_pseudo_class('selected');
|
||||||
|
Util.ensureActorVisibleInScrollView(this._scrollView, result.actor);
|
||||||
|
} else {
|
||||||
|
result.actor.remove_style_pseudo_class('selected');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -725,5 +679,12 @@ const ProviderIcon = new Lang.Class({
|
|||||||
gicon: provider.appInfo.get_icon() });
|
gicon: provider.appInfo.get_icon() });
|
||||||
this._content.add_actor(icon);
|
this._content.add_actor(icon);
|
||||||
this._content.add_actor(this.moreIcon);
|
this._content.add_actor(this.moreIcon);
|
||||||
|
},
|
||||||
|
|
||||||
|
animateLaunch: function() {
|
||||||
|
let appSys = Shell.AppSystem.get_default();
|
||||||
|
let app = appSys.lookup_app(this.provider.appInfo.get_id());
|
||||||
|
if (app.state == Shell.AppState.STOPPED)
|
||||||
|
IconGrid.zoomOutActor(this._content);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -18,7 +18,6 @@ const _modes = {
|
|||||||
'restrictive': {
|
'restrictive': {
|
||||||
parentMode: null,
|
parentMode: null,
|
||||||
stylesheetName: 'gnome-shell.css',
|
stylesheetName: 'gnome-shell.css',
|
||||||
overridesSchema: 'org.gnome.shell.overrides',
|
|
||||||
hasOverview: false,
|
hasOverview: false,
|
||||||
showCalendarEvents: false,
|
showCalendarEvents: false,
|
||||||
allowSettings: false,
|
allowSettings: false,
|
||||||
|
@ -24,6 +24,7 @@ const Slider = new Lang.Class({
|
|||||||
accessible_role: Atk.Role.SLIDER });
|
accessible_role: Atk.Role.SLIDER });
|
||||||
this.actor.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
this.actor.connect('repaint', Lang.bind(this, this._sliderRepaint));
|
||||||
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
|
this.actor.connect('button-press-event', Lang.bind(this, this._startDragging));
|
||||||
|
this.actor.connect('touch-event', Lang.bind(this, this._touchDragging));
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||||
this.actor.connect('key-press-event', Lang.bind(this, this.onKeyPressEvent));
|
this.actor.connect('key-press-event', Lang.bind(this, this.onKeyPressEvent));
|
||||||
|
|
||||||
@ -121,11 +122,21 @@ const Slider = new Lang.Class({
|
|||||||
this._dragging = true;
|
this._dragging = true;
|
||||||
|
|
||||||
let device = event.get_device();
|
let device = event.get_device();
|
||||||
device.grab(this.actor);
|
let sequence = event.get_event_sequence();
|
||||||
this._grabbedDevice = device;
|
|
||||||
|
if (sequence != null)
|
||||||
|
device.sequence_grab(sequence, this.actor);
|
||||||
|
else
|
||||||
|
device.grab(this.actor);
|
||||||
|
|
||||||
|
this._grabbedDevice = device;
|
||||||
|
this._grabbedSequence = sequence;
|
||||||
|
|
||||||
|
if (sequence == null) {
|
||||||
|
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
|
||||||
|
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
|
||||||
|
}
|
||||||
|
|
||||||
this._releaseId = this.actor.connect('button-release-event', Lang.bind(this, this._endDragging));
|
|
||||||
this._motionId = this.actor.connect('motion-event', Lang.bind(this, this._motionEvent));
|
|
||||||
let absX, absY;
|
let absX, absY;
|
||||||
[absX, absY] = event.get_coords();
|
[absX, absY] = event.get_coords();
|
||||||
this._moveHandle(absX, absY);
|
this._moveHandle(absX, absY);
|
||||||
@ -134,10 +145,17 @@ const Slider = new Lang.Class({
|
|||||||
|
|
||||||
_endDragging: function() {
|
_endDragging: function() {
|
||||||
if (this._dragging) {
|
if (this._dragging) {
|
||||||
this.actor.disconnect(this._releaseId);
|
if (this._releaseId)
|
||||||
this.actor.disconnect(this._motionId);
|
this.actor.disconnect(this._releaseId);
|
||||||
|
if (this._motionId)
|
||||||
|
this.actor.disconnect(this._motionId);
|
||||||
|
|
||||||
this._grabbedDevice.ungrab();
|
if (this._grabbedSequence != null)
|
||||||
|
this._grabbedDevice.sequence_ungrab(this._grabbedSequence);
|
||||||
|
else
|
||||||
|
this._grabbedDevice.ungrab();
|
||||||
|
|
||||||
|
this._grabbedSequence = null;
|
||||||
this._grabbedDevice = null;
|
this._grabbedDevice = null;
|
||||||
this._dragging = false;
|
this._dragging = false;
|
||||||
|
|
||||||
@ -146,6 +164,24 @@ const Slider = new Lang.Class({
|
|||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_touchDragging: function(actor, event) {
|
||||||
|
let device = event.get_device();
|
||||||
|
let sequence = event.get_event_sequence();
|
||||||
|
|
||||||
|
if (!this._dragging &&
|
||||||
|
event.type() == Clutter.EventType.TOUCH_BEGIN) {
|
||||||
|
this.startDragging(event);
|
||||||
|
return Clutter.EVENT_STOP;
|
||||||
|
} else if (device.sequence_get_grabbed_actor(sequence) == actor) {
|
||||||
|
if (event.type() == Clutter.EventType.TOUCH_UPDATE)
|
||||||
|
return this._motionEvent(actor, event);
|
||||||
|
else if (event.type() == Clutter.EventType.TOUCH_END)
|
||||||
|
return this._endDragging();
|
||||||
|
}
|
||||||
|
|
||||||
|
return Clutter.EVENT_PROPAGATE;
|
||||||
|
},
|
||||||
|
|
||||||
scroll: function(event) {
|
scroll: function(event) {
|
||||||
let direction = event.get_scroll_direction();
|
let direction = event.get_scroll_direction();
|
||||||
let delta;
|
let delta;
|
||||||
|
@ -48,7 +48,7 @@ const ATIndicator = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.add_child(this._hbox);
|
this.actor.add_child(this._hbox);
|
||||||
|
|
||||||
this._a11ySettings = new Gio.Settings({ schema: A11Y_SCHEMA });
|
this._a11ySettings = new Gio.Settings({ schema_id: A11Y_SCHEMA });
|
||||||
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, Lang.bind(this, this._queueSyncMenuVisibility));
|
this._a11ySettings.connect('changed::' + KEY_ALWAYS_SHOW, Lang.bind(this, this._queueSyncMenuVisibility));
|
||||||
|
|
||||||
let highContrast = this._buildHCItem();
|
let highContrast = this._buildHCItem();
|
||||||
@ -118,7 +118,7 @@ const ATIndicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_buildItem: function(string, schema, key) {
|
_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,
|
let widget = this._buildItemExtended(string,
|
||||||
settings.get_boolean(key),
|
settings.get_boolean(key),
|
||||||
settings.is_writable(key),
|
settings.is_writable(key),
|
||||||
@ -134,8 +134,8 @@ const ATIndicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_buildHCItem: function() {
|
_buildHCItem: function() {
|
||||||
let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
|
let interfaceSettings = new Gio.Settings({ schema_id: DESKTOP_INTERFACE_SCHEMA });
|
||||||
let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
|
let wmSettings = new Gio.Settings({ schema_id: WM_SCHEMA });
|
||||||
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||||
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||||
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
|
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
|
||||||
@ -186,7 +186,7 @@ const ATIndicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_buildFontItem: function() {
|
_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 factor = settings.get_double(KEY_TEXT_SCALING_FACTOR);
|
||||||
let initial_setting = (factor > 1.0);
|
let initial_setting = (factor > 1.0);
|
||||||
|
@ -283,11 +283,11 @@ const InputSourcePopup = new Lang.Class({
|
|||||||
this._select(this._selectedIndex);
|
this._select(this._selectedIndex);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
if (action == this._action)
|
if (action == this._action)
|
||||||
this._select(backwards ? this._previous() : this._next());
|
this._select(this._next());
|
||||||
else if (action == this._actionBackward)
|
else if (action == this._actionBackward)
|
||||||
this._select(backwards ? this._next() : this._previous());
|
this._select(this._previous());
|
||||||
else if (keysym == Clutter.Left)
|
else if (keysym == Clutter.Left)
|
||||||
this._select(this._previous());
|
this._select(this._previous());
|
||||||
else if (keysym == Clutter.Right)
|
else if (keysym == Clutter.Right)
|
||||||
@ -365,18 +365,17 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
this._mruSources = [];
|
this._mruSources = [];
|
||||||
this._keybindingAction =
|
this._keybindingAction =
|
||||||
Main.wm.addKeybinding('switch-input-source',
|
Main.wm.addKeybinding('switch-input-source',
|
||||||
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
|
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
|
||||||
Meta.KeyBindingFlags.REVERSES,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.ALL,
|
Shell.KeyBindingMode.ALL,
|
||||||
Lang.bind(this, this._switchInputSource));
|
Lang.bind(this, this._switchInputSource));
|
||||||
this._keybindingActionBackward =
|
this._keybindingActionBackward =
|
||||||
Main.wm.addKeybinding('switch-input-source-backward',
|
Main.wm.addKeybinding('switch-input-source-backward',
|
||||||
new Gio.Settings({ schema: "org.gnome.desktop.wm.keybindings" }),
|
new Gio.Settings({ schema_id: "org.gnome.desktop.wm.keybindings" }),
|
||||||
Meta.KeyBindingFlags.REVERSES |
|
Meta.KeyBindingFlags.IS_REVERSED,
|
||||||
Meta.KeyBindingFlags.REVERSED,
|
|
||||||
Shell.KeyBindingMode.ALL,
|
Shell.KeyBindingMode.ALL,
|
||||||
Lang.bind(this, this._switchInputSource));
|
Lang.bind(this, this._switchInputSource));
|
||||||
this._settings = new Gio.Settings({ schema: 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_CURRENT_INPUT_SOURCE, Lang.bind(this, this._currentInputSourceChanged));
|
||||||
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
|
this._settings.connect('changed::' + KEY_INPUT_SOURCES, Lang.bind(this, this._inputSourcesChanged));
|
||||||
|
|
||||||
@ -473,8 +472,7 @@ const InputSourceIndicator = new Lang.Class({
|
|||||||
|
|
||||||
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
|
let popup = new InputSourcePopup(this._mruSources, this._keybindingAction, this._keybindingActionBackward);
|
||||||
let modifiers = binding.get_modifiers();
|
let modifiers = binding.get_modifiers();
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
if (!popup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
|
||||||
if (!popup.show(backwards, binding.get_name(), binding.get_mask()))
|
|
||||||
popup.destroy();
|
popup.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -9,8 +9,9 @@ const PanelMenu = imports.ui.panelMenu;
|
|||||||
const PopupMenu = imports.ui.popupMenu;
|
const PopupMenu = imports.ui.popupMenu;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
|
||||||
const LOCATION_SCHEMA = 'org.gnome.shell.location';
|
const LOCATION_SCHEMA = 'org.gnome.system.location';
|
||||||
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
|
const MAX_ACCURACY_LEVEL = 'max-accuracy-level';
|
||||||
|
const ENABLED = 'enabled';
|
||||||
|
|
||||||
var GeoclueIface = '<node> \
|
var GeoclueIface = '<node> \
|
||||||
<interface name="org.freedesktop.GeoClue2.Manager"> \
|
<interface name="org.freedesktop.GeoClue2.Manager"> \
|
||||||
@ -43,7 +44,9 @@ const Indicator = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: LOCATION_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: LOCATION_SCHEMA });
|
||||||
|
this._settings.connect('changed::' + ENABLED,
|
||||||
|
Lang.bind(this, this._onMaxAccuracyLevelChanged));
|
||||||
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
|
this._settings.connect('changed::' + MAX_ACCURACY_LEVEL,
|
||||||
Lang.bind(this, this._onMaxAccuracyLevelChanged));
|
Lang.bind(this, this._onMaxAccuracyLevelChanged));
|
||||||
|
|
||||||
@ -93,10 +96,12 @@ const Indicator = new Lang.Class({
|
|||||||
_syncIndicator: function() {
|
_syncIndicator: function() {
|
||||||
if (this._proxy == null) {
|
if (this._proxy == null) {
|
||||||
this._indicator.visible = false;
|
this._indicator.visible = false;
|
||||||
|
this._item.actor.visible = false;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._indicator.visible = this._proxy.InUse;
|
this._indicator.visible = this._proxy.InUse;
|
||||||
|
this._item.actor.visible = this._indicator.visible;
|
||||||
this._updateMenuLabels();
|
this._updateMenuLabels();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -123,7 +128,6 @@ const Indicator = new Lang.Class({
|
|||||||
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
|
this._propertiesChangedId = this._proxy.connect('g-properties-changed',
|
||||||
Lang.bind(this, this._onGeocluePropsChanged));
|
Lang.bind(this, this._onGeocluePropsChanged));
|
||||||
|
|
||||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
|
||||||
this._syncIndicator();
|
this._syncIndicator();
|
||||||
|
|
||||||
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
|
this._proxy.AddAgentRemote('gnome-shell', Lang.bind(this, this._onAgentRegistered));
|
||||||
@ -148,10 +152,8 @@ const Indicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onOnOffAction: function() {
|
_onOnOffAction: function() {
|
||||||
if (this._getMaxAccuracyLevel() == 0)
|
let enabled = this._settings.get_boolean(ENABLED);
|
||||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, this._availableAccuracyLevel);
|
this._settings.set_boolean(ENABLED, !enabled);
|
||||||
else
|
|
||||||
this._settings.set_enum(MAX_ACCURACY_LEVEL, 0);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onSessionUpdated: function() {
|
_onSessionUpdated: function() {
|
||||||
@ -160,12 +162,12 @@ const Indicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateMenuLabels: function() {
|
_updateMenuLabels: function() {
|
||||||
if (this._getMaxAccuracyLevel() == 0) {
|
if (this._settings.get_boolean(ENABLED)) {
|
||||||
this._item.status.text = _("Disabled");
|
|
||||||
this._onOffAction.label.text = _("Enable");
|
|
||||||
} else {
|
|
||||||
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
|
this._item.status.text = this._indicator.visible ? _("In Use") : _("Enabled");
|
||||||
this._onOffAction.label.text = _("Disable");
|
this._onOffAction.label.text = _("Disable");
|
||||||
|
} else {
|
||||||
|
this._item.status.text = _("Disabled");
|
||||||
|
this._onOffAction.label.text = _("Enable");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -179,7 +181,10 @@ const Indicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getMaxAccuracyLevel: function() {
|
_getMaxAccuracyLevel: function() {
|
||||||
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
|
if (this._settings.get_boolean(ENABLED))
|
||||||
|
return this._settings.get_enum(MAX_ACCURACY_LEVEL);
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
_notifyMaxAccuracyLevel: function() {
|
_notifyMaxAccuracyLevel: function() {
|
||||||
@ -191,8 +196,6 @@ const Indicator = new Lang.Class({
|
|||||||
let unpacked = properties.deep_unpack();
|
let unpacked = properties.deep_unpack();
|
||||||
if ("InUse" in unpacked)
|
if ("InUse" in unpacked)
|
||||||
this._syncIndicator();
|
this._syncIndicator();
|
||||||
if ("AvailableAccuracyLevel" in unpacked)
|
|
||||||
this._availableAccuracyLevel = this._proxy.AvailableAccuracyLevel;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -44,6 +44,33 @@ const NM80211Mode = NetworkManager['80211Mode'];
|
|||||||
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
const NM80211ApFlags = NetworkManager['80211ApFlags'];
|
||||||
const NM80211ApSecurityFlags = NetworkManager['80211ApSecurityFlags'];
|
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) {
|
function ssidCompare(one, two) {
|
||||||
if (!one || !two)
|
if (!one || !two)
|
||||||
return false;
|
return false;
|
||||||
@ -207,13 +234,23 @@ const NMConnectionSection = new Lang.Class({
|
|||||||
this.item.menu.addMenuItem(this._labelSection);
|
this.item.menu.addMenuItem(this._labelSection);
|
||||||
this.item.menu.addMenuItem(this._radioSection);
|
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() {
|
destroy: function() {
|
||||||
|
if (this._notifyConnectivityId != 0) {
|
||||||
|
this._client.disconnect(this._notifyConnectivityId);
|
||||||
|
this._notifyConnectivityId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.item.destroy();
|
this.item.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_iconChanged: function() {
|
||||||
|
this._sync();
|
||||||
|
this.emit('icon-changed');
|
||||||
|
},
|
||||||
|
|
||||||
_sync: function() {
|
_sync: function() {
|
||||||
let nItems = this._connectionItems.size;
|
let nItems = this._connectionItems.size;
|
||||||
|
|
||||||
@ -278,7 +315,7 @@ const NMConnectionSection = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
item.connect('icon-changed', Lang.bind(this, function() {
|
item.connect('icon-changed', Lang.bind(this, function() {
|
||||||
this.emit('icon-changed');
|
this._iconChanged();
|
||||||
}));
|
}));
|
||||||
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
item.connect('activation-failed', Lang.bind(this, function(item, reason) {
|
||||||
this.emit('activation-failed', reason);
|
this.emit('activation-failed', reason);
|
||||||
@ -523,7 +560,7 @@ const NMDeviceModem = new Lang.Class({
|
|||||||
if (this._mobileDevice) {
|
if (this._mobileDevice) {
|
||||||
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync));
|
this._operatorNameId = this._mobileDevice.connect('notify::operator-name', Lang.bind(this, this._sync));
|
||||||
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
this._signalQualityId = this._mobileDevice.connect('notify::signal-quality', Lang.bind(this, function() {
|
||||||
this.emit('icon-changed');
|
this._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._wirelessHwEnabledChangedId = this._client.connect('notify::wireless-hardware-enabled', Lang.bind(this, this._sync));
|
||||||
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
this._activeApChangedId = this._device.connect('notify::active-access-point', Lang.bind(this, this._activeApChanged));
|
||||||
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
this._stateChangedId = this._device.connect('state-changed', Lang.bind(this, this._deviceStateChanged));
|
||||||
|
this._notifyConnectivityId = this._client.connect('notify::connectivity', Lang.bind(this, this._iconChanged));
|
||||||
|
|
||||||
this._sync();
|
this._sync();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_iconChanged: function() {
|
||||||
|
this._sync();
|
||||||
|
this.emit('icon-changed');
|
||||||
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
if (this._activeApChangedId) {
|
if (this._activeApChangedId) {
|
||||||
GObject.Object.prototype.disconnect.call(this._device, 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.destroy();
|
||||||
this._dialog = null;
|
this._dialog = null;
|
||||||
}
|
}
|
||||||
|
if (this._notifyConnectivityId) {
|
||||||
|
this._client.disconnect(this._notifyConnectivityId);
|
||||||
|
this._notifyConnectivityId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
this.item.destroy();
|
this.item.destroy();
|
||||||
},
|
},
|
||||||
@ -1211,7 +1258,7 @@ const NMDeviceWireless = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_strengthChanged: function() {
|
_strengthChanged: function() {
|
||||||
this.emit('icon-changed');
|
this._iconChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
_activeApChanged: function() {
|
_activeApChanged: function() {
|
||||||
@ -1561,6 +1608,7 @@ const NMApplet = new Lang.Class({
|
|||||||
|
|
||||||
this._activeConnections = [ ];
|
this._activeConnections = [ ];
|
||||||
this._connections = [ ];
|
this._connections = [ ];
|
||||||
|
this._connectivityQueue = [ ];
|
||||||
|
|
||||||
this._mainConnection = null;
|
this._mainConnection = null;
|
||||||
this._mainConnectionIconChangedId = 0;
|
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::primary-connection', Lang.bind(this, this._syncMainConnection));
|
||||||
this._client.connect('notify::activating-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::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-added', Lang.bind(this, this._deviceAdded));
|
||||||
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
this._client.connect('device-removed', Lang.bind(this, this._deviceRemoved));
|
||||||
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
this._settings.connect('new-connection', Lang.bind(this, this._newConnection));
|
||||||
@ -1757,6 +1806,7 @@ const NMApplet = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._updateIcon();
|
this._updateIcon();
|
||||||
|
this._syncConnectivity();
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncVPNConnections: function() {
|
_syncVPNConnections: function() {
|
||||||
@ -1862,6 +1912,97 @@ const NMApplet = new Lang.Class({
|
|||||||
_syncNMState: function() {
|
_syncNMState: function() {
|
||||||
this.indicators.visible = this._client.manager_running;
|
this.indicators.visible = this._client.manager_running;
|
||||||
this.menu.actor.visible = this._client.networking_enabled;
|
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() {
|
_updateIcon: function() {
|
||||||
|
@ -95,11 +95,11 @@ const Indicator = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
this._screenSaverSettings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });
|
this._screenSaverSettings = new Gio.Settings({ schema_id: SCREENSAVER_SCHEMA });
|
||||||
this._loginScreenSettings = new Gio.Settings({ schema: LOGIN_SCREEN_SCHEMA });
|
this._loginScreenSettings = new Gio.Settings({ schema_id: LOGIN_SCREEN_SCHEMA });
|
||||||
this._lockdownSettings = new Gio.Settings({ schema: LOCKDOWN_SCHEMA });
|
this._lockdownSettings = new Gio.Settings({ schema_id: LOCKDOWN_SCHEMA });
|
||||||
this._privacySettings = new Gio.Settings({ schema: PRIVACY_SCHEMA });
|
this._privacySettings = new Gio.Settings({ schema_id: PRIVACY_SCHEMA });
|
||||||
this._orientationSettings = new Gio.Settings({ schema: 'org.gnome.settings-daemon.peripherals.touchscreen' });
|
this._orientationSettings = new Gio.Settings({ schema_id: 'org.gnome.settings-daemon.peripherals.touchscreen' });
|
||||||
|
|
||||||
this._session = new GnomeSession.SessionManager();
|
this._session = new GnomeSession.SessionManager();
|
||||||
this._loginManager = LoginManager.getLoginManager();
|
this._loginManager = LoginManager.getLoginManager();
|
||||||
@ -151,11 +151,11 @@ const Indicator = new Lang.Class({
|
|||||||
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
Gio.DBus.session.watch_name('org.gnome.SettingsDaemon.Orientation',
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
Gio.BusNameWatcherFlags.NONE,
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._orentationExists = true;
|
this._orientationExists = true;
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
}),
|
}),
|
||||||
Lang.bind(this, function() {
|
Lang.bind(this, function() {
|
||||||
this._orentationExists = false;
|
this._orientationExists = false;
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
}));
|
}));
|
||||||
this._updateOrientationLock();
|
this._updateOrientationLock();
|
||||||
|
@ -178,19 +178,17 @@ const SwitcherPopup = new Lang.Class({
|
|||||||
return mod(this._selectedIndex - 1, this._items.length);
|
return mod(this._selectedIndex - 1, this._items.length);
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressHandler: function(keysym, backwards, action) {
|
_keyPressHandler: function(keysym, action) {
|
||||||
throw new Error('Not implemented');
|
throw new Error('Not implemented');
|
||||||
},
|
},
|
||||||
|
|
||||||
_keyPressEvent: function(actor, event) {
|
_keyPressEvent: function(actor, event) {
|
||||||
let keysym = event.get_key_symbol();
|
let keysym = event.get_key_symbol();
|
||||||
let event_state = event.get_state();
|
let action = global.display.get_keybinding_action(event.get_key_code(), event.get_state());
|
||||||
let backwards = event_state & Clutter.ModifierType.SHIFT_MASK;
|
|
||||||
let action = global.display.get_keybinding_action(event.get_key_code(), event_state);
|
|
||||||
|
|
||||||
this._disableHover();
|
this._disableHover();
|
||||||
|
|
||||||
if (this._keyPressHandler(keysym, backwards, action) != Clutter.EVENT_PROPAGATE)
|
if (this._keyPressHandler(keysym, action) != Clutter.EVENT_PROPAGATE)
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
|
|
||||||
if (keysym == Clutter.Escape)
|
if (keysym == Clutter.Escape)
|
||||||
|
@ -53,8 +53,10 @@ function _wrapTweening(target, tweeningParameters) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Gtk.Settings.get_default().gtk_enable_animations)
|
if (!Gtk.Settings.get_default().gtk_enable_animations) {
|
||||||
tweeningParameters['time'] = 0.000001;
|
tweeningParameters['time'] = 0.000001;
|
||||||
|
tweeningParameters['delay'] = 0.000001;
|
||||||
|
}
|
||||||
|
|
||||||
_addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted);
|
_addHandler(target, tweeningParameters, 'onComplete', _tweenCompleted);
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this.allowCancel = false;
|
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')) {
|
if (screenSaverSettings.get_boolean('user-switch-enabled')) {
|
||||||
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
|
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
|
||||||
style_class: 'login-dialog-not-listed-label' });
|
style_class: 'login-dialog-not-listed-label' });
|
||||||
|
@ -19,6 +19,8 @@ const Search = imports.ui.search;
|
|||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const WorkspacesView = imports.ui.workspacesView;
|
const WorkspacesView = imports.ui.workspacesView;
|
||||||
|
const EdgeDragAction = imports.ui.edgeDragAction;
|
||||||
|
const IconGrid = imports.ui.iconGrid;
|
||||||
|
|
||||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
||||||
|
|
||||||
@ -49,13 +51,74 @@ function getTermsForSearchString(searchString) {
|
|||||||
return terms;
|
return terms;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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({
|
const ViewSelector = new Lang.Class({
|
||||||
Name: 'ViewSelector',
|
Name: 'ViewSelector',
|
||||||
|
|
||||||
_init : function(searchEntry, showAppsButton) {
|
_init : function(searchEntry, showAppsButton) {
|
||||||
this.actor = new Shell.Stack({ name: 'viewSelector' });
|
this.actor = new Shell.Stack({ name: 'viewSelector' });
|
||||||
|
|
||||||
this._showAppsBlocked = false;
|
|
||||||
this._showAppsButton = showAppsButton;
|
this._showAppsButton = showAppsButton;
|
||||||
this._showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled));
|
this._showAppsButton.connect('notify::checked', Lang.bind(this, this._onShowAppsButtonToggled));
|
||||||
|
|
||||||
@ -83,10 +146,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
icon_name: 'edit-find-symbolic' }));
|
icon_name: 'edit-find-symbolic' }));
|
||||||
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
if (this._entry.get_text_direction() == Clutter.TextDirection.RTL)
|
||||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
||||||
icon_name: 'edit-clear-rtl-symbolic' });
|
icon_name: 'edit-clear-symbolic-rtl' });
|
||||||
else
|
else
|
||||||
this._clearIcon = new St.Icon({ style_class: 'search-entry-icon',
|
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._iconClickedId = 0;
|
||||||
this._capturedEventId = 0;
|
this._capturedEventId = 0;
|
||||||
@ -118,58 +181,91 @@ const ViewSelector = new Lang.Class({
|
|||||||
this._stageKeyPressId = 0;
|
this._stageKeyPressId = 0;
|
||||||
Main.overview.connect('showing', Lang.bind(this,
|
Main.overview.connect('showing', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
this._resetShowAppsButton();
|
|
||||||
this._stageKeyPressId = global.stage.connect('key-press-event',
|
this._stageKeyPressId = global.stage.connect('key-press-event',
|
||||||
Lang.bind(this, this._onStageKeyPress));
|
Lang.bind(this, this._onStageKeyPress));
|
||||||
}));
|
}));
|
||||||
Main.overview.connect('hiding', Lang.bind(this,
|
Main.overview.connect('hiding', Lang.bind(this,
|
||||||
function () {
|
function () {
|
||||||
this._resetShowAppsButton();
|
|
||||||
if (this._stageKeyPressId != 0) {
|
if (this._stageKeyPressId != 0) {
|
||||||
global.stage.disconnect(this._stageKeyPressId);
|
global.stage.disconnect(this._stageKeyPressId);
|
||||||
this._stageKeyPressId = 0;
|
this._stageKeyPressId = 0;
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
Main.overview.connect('shown', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
// If we were animating from the desktop view to the
|
||||||
|
// apps page the workspace page was visible, allowing
|
||||||
|
// the windows to animate, but now we no longer want to
|
||||||
|
// show it given that we are now on the apps page or
|
||||||
|
// search page.
|
||||||
|
if (this._activePage != this._workspacesPage)
|
||||||
|
this._workspacesPage.opacity = 0;
|
||||||
|
}));
|
||||||
|
|
||||||
Main.wm.addKeybinding('toggle-application-view',
|
Main.wm.addKeybinding('toggle-application-view',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._toggleAppsPage));
|
Lang.bind(this, this._toggleAppsPage));
|
||||||
|
|
||||||
Main.wm.addKeybinding('toggle-overview',
|
Main.wm.addKeybinding('toggle-overview',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.OVERVIEW,
|
Shell.KeyBindingMode.OVERVIEW,
|
||||||
Lang.bind(Main.overview, Main.overview.toggle));
|
Lang.bind(Main.overview, Main.overview.toggle));
|
||||||
|
|
||||||
|
let gesture;
|
||||||
|
|
||||||
|
gesture = new EdgeDragAction.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() {
|
_toggleAppsPage: function() {
|
||||||
Main.overview.show();
|
|
||||||
this._showAppsButton.checked = !this._showAppsButton.checked;
|
this._showAppsButton.checked = !this._showAppsButton.checked;
|
||||||
|
Main.overview.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
showApps: function() {
|
showApps: function() {
|
||||||
Main.overview.show();
|
|
||||||
this._showAppsButton.checked = true;
|
this._showAppsButton.checked = true;
|
||||||
|
Main.overview.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
this._workspacesDisplay.show(this._showAppsButton.checked);
|
||||||
this._workspacesDisplay.show();
|
|
||||||
this._activePage = null;
|
this._activePage = null;
|
||||||
this._showPage(this._workspacesPage);
|
if (this._showAppsButton.checked)
|
||||||
|
this._showPage(this._appsPage);
|
||||||
|
else
|
||||||
|
this._showPage(this._workspacesPage);
|
||||||
|
|
||||||
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
||||||
Main.overview.fadeOutDesktop();
|
Main.overview.fadeOutDesktop();
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomFromOverview: function() {
|
animateFromOverview: function() {
|
||||||
this._workspacesDisplay.zoomFromOverview();
|
// Make sure workspace page is fully visible to allow
|
||||||
|
// workspace.js do the animation of the windows
|
||||||
|
this._workspacesPage.opacity = 255;
|
||||||
|
|
||||||
|
this._workspacesDisplay.animateFromOverview(this._activePage != this._workspacesPage);
|
||||||
|
|
||||||
|
this._showAppsButton.checked = false;
|
||||||
|
|
||||||
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
if (!this._workspacesDisplay.activeWorkspaceHasMaximizedWindows())
|
||||||
Main.overview.fadeInDesktop();
|
Main.overview.fadeInDesktop();
|
||||||
@ -206,21 +302,61 @@ const ViewSelector = new Lang.Class({
|
|||||||
return page;
|
return page;
|
||||||
},
|
},
|
||||||
|
|
||||||
_fadePageIn: function(oldPage) {
|
_fadePageIn: function() {
|
||||||
|
Tweener.addTween(this._activePage,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad'
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_fadePageOut: function(page) {
|
||||||
|
let oldPage = page;
|
||||||
|
Tweener.addTween(page,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: Lang.bind(this, function() {
|
||||||
|
this._animateIn(oldPage);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_animateIn: function(oldPage) {
|
||||||
if (oldPage)
|
if (oldPage)
|
||||||
oldPage.hide();
|
oldPage.hide();
|
||||||
|
|
||||||
this.emit('page-empty');
|
this.emit('page-empty');
|
||||||
|
|
||||||
this._activePage.show();
|
this._activePage.show();
|
||||||
Tweener.addTween(this._activePage,
|
|
||||||
{ opacity: 255,
|
if (this._activePage == this._appsPage && oldPage == this._workspacesPage) {
|
||||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
// Restore opacity, in case we animated via _fadePageOut
|
||||||
transition: 'easeOutQuad'
|
this._activePage.opacity = 255;
|
||||||
});
|
this.appDisplay.animate(IconGrid.AnimationDirection.IN);
|
||||||
|
} else {
|
||||||
|
this._fadePageIn();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_showPage: function(page, noFade) {
|
_animateOut: function(page) {
|
||||||
|
let oldPage = page;
|
||||||
|
if (page == this._appsPage &&
|
||||||
|
this._activePage == this._workspacesPage &&
|
||||||
|
!Main.overview.animationInProgress) {
|
||||||
|
this.appDisplay.animate(IconGrid.AnimationDirection.OUT, Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._animateIn(oldPage)
|
||||||
|
}));
|
||||||
|
} else {
|
||||||
|
this._fadePageOut(page);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_showPage: function(page) {
|
||||||
|
if (!Main.overview.visible)
|
||||||
|
return;
|
||||||
|
|
||||||
if (page == this._activePage)
|
if (page == this._activePage)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -228,18 +364,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
this._activePage = page;
|
this._activePage = page;
|
||||||
this.emit('page-changed');
|
this.emit('page-changed');
|
||||||
|
|
||||||
if (oldPage && !noFade)
|
if (oldPage)
|
||||||
Tweener.addTween(oldPage,
|
this._animateOut(oldPage)
|
||||||
{ opacity: 0,
|
|
||||||
time: OverviewControls.SIDE_CONTROLS_ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._fadePageIn(oldPage);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
else
|
else
|
||||||
this._fadePageIn(oldPage);
|
this._animateIn();
|
||||||
},
|
},
|
||||||
|
|
||||||
_a11yFocusPage: function(page) {
|
_a11yFocusPage: function(page) {
|
||||||
@ -248,21 +376,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onShowAppsButtonToggled: function() {
|
_onShowAppsButtonToggled: function() {
|
||||||
if (this._showAppsBlocked)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._showPage(this._showAppsButton.checked ?
|
this._showPage(this._showAppsButton.checked ?
|
||||||
this._appsPage : this._workspacesPage);
|
this._appsPage : this._workspacesPage);
|
||||||
},
|
},
|
||||||
|
|
||||||
_resetShowAppsButton: function() {
|
|
||||||
this._showAppsBlocked = true;
|
|
||||||
this._showAppsButton.checked = false;
|
|
||||||
this._showAppsBlocked = false;
|
|
||||||
|
|
||||||
this._showPage(this._workspacesPage, true);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onStageKeyPress: function(actor, event) {
|
_onStageKeyPress: function(actor, event) {
|
||||||
// Ignore events while anything but the overview has
|
// Ignore events while anything but the overview has
|
||||||
// pushed a modal (system modals, looking glass, ...)
|
// pushed a modal (system modals, looking glass, ...)
|
||||||
@ -285,10 +402,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
} else if (!this._searchActive && !global.stage.key_focus) {
|
} else if (!this._searchActive && !global.stage.key_focus) {
|
||||||
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
if (symbol == Clutter.Tab || symbol == Clutter.Down) {
|
||||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
|
||||||
return true;
|
return Clutter.EVENT_STOP;
|
||||||
} else if (symbol == Clutter.ISO_Left_Tab) {
|
} else if (symbol == Clutter.ISO_Left_Tab) {
|
||||||
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
|
this._activePage.navigate_focus(null, Gtk.DirectionType.TAB_BACKWARD, false);
|
||||||
return true;
|
return Clutter.EVENT_STOP;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Clutter.EVENT_PROPAGATE;
|
return Clutter.EVENT_PROPAGATE;
|
||||||
@ -358,7 +475,10 @@ const ViewSelector = new Lang.Class({
|
|||||||
|
|
||||||
startSearch: function(event) {
|
startSearch: function(event) {
|
||||||
global.stage.set_key_focus(this._text);
|
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
|
// the entry does not show the hint
|
||||||
|
@ -9,6 +9,7 @@ const Meta = imports.gi.Meta;
|
|||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const AltTab = imports.ui.altTab;
|
const AltTab = imports.ui.altTab;
|
||||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||||
@ -18,6 +19,13 @@ const Tweener = imports.ui.tweener;
|
|||||||
const WindowMenu = imports.ui.windowMenu;
|
const WindowMenu = imports.ui.windowMenu;
|
||||||
|
|
||||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
||||||
|
const MAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
|
||||||
|
const UNMAXIMIZE_WINDOW_ANIMATION_TIME = 0.15;
|
||||||
|
const MINIMIZE_WINDOW_ANIMATION_TIME = 0.2;
|
||||||
|
const SHOW_WINDOW_ANIMATION_TIME = 0.15;
|
||||||
|
const DIALOG_SHOW_WINDOW_ANIMATION_TIME = 0.1;
|
||||||
|
const DESTROY_WINDOW_ANIMATION_TIME = 0.15;
|
||||||
|
const DIALOG_DESTROY_WINDOW_ANIMATION_TIME = 0.1;
|
||||||
const WINDOW_ANIMATION_TIME = 0.25;
|
const WINDOW_ANIMATION_TIME = 0.25;
|
||||||
const DIM_BRIGHTNESS = -0.3;
|
const DIM_BRIGHTNESS = -0.3;
|
||||||
const DIM_TIME = 0.500;
|
const DIM_TIME = 0.500;
|
||||||
@ -199,12 +207,19 @@ const WorkspaceTracker = new Lang.Class({
|
|||||||
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
|
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
|
||||||
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
|
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
|
||||||
|
|
||||||
this._workspaceSettings = new Gio.Settings({ schema: Main.dynamicWorkspacesSchema });
|
this._workspaceSettings = this._getWorkspaceSettings();
|
||||||
this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
|
this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
|
||||||
|
|
||||||
this._nWorkspacesChanged();
|
this._nWorkspacesChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_getWorkspaceSettings: function() {
|
||||||
|
let settings = global.get_overrides_settings();
|
||||||
|
if (settings.list_keys().indexOf('dynamic-workspaces') > -1)
|
||||||
|
return settings;
|
||||||
|
return new Gio.Settings({ schema_id: 'org.gnome.mutter' });
|
||||||
|
},
|
||||||
|
|
||||||
_checkWorkspaces: function() {
|
_checkWorkspaces: function() {
|
||||||
let i;
|
let i;
|
||||||
let emptyWorkspaces = [];
|
let emptyWorkspaces = [];
|
||||||
@ -449,6 +464,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({
|
const WindowManager = new Lang.Class({
|
||||||
Name: 'WindowManager',
|
Name: 'WindowManager',
|
||||||
|
|
||||||
@ -648,13 +772,13 @@ const WindowManager = new Lang.Class({
|
|||||||
Lang.bind(this, this._startA11ySwitcher));
|
Lang.bind(this, this._startA11ySwitcher));
|
||||||
|
|
||||||
this.addKeybinding('pause-resume-tweens',
|
this.addKeybinding('pause-resume-tweens',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.ALL,
|
Shell.KeyBindingMode.ALL,
|
||||||
Lang.bind(this, this._toggleTweens));
|
Lang.bind(this, this._toggleTweens));
|
||||||
|
|
||||||
this.addKeybinding('open-application-menu',
|
this.addKeybinding('open-application-menu',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema_id: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Shell.KeyBindingMode.NORMAL |
|
Shell.KeyBindingMode.NORMAL |
|
||||||
Shell.KeyBindingMode.TOPBAR_POPUP,
|
Shell.KeyBindingMode.TOPBAR_POPUP,
|
||||||
@ -676,6 +800,53 @@ const WindowManager = new Lang.Class({
|
|||||||
|
|
||||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||||
false, -1, 1);
|
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) {
|
keepWorkspaceAlive: function(workspace, duration) {
|
||||||
@ -710,12 +881,12 @@ const WindowManager = new Lang.Class({
|
|||||||
return !Main.overview.visible;
|
return !Main.overview.visible;
|
||||||
},
|
},
|
||||||
|
|
||||||
_shouldAnimateActor: function(actor) {
|
_shouldAnimateActor: function(actor, types) {
|
||||||
if (!this._shouldAnimate())
|
if (!this._shouldAnimate())
|
||||||
return false;
|
return false;
|
||||||
let windowType = actor.meta_window.get_window_type();
|
|
||||||
return windowType == Meta.WindowType.NORMAL ||
|
let type = actor.meta_window.get_window_type();
|
||||||
windowType == Meta.WindowType.MODAL_DIALOG;
|
return types.indexOf(type) >= 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
_removeEffect : function(list, actor) {
|
_removeEffect : function(list, actor) {
|
||||||
@ -728,7 +899,10 @@ const WindowManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_minimizeWindow : function(shellwm, actor) {
|
_minimizeWindow : function(shellwm, actor) {
|
||||||
if (!this._shouldAnimateActor(actor)) {
|
let types = [Meta.WindowType.NORMAL,
|
||||||
|
Meta.WindowType.MODAL_DIALOG,
|
||||||
|
Meta.WindowType.DIALOG];
|
||||||
|
if (!this._shouldAnimateActor(actor, types)) {
|
||||||
shellwm.completed_minimize(actor);
|
shellwm.completed_minimize(actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -740,7 +914,7 @@ const WindowManager = new Lang.Class({
|
|||||||
if (actor.meta_window.is_monitor_sized()) {
|
if (actor.meta_window.is_monitor_sized()) {
|
||||||
Tweener.addTween(actor,
|
Tweener.addTween(actor,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
time: WINDOW_ANIMATION_TIME,
|
time: MINIMIZE_WINDOW_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: this._minimizeWindowDone,
|
onComplete: this._minimizeWindowDone,
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
@ -772,8 +946,8 @@ const WindowManager = new Lang.Class({
|
|||||||
scale_y: yScale,
|
scale_y: yScale,
|
||||||
x: xDest,
|
x: xDest,
|
||||||
y: yDest,
|
y: yDest,
|
||||||
time: WINDOW_ANIMATION_TIME,
|
time: MINIMIZE_WINDOW_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeInExpo',
|
||||||
onComplete: this._minimizeWindowDone,
|
onComplete: this._minimizeWindowDone,
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
onCompleteParams: [shellwm, actor],
|
onCompleteParams: [shellwm, actor],
|
||||||
@ -789,7 +963,7 @@ const WindowManager = new Lang.Class({
|
|||||||
Tweener.removeTweens(actor);
|
Tweener.removeTweens(actor);
|
||||||
actor.set_scale(1.0, 1.0);
|
actor.set_scale(1.0, 1.0);
|
||||||
actor.set_opacity(255);
|
actor.set_opacity(255);
|
||||||
actor.move_anchor_point_from_gravity(Clutter.Gravity.NORTH_WEST);
|
actor.set_pivot_point(0, 0);
|
||||||
|
|
||||||
shellwm.completed_minimize(actor);
|
shellwm.completed_minimize(actor);
|
||||||
}
|
}
|
||||||
@ -887,7 +1061,10 @@ const WindowManager = new Lang.Class({
|
|||||||
actor._windowType = type;
|
actor._windowType = type;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
if (!this._shouldAnimateActor(actor)) {
|
let types = [Meta.WindowType.NORMAL,
|
||||||
|
Meta.WindowType.DIALOG,
|
||||||
|
Meta.WindowType.MODAL_DIALOG];
|
||||||
|
if (!this._shouldAnimateActor(actor, types)) {
|
||||||
shellwm.completed_map(actor);
|
shellwm.completed_map(actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -895,15 +1072,23 @@ const WindowManager = new Lang.Class({
|
|||||||
if (actor.meta_window.is_attached_dialog()) {
|
if (actor.meta_window.is_attached_dialog()) {
|
||||||
/* Scale the window from the center of the parent */
|
/* Scale the window from the center of the parent */
|
||||||
this._checkDimming(actor.get_meta_window().get_transient_for());
|
this._checkDimming(actor.get_meta_window().get_transient_for());
|
||||||
actor.set_scale(1.0, 0.0);
|
}
|
||||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
|
||||||
|
switch (actor._windowType) {
|
||||||
|
case Meta.WindowType.NORMAL:
|
||||||
|
actor.set_pivot_point(0.5, 1.0);
|
||||||
|
actor.scale_x = 0.01;
|
||||||
|
actor.scale_y = 0.05;
|
||||||
|
actor.opacity = 0;
|
||||||
actor.show();
|
actor.show();
|
||||||
this._mapping.push(actor);
|
this._mapping.push(actor);
|
||||||
|
|
||||||
Tweener.addTween(actor,
|
Tweener.addTween(actor,
|
||||||
{ scale_y: 1,
|
{ opacity: 255,
|
||||||
time: WINDOW_ANIMATION_TIME,
|
scale_x: 1,
|
||||||
transition: "easeOutQuad",
|
scale_y: 1,
|
||||||
|
time: SHOW_WINDOW_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutExpo',
|
||||||
onComplete: this._mapWindowDone,
|
onComplete: this._mapWindowDone,
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
onCompleteParams: [shellwm, actor],
|
onCompleteParams: [shellwm, actor],
|
||||||
@ -911,15 +1096,20 @@ const WindowManager = new Lang.Class({
|
|||||||
onOverwriteScope: this,
|
onOverwriteScope: this,
|
||||||
onOverwriteParams: [shellwm, actor]
|
onOverwriteParams: [shellwm, actor]
|
||||||
});
|
});
|
||||||
} else {
|
break;
|
||||||
/* Fade window in */
|
case Meta.WindowType.MODAL_DIALOG:
|
||||||
|
case Meta.WindowType.DIALOG:
|
||||||
|
actor.set_pivot_point(0.5, 0.5);
|
||||||
|
actor.scale_y = 0;
|
||||||
actor.opacity = 0;
|
actor.opacity = 0;
|
||||||
actor.show();
|
actor.show();
|
||||||
this._mapping.push(actor);
|
this._mapping.push(actor);
|
||||||
|
|
||||||
Tweener.addTween(actor,
|
Tweener.addTween(actor,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
time: WINDOW_ANIMATION_TIME,
|
scale_x: 1,
|
||||||
|
scale_y: 1,
|
||||||
|
time: DIALOG_SHOW_WINDOW_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
onComplete: this._mapWindowDone,
|
onComplete: this._mapWindowDone,
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
@ -928,6 +1118,10 @@ const WindowManager = new Lang.Class({
|
|||||||
onOverwriteScope: this,
|
onOverwriteScope: this,
|
||||||
onOverwriteParams: [shellwm, actor]
|
onOverwriteParams: [shellwm, actor]
|
||||||
});
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
shellwm.completed_map(actor);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -935,7 +1129,11 @@ const WindowManager = new Lang.Class({
|
|||||||
if (this._removeEffect(this._mapping, actor)) {
|
if (this._removeEffect(this._mapping, actor)) {
|
||||||
Tweener.removeTweens(actor);
|
Tweener.removeTweens(actor);
|
||||||
actor.opacity = 255;
|
actor.opacity = 255;
|
||||||
|
actor.set_pivot_point(0, 0);
|
||||||
actor.scale_y = 1;
|
actor.scale_y = 1;
|
||||||
|
actor.scale_x = 1;
|
||||||
|
actor.translation_y = 0;
|
||||||
|
actor.translation_x = 0;
|
||||||
shellwm.completed_map(actor);
|
shellwm.completed_map(actor);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -958,30 +1156,25 @@ const WindowManager = new Lang.Class({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this._shouldAnimateActor(actor)) {
|
let types = [Meta.WindowType.NORMAL,
|
||||||
|
Meta.WindowType.DIALOG,
|
||||||
|
Meta.WindowType.MODAL_DIALOG];
|
||||||
|
if (!this._shouldAnimateActor(actor, types)) {
|
||||||
shellwm.completed_destroy(actor);
|
shellwm.completed_destroy(actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._destroying.push(actor);
|
switch (actor._windowType) {
|
||||||
|
case Meta.WindowType.NORMAL:
|
||||||
if (window.is_attached_dialog()) {
|
actor.set_pivot_point(0.5, 0.5);
|
||||||
let parent = window.get_transient_for();
|
this._destroying.push(actor);
|
||||||
this._checkDimming(parent, window);
|
|
||||||
|
|
||||||
actor.set_scale(1.0, 1.0);
|
|
||||||
actor.scale_gravity = Clutter.Gravity.CENTER;
|
|
||||||
actor.show();
|
|
||||||
|
|
||||||
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
|
||||||
Tweener.removeTweens(actor);
|
|
||||||
this._destroyWindowDone(shellwm, actor);
|
|
||||||
}));
|
|
||||||
|
|
||||||
Tweener.addTween(actor,
|
Tweener.addTween(actor,
|
||||||
{ scale_y: 0,
|
{ opacity: 0,
|
||||||
time: WINDOW_ANIMATION_TIME,
|
scale_x: 0.8,
|
||||||
transition: "easeOutQuad",
|
scale_y: 0.8,
|
||||||
|
time: DESTROY_WINDOW_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
onComplete: this._destroyWindowDone,
|
onComplete: this._destroyWindowDone,
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
onCompleteParams: [shellwm, actor],
|
onCompleteParams: [shellwm, actor],
|
||||||
@ -989,9 +1182,37 @@ const WindowManager = new Lang.Class({
|
|||||||
onOverwriteScope: this,
|
onOverwriteScope: this,
|
||||||
onOverwriteParams: [shellwm, actor]
|
onOverwriteParams: [shellwm, actor]
|
||||||
});
|
});
|
||||||
|
break;
|
||||||
|
case Meta.WindowType.MODAL_DIALOG:
|
||||||
|
case Meta.WindowType.DIALOG:
|
||||||
|
actor.set_pivot_point(0.5, 0.5);
|
||||||
|
this._destroying.push(actor);
|
||||||
|
|
||||||
|
if (window.is_attached_dialog()) {
|
||||||
|
let parent = window.get_transient_for();
|
||||||
|
this._checkDimming(parent, window);
|
||||||
|
actor._parentDestroyId = parent.connect('unmanaged', Lang.bind(this, function () {
|
||||||
|
Tweener.removeTweens(actor);
|
||||||
|
this._destroyWindowDone(shellwm, actor);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
Tweener.addTween(actor,
|
||||||
|
{ scale_y: 0,
|
||||||
|
time: DIALOG_DESTROY_WINDOW_ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: this._destroyWindowDone,
|
||||||
|
onCompleteScope: this,
|
||||||
|
onCompleteParams: [shellwm, actor],
|
||||||
|
onOverwrite: this._destroyWindowDone,
|
||||||
|
onOverwriteScope: this,
|
||||||
|
onOverwriteParams: [shellwm, actor]
|
||||||
|
});
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
shellwm.completed_destroy(actor);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
shellwm.completed_destroy(actor);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_destroyWindowDone : function(shellwm, actor) {
|
_destroyWindowDone : function(shellwm, actor) {
|
||||||
@ -1164,9 +1385,7 @@ const WindowManager = new Lang.Class({
|
|||||||
|
|
||||||
let tabPopup = new AltTab.AppSwitcherPopup();
|
let tabPopup = new AltTab.AppSwitcherPopup();
|
||||||
|
|
||||||
let modifiers = binding.get_modifiers();
|
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
|
||||||
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
|
|
||||||
tabPopup.destroy();
|
tabPopup.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1177,16 +1396,12 @@ const WindowManager = new Lang.Class({
|
|||||||
|
|
||||||
let tabPopup = new AltTab.WindowSwitcherPopup();
|
let tabPopup = new AltTab.WindowSwitcherPopup();
|
||||||
|
|
||||||
let modifiers = binding.get_modifiers();
|
if (!tabPopup.show(binding.is_reversed(), binding.get_name(), binding.get_mask()))
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
|
||||||
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
|
|
||||||
tabPopup.destroy();
|
tabPopup.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
_startA11ySwitcher : function(display, screen, window, binding) {
|
_startA11ySwitcher : function(display, screen, window, binding) {
|
||||||
let modifiers = binding.get_modifiers();
|
Main.ctrlAltTabManager.popup(binding.is_reversed(), binding.get_name(), binding.get_mask());
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
|
||||||
Main.ctrlAltTabManager.popup(backwards, binding.get_name(), binding.get_mask());
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_toggleAppMenu : function(display, screen, window, event, binding) {
|
_toggleAppMenu : function(display, screen, window, event, binding) {
|
||||||
|
@ -34,6 +34,8 @@ const DRAGGING_WINDOW_OPACITY = 100;
|
|||||||
const LAYOUT_SCALE_WEIGHT = 1;
|
const LAYOUT_SCALE_WEIGHT = 1;
|
||||||
const LAYOUT_SPACE_WEIGHT = 0.1;
|
const LAYOUT_SPACE_WEIGHT = 0.1;
|
||||||
|
|
||||||
|
const WINDOW_ANIMATION_MAX_NUMBER_BLENDING = 3;
|
||||||
|
|
||||||
function _interpolate(start, end, step) {
|
function _interpolate(start, end, step) {
|
||||||
return start + (end - start) * step;
|
return start + (end - start) * step;
|
||||||
}
|
}
|
||||||
@ -67,7 +69,7 @@ const WindowCloneLayout = new Lang.Class({
|
|||||||
// paradoxically is the smaller rectangle, containing the positions
|
// paradoxically is the smaller rectangle, containing the positions
|
||||||
// of the visible frame. The input rect contains everything,
|
// of the visible frame. The input rect contains everything,
|
||||||
// including the invisible border padding.
|
// including the invisible border padding.
|
||||||
let inputRect = window.get_input_rect();
|
let inputRect = window.get_buffer_rect();
|
||||||
|
|
||||||
let box = new Clutter.ActorBox();
|
let box = new Clutter.ActorBox();
|
||||||
|
|
||||||
@ -87,7 +89,7 @@ const WindowCloneLayout = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
vfunc_allocate: function(container, box, flags) {
|
vfunc_allocate: function(container, box, flags) {
|
||||||
let clone = container.get_children().forEach(function (child) {
|
container.get_children().forEach(Lang.bind(this, function (child) {
|
||||||
let realWindow;
|
let realWindow;
|
||||||
if (child == container._delegate._windowClone)
|
if (child == container._delegate._windowClone)
|
||||||
realWindow = container._delegate.realWindow;
|
realWindow = container._delegate.realWindow;
|
||||||
@ -96,8 +98,8 @@ const WindowCloneLayout = new Lang.Class({
|
|||||||
|
|
||||||
child.allocate(this._makeBoxForWindow(realWindow.meta_window),
|
child.allocate(this._makeBoxForWindow(realWindow.meta_window),
|
||||||
flags);
|
flags);
|
||||||
}, this);
|
}));
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const WindowClone = new Lang.Class({
|
const WindowClone = new Lang.Class({
|
||||||
@ -239,6 +241,14 @@ const WindowClone = new Lang.Class({
|
|||||||
return this._boundingBox;
|
return this._boundingBox;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get width() {
|
||||||
|
return this._boundingBox.width;
|
||||||
|
},
|
||||||
|
|
||||||
|
get height() {
|
||||||
|
return this._boundingBox.height;
|
||||||
|
},
|
||||||
|
|
||||||
getOriginalPosition: function() {
|
getOriginalPosition: function() {
|
||||||
return [this._boundingBox.x, this._boundingBox.y];
|
return [this._boundingBox.x, this._boundingBox.y];
|
||||||
},
|
},
|
||||||
@ -257,7 +267,8 @@ const WindowClone = new Lang.Class({
|
|||||||
rect = rect.union(metaWindow.get_outer_rect());
|
rect = rect.union(metaWindow.get_outer_rect());
|
||||||
}, this);
|
}, 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;
|
this.actor.layout_manager.boundingBox = rect;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -508,6 +519,7 @@ const WindowOverlay = new Lang.Class({
|
|||||||
|
|
||||||
Tweener.removeTweens(button);
|
Tweener.removeTweens(button);
|
||||||
Tweener.removeTweens(border);
|
Tweener.removeTweens(border);
|
||||||
|
Tweener.removeTweens(title);
|
||||||
|
|
||||||
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
||||||
|
|
||||||
@ -832,7 +844,7 @@ const LayoutStrategy = new Lang.Class({
|
|||||||
// thumbnails is much more important to preserve than the width of
|
// thumbnails is much more important to preserve than the width of
|
||||||
// them, so two windows with equal height, but maybe differering
|
// them, so two windows with equal height, but maybe differering
|
||||||
// widths line up.
|
// 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
|
// The purpose of this manipulation here is to prevent windows
|
||||||
// from getting too small. For something like a calculator window,
|
// from getting too small. For something like a calculator window,
|
||||||
@ -934,11 +946,11 @@ const LayoutStrategy = new Lang.Class({
|
|||||||
let window = row.windows[j];
|
let window = row.windows[j];
|
||||||
|
|
||||||
let s = scale * this._computeWindowScale(window) * row.additionalScale;
|
let s = scale * this._computeWindowScale(window) * row.additionalScale;
|
||||||
let cellWidth = window.actor.width * s;
|
let cellWidth = window.width * s;
|
||||||
let cellHeight = window.actor.height * s;
|
let cellHeight = window.height * s;
|
||||||
|
|
||||||
s = Math.min(s, WINDOW_CLONE_MAXIMUM_SCALE);
|
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 cloneX = x + (cellWidth - cloneWidth) / 2;
|
||||||
let cloneY = row.y + row.height - cellHeight;
|
let cloneY = row.y + row.height - cellHeight;
|
||||||
@ -992,7 +1004,7 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
|||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
let window = windows[i];
|
let window = windows[i];
|
||||||
let s = this._computeWindowScale(window);
|
let s = this._computeWindowScale(window);
|
||||||
totalWidth += window.actor.width * s;
|
totalWidth += window.width * s;
|
||||||
}
|
}
|
||||||
|
|
||||||
let idealRowWidth = totalWidth / numRows;
|
let idealRowWidth = totalWidth / numRows;
|
||||||
@ -1005,8 +1017,8 @@ const UnalignedLayoutStrategy = new Lang.Class({
|
|||||||
for (; windowIdx < windows.length; windowIdx++) {
|
for (; windowIdx < windows.length; windowIdx++) {
|
||||||
let window = windows[windowIdx];
|
let window = windows[windowIdx];
|
||||||
let s = this._computeWindowScale(window);
|
let s = this._computeWindowScale(window);
|
||||||
let width = window.actor.width * s;
|
let width = window.width * s;
|
||||||
let height = window.actor.height * s;
|
let height = window.height * s;
|
||||||
row.fullHeight = Math.max(row.fullHeight, height);
|
row.fullHeight = Math.max(row.fullHeight, height);
|
||||||
|
|
||||||
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
// either new width is < idealWidth or new width is nearer from idealWidth then oldWidth
|
||||||
@ -1131,6 +1143,11 @@ const Workspace = new Lang.Class({
|
|||||||
|
|
||||||
this._positionWindowsFlags = 0;
|
this._positionWindowsFlags = 0;
|
||||||
this._positionWindowsId = 0;
|
this._positionWindowsId = 0;
|
||||||
|
|
||||||
|
this.actor.connect('notify::mapped', Lang.bind(this, function() {
|
||||||
|
if (this.actor.mapped)
|
||||||
|
this._syncActualGeometry();
|
||||||
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
setFullGeometry: function(geom) {
|
setFullGeometry: function(geom) {
|
||||||
@ -1138,7 +1155,9 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._fullGeometry = geom;
|
this._fullGeometry = geom;
|
||||||
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
|
||||||
|
if (this.actor.mapped)
|
||||||
|
this._recalculateWindowPositions(WindowPositionFlags.NONE);
|
||||||
},
|
},
|
||||||
|
|
||||||
setActualGeometry: function(geom) {
|
setActualGeometry: function(geom) {
|
||||||
@ -1146,18 +1165,29 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this._actualGeometry = geom;
|
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;
|
return;
|
||||||
|
|
||||||
this._actualGeometryLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() {
|
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;
|
let geom = this._actualGeometry;
|
||||||
|
|
||||||
this._dropRect.set_position(geom.x, geom.y);
|
this._dropRect.set_position(geom.x, geom.y);
|
||||||
this._dropRect.set_size(geom.width, geom.height);
|
this._dropRect.set_size(geom.width, geom.height);
|
||||||
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
this._updateWindowPositions(Main.overview.animationInProgress ? WindowPositionFlags.ANIMATE : WindowPositionFlags.NONE);
|
||||||
|
|
||||||
this._actualGeometryLater = 0;
|
|
||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@ -1231,6 +1261,13 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We will reposition windows anyway when enter again overview or when ending the windows
|
||||||
|
// animations whith fade animation.
|
||||||
|
// In this way we avoid unwanted animations of windows repositioning while
|
||||||
|
// animating overview.
|
||||||
|
if (this.leavingOverview || this._animatingWindowsFade)
|
||||||
|
return;
|
||||||
|
|
||||||
let initialPositioning = flags & WindowPositionFlags.INITIAL;
|
let initialPositioning = flags & WindowPositionFlags.INITIAL;
|
||||||
let animate = flags & WindowPositionFlags.ANIMATE;
|
let animate = flags & WindowPositionFlags.ANIMATE;
|
||||||
|
|
||||||
@ -1293,7 +1330,7 @@ const Workspace = new Lang.Class({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
this._animateClone(clone, overlay, x, y, scale, initialPositioning);
|
this._animateClone(clone, overlay, x, y, scale);
|
||||||
} else {
|
} else {
|
||||||
// cancel any active tweens (otherwise they might override our changes)
|
// cancel any active tweens (otherwise they might override our changes)
|
||||||
Tweener.removeTweens(clone.actor);
|
Tweener.removeTweens(clone.actor);
|
||||||
@ -1322,7 +1359,7 @@ const Workspace = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateClone: function(clone, overlay, x, y, scale, initialPositioning) {
|
_animateClone: function(clone, overlay, x, y, scale) {
|
||||||
Tweener.addTween(clone.actor,
|
Tweener.addTween(clone.actor,
|
||||||
{ x: x,
|
{ x: x,
|
||||||
y: y,
|
y: y,
|
||||||
@ -1380,10 +1417,6 @@ const Workspace = new Lang.Class({
|
|||||||
if (index == -1)
|
if (index == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if window still should be here
|
|
||||||
if (win && this._isMyWindow(win))
|
|
||||||
return;
|
|
||||||
|
|
||||||
let clone = this._windows[index];
|
let clone = this._windows[index];
|
||||||
|
|
||||||
this._windows.splice(index, 1);
|
this._windows.splice(index, 1);
|
||||||
@ -1529,14 +1562,141 @@ const Workspace = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Animate the full-screen to Overview transition.
|
fadeToOverview: function() {
|
||||||
zoomToOverview : function() {
|
// We don't want to reposition windows while animating in this way.
|
||||||
|
this._animatingWindowsFade = true;
|
||||||
|
this._overviewShownId = Main.overview.connect('shown', Lang.bind(this,
|
||||||
|
this._doneShowingOverview));
|
||||||
|
if (this._windows.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Special case maximized windows, since it doesn't make sense
|
||||||
|
// to animate windows below in the stack
|
||||||
|
let topMaximizedWindow;
|
||||||
|
// It is ok to treat the case where there is no maximized
|
||||||
|
// window as if the bottom-most window was maximized given that
|
||||||
|
// it won't affect the result of the animation
|
||||||
|
for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) {
|
||||||
|
let metaWindow = this._windows[topMaximizedWindow].metaWindow;
|
||||||
|
if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow);
|
||||||
|
let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots;
|
||||||
|
|
||||||
|
let topIndex = this._windows.length - 1;
|
||||||
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
|
if (i < topMaximizedWindow) {
|
||||||
|
// below top-most maximized window, don't animate
|
||||||
|
let overlay = this._windowOverlays[i];
|
||||||
|
if (overlay)
|
||||||
|
overlay.hide();
|
||||||
|
this._windows[i].actor.opacity = 0;
|
||||||
|
} else {
|
||||||
|
let fromTop = topIndex - i;
|
||||||
|
let time;
|
||||||
|
if (fromTop < nTimeSlots) // animate top-most windows gradually
|
||||||
|
time = windowBaseTime * (nTimeSlots - fromTop);
|
||||||
|
else
|
||||||
|
time = windowBaseTime;
|
||||||
|
|
||||||
|
this._windows[i].actor.opacity = 255;
|
||||||
|
this._fadeWindow(i, time, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
fadeFromOverview: function() {
|
||||||
|
this.leavingOverview = true;
|
||||||
|
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
|
||||||
|
this._doneLeavingOverview));
|
||||||
|
if (this._windows.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
|
let clone = this._windows[i];
|
||||||
|
Tweener.removeTweens(clone.actor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._repositionWindowsId > 0) {
|
||||||
|
Mainloop.source_remove(this._repositionWindowsId);
|
||||||
|
this._repositionWindowsId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.metaWorkspace != null && this.metaWorkspace != global.screen.get_active_workspace())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Special case maximized windows, since it doesn't make sense
|
||||||
|
// to animate windows below in the stack
|
||||||
|
let topMaximizedWindow;
|
||||||
|
// It is ok to treat the case where there is no maximized
|
||||||
|
// window as if the bottom-most window was maximized given that
|
||||||
|
// it won't affect the result of the animation
|
||||||
|
for (topMaximizedWindow = this._windows.length - 1; topMaximizedWindow > 0; topMaximizedWindow--) {
|
||||||
|
let metaWindow = this._windows[topMaximizedWindow].metaWindow;
|
||||||
|
if (metaWindow.maximized_horizontally && metaWindow.maximized_vertically)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nTimeSlots = Math.min(WINDOW_ANIMATION_MAX_NUMBER_BLENDING + 1, this._windows.length - topMaximizedWindow);
|
||||||
|
let windowBaseTime = Overview.ANIMATION_TIME / nTimeSlots;
|
||||||
|
|
||||||
|
let topIndex = this._windows.length - 1;
|
||||||
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
|
if (i < topMaximizedWindow) {
|
||||||
|
// below top-most maximized window, don't animate
|
||||||
|
let overlay = this._windowOverlays[i];
|
||||||
|
if (overlay)
|
||||||
|
overlay.hide();
|
||||||
|
this._windows[i].actor.opacity = 0;
|
||||||
|
} else {
|
||||||
|
let fromTop = topIndex - i;
|
||||||
|
let time;
|
||||||
|
if (fromTop < nTimeSlots) // animate top-most windows gradually
|
||||||
|
time = windowBaseTime * (fromTop + 1);
|
||||||
|
else
|
||||||
|
time = windowBaseTime * nTimeSlots;
|
||||||
|
|
||||||
|
this._windows[i].actor.opacity = 0;
|
||||||
|
this._fadeWindow(i, time, 255);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_fadeWindow: function(index, time, opacity) {
|
||||||
|
let clone = this._windows[index];
|
||||||
|
let overlay = this._windowOverlays[index];
|
||||||
|
|
||||||
|
if (overlay)
|
||||||
|
overlay.hide();
|
||||||
|
|
||||||
|
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||||
|
let [origX, origY] = clone.getOriginalPosition();
|
||||||
|
clone.actor.scale_x = 1;
|
||||||
|
clone.actor.scale_y = 1;
|
||||||
|
clone.actor.x = origX;
|
||||||
|
clone.actor.y = origY;
|
||||||
|
Tweener.addTween(clone.actor,
|
||||||
|
{ time: time,
|
||||||
|
opacity: opacity,
|
||||||
|
transition: 'easeOutQuad'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// The window is hidden
|
||||||
|
clone.actor.opacity = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
zoomToOverview: function() {
|
||||||
// Position and scale the windows.
|
// Position and scale the windows.
|
||||||
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
|
this._recalculateWindowPositions(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Animates the return from Overview mode
|
zoomFromOverview: function() {
|
||||||
zoomFromOverview : function() {
|
|
||||||
let currentWorkspace = global.screen.get_active_workspace();
|
let currentWorkspace = global.screen.get_active_workspace();
|
||||||
|
|
||||||
this.leavingOverview = true;
|
this.leavingOverview = true;
|
||||||
@ -1557,35 +1717,37 @@ const Workspace = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// Position and scale the windows.
|
// Position and scale the windows.
|
||||||
for (let i = 0; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++)
|
||||||
let clone = this._windows[i];
|
this._zoomWindowFromOverview(i);
|
||||||
let overlay = this._windowOverlays[i];
|
},
|
||||||
|
|
||||||
if (overlay)
|
_zoomWindowFromOverview: function(index) {
|
||||||
overlay.hide();
|
let clone = this._windows[index];
|
||||||
|
let overlay = this._windowOverlays[index];
|
||||||
|
|
||||||
if (clone.metaWindow.showing_on_its_workspace()) {
|
if (overlay)
|
||||||
let [origX, origY] = clone.getOriginalPosition();
|
overlay.hide();
|
||||||
|
|
||||||
Tweener.addTween(clone.actor,
|
if (clone.metaWindow.showing_on_its_workspace()) {
|
||||||
{ x: origX,
|
let [origX, origY] = clone.getOriginalPosition();
|
||||||
y: origY,
|
Tweener.addTween(clone.actor,
|
||||||
scale_x: 1.0,
|
{ x: origX,
|
||||||
scale_y: 1.0,
|
y: origY,
|
||||||
time: Overview.ANIMATION_TIME,
|
scale_x: 1.0,
|
||||||
opacity: 255,
|
scale_y: 1.0,
|
||||||
transition: 'easeOutQuad'
|
time: Overview.ANIMATION_TIME,
|
||||||
});
|
opacity: 255,
|
||||||
} else {
|
transition: 'easeOutQuad'
|
||||||
// The window is hidden, make it shrink and fade it out
|
});
|
||||||
Tweener.addTween(clone.actor,
|
} else {
|
||||||
{ scale_x: 0,
|
// The window is hidden, make it shrink and fade it out
|
||||||
scale_y: 0,
|
Tweener.addTween(clone.actor,
|
||||||
opacity: 0,
|
{ scale_x: 0,
|
||||||
time: Overview.ANIMATION_TIME,
|
scale_y: 0,
|
||||||
transition: 'easeOutQuad'
|
opacity: 0,
|
||||||
});
|
time: Overview.ANIMATION_TIME,
|
||||||
}
|
transition: 'easeOutQuad'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1624,6 +1786,11 @@ const Workspace = new Lang.Class({
|
|||||||
this.leavingOverview = false;
|
this.leavingOverview = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_doneShowingOverview: function() {
|
||||||
|
this._animatingWindowsFade = false;
|
||||||
|
this._recalculateWindowPositions(WindowPositionFlags.INITIAL);
|
||||||
|
},
|
||||||
|
|
||||||
// Tests if @actor belongs to this workspaces and monitor
|
// Tests if @actor belongs to this workspaces and monitor
|
||||||
_isMyWindow : function (actor) {
|
_isMyWindow : function (actor) {
|
||||||
let win = actor.meta_window;
|
let win = actor.meta_window;
|
||||||
|
@ -367,10 +367,6 @@ const WorkspaceThumbnail = new Lang.Class({
|
|||||||
if (index == -1)
|
if (index == -1)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Check if window still should be here
|
|
||||||
if (win && this._isMyWindow(win) && this._isOverviewWindow(win))
|
|
||||||
return;
|
|
||||||
|
|
||||||
let clone = this._windows[index];
|
let clone = this._windows[index];
|
||||||
this._windows.splice(index, 1);
|
this._windows.splice(index, 1);
|
||||||
|
|
||||||
@ -665,7 +661,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
Main.overview.connect('window-drag-cancelled',
|
Main.overview.connect('window-drag-cancelled',
|
||||||
Lang.bind(this, this._onDragCancelled));
|
Lang.bind(this, this._onDragCancelled));
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||||
this._settings.connect('changed::dynamic-workspaces',
|
this._settings.connect('changed::dynamic-workspaces',
|
||||||
Lang.bind(this, this._updateSwitcherVisibility));
|
Lang.bind(this, this._updateSwitcherVisibility));
|
||||||
},
|
},
|
||||||
@ -878,9 +874,6 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
for (let key in ThumbnailState)
|
for (let key in ThumbnailState)
|
||||||
this._stateCounts[ThumbnailState[key]] = 0;
|
this._stateCounts[ThumbnailState[key]] = 0;
|
||||||
|
|
||||||
// The "porthole" is the portion of the screen that we show in the workspaces
|
|
||||||
this._porthole = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
|
||||||
|
|
||||||
this.addThumbnails(0, global.screen.n_workspaces);
|
this.addThumbnails(0, global.screen.n_workspaces);
|
||||||
|
|
||||||
this._updateSwitcherVisibility();
|
this._updateSwitcherVisibility();
|
||||||
@ -904,6 +897,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
for (let w = 0; w < this._thumbnails.length; w++)
|
for (let w = 0; w < this._thumbnails.length; w++)
|
||||||
this._thumbnails[w].destroy();
|
this._thumbnails[w].destroy();
|
||||||
this._thumbnails = [];
|
this._thumbnails = [];
|
||||||
|
this._porthole = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_workspacesChanged: function() {
|
_workspacesChanged: function() {
|
||||||
@ -934,6 +928,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
addThumbnails: function(start, count) {
|
addThumbnails: function(start, count) {
|
||||||
|
this._ensurePorthole();
|
||||||
for (let k = start; k < start + count; k++) {
|
for (let k = start; k < start + count; k++) {
|
||||||
let metaWorkspace = global.screen.get_workspace_by_index(k);
|
let metaWorkspace = global.screen.get_workspace_by_index(k);
|
||||||
let thumbnail = new WorkspaceThumbnail(metaWorkspace);
|
let thumbnail = new WorkspaceThumbnail(metaWorkspace);
|
||||||
@ -1121,9 +1116,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
// the size request to our children because we know how big they are and know
|
// the size request to our children because we know how big they are and know
|
||||||
// that the actors aren't depending on the virtual functions being called.
|
// that the actors aren't depending on the virtual functions being called.
|
||||||
|
|
||||||
if (this._thumbnails.length == 0)
|
this._ensurePorthole();
|
||||||
return;
|
|
||||||
|
|
||||||
let themeNode = this.actor.get_theme_node();
|
let themeNode = this.actor.get_theme_node();
|
||||||
|
|
||||||
let spacing = themeNode.get_length('spacing');
|
let spacing = themeNode.get_length('spacing');
|
||||||
@ -1135,8 +1128,7 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_getPreferredWidth: function(actor, forHeight, alloc) {
|
_getPreferredWidth: function(actor, forHeight, alloc) {
|
||||||
if (this._thumbnails.length == 0)
|
this._ensurePorthole();
|
||||||
return;
|
|
||||||
|
|
||||||
let themeNode = this.actor.get_theme_node();
|
let themeNode = this.actor.get_theme_node();
|
||||||
|
|
||||||
@ -1154,6 +1146,13 @@ const ThumbnailsBox = new Lang.Class({
|
|||||||
alloc.natural_size = width;
|
alloc.natural_size = width;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// The "porthole" is the portion of the screen that we show in the
|
||||||
|
// workspaces
|
||||||
|
_ensurePorthole: function() {
|
||||||
|
if (!this._porthole)
|
||||||
|
this._porthole = Main.layoutManager.getWorkAreaForMonitor(Main.layoutManager.primaryIndex);
|
||||||
|
},
|
||||||
|
|
||||||
_allocate: function(actor, box, flags) {
|
_allocate: function(actor, box, flags) {
|
||||||
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);
|
let rtl = (Clutter.get_default_text_direction () == Clutter.TextDirection.RTL);
|
||||||
|
|
||||||
|
@ -21,6 +21,11 @@ const WORKSPACE_SWITCH_TIME = 0.25;
|
|||||||
// Note that mutter has a compile-time limit of 36
|
// Note that mutter has a compile-time limit of 36
|
||||||
const MAX_WORKSPACES = 16;
|
const MAX_WORKSPACES = 16;
|
||||||
|
|
||||||
|
const AnimationType = {
|
||||||
|
ZOOM: 0,
|
||||||
|
FADE: 1
|
||||||
|
};
|
||||||
|
|
||||||
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
const OVERRIDE_SCHEMA = 'org.gnome.shell.overrides';
|
||||||
|
|
||||||
const WorkspacesViewBase = new Lang.Class({
|
const WorkspacesViewBase = new Lang.Class({
|
||||||
@ -74,12 +79,12 @@ const WorkspacesViewBase = new Lang.Class({
|
|||||||
|
|
||||||
setFullGeometry: function(geom) {
|
setFullGeometry: function(geom) {
|
||||||
this._fullGeometry = geom;
|
this._fullGeometry = geom;
|
||||||
this._syncGeometry();
|
this._syncFullGeometry();
|
||||||
},
|
},
|
||||||
|
|
||||||
setActualGeometry: function(geom) {
|
setActualGeometry: function(geom) {
|
||||||
this._actualGeometry = geom;
|
this._actualGeometry = geom;
|
||||||
this._syncGeometry();
|
this._syncActualGeometry();
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -94,7 +99,7 @@ const WorkspacesView = new Lang.Class({
|
|||||||
this._scrolling = false; // swipe-scrolling
|
this._scrolling = false; // swipe-scrolling
|
||||||
this._animatingScroll = false; // programatically updating the adjustment
|
this._animatingScroll = false; // programatically updating the adjustment
|
||||||
|
|
||||||
this._settings = new Gio.Settings({ schema: OVERRIDE_SCHEMA });
|
this._settings = new Gio.Settings({ schema_id: OVERRIDE_SCHEMA });
|
||||||
|
|
||||||
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
|
||||||
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
this.scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
|
||||||
@ -127,9 +132,12 @@ const WorkspacesView = new Lang.Class({
|
|||||||
this._workspaces[i].setReservedSlot(clone);
|
this._workspaces[i].setReservedSlot(clone);
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncGeometry: function() {
|
_syncFullGeometry: function() {
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
this._workspaces[i].setFullGeometry(this._fullGeometry);
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncActualGeometry: function() {
|
||||||
for (let i = 0; i < this._workspaces.length; i++)
|
for (let i = 0; i < this._workspaces.length; i++)
|
||||||
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
this._workspaces[i].setActualGeometry(this._actualGeometry);
|
||||||
},
|
},
|
||||||
@ -139,17 +147,25 @@ const WorkspacesView = new Lang.Class({
|
|||||||
return this._workspaces[active];
|
return this._workspaces[active];
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomToOverview: function() {
|
animateToOverview: function(animationType) {
|
||||||
for (let w = 0; w < this._workspaces.length; w++)
|
for (let w = 0; w < this._workspaces.length; w++) {
|
||||||
this._workspaces[w].zoomToOverview();
|
if (animationType == AnimationType.ZOOM)
|
||||||
|
this._workspaces[w].zoomToOverview();
|
||||||
|
else
|
||||||
|
this._workspaces[w].fadeToOverview();
|
||||||
|
}
|
||||||
this._updateWorkspaceActors(false);
|
this._updateWorkspaceActors(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomFromOverview: function() {
|
animateFromOverview: function(animationType) {
|
||||||
this.actor.remove_clip();
|
this.actor.remove_clip();
|
||||||
|
|
||||||
for (let w = 0; w < this._workspaces.length; w++)
|
for (let w = 0; w < this._workspaces.length; w++) {
|
||||||
this._workspaces[w].zoomFromOverview();
|
if (animationType == AnimationType.ZOOM)
|
||||||
|
this._workspaces[w].zoomFromOverview();
|
||||||
|
else
|
||||||
|
this._workspaces[w].fadeFromOverview();
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
syncStacking: function(stackIndices) {
|
syncStacking: function(stackIndices) {
|
||||||
@ -260,10 +276,12 @@ const WorkspacesView = new Lang.Class({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this._fullGeometry)
|
if (this._fullGeometry) {
|
||||||
this._updateWorkspaceActors(false);
|
this._updateWorkspaceActors(false);
|
||||||
|
this._syncFullGeometry();
|
||||||
this._syncGeometry();
|
}
|
||||||
|
if (this._actualGeometry)
|
||||||
|
this._syncActualGeometry();
|
||||||
},
|
},
|
||||||
|
|
||||||
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
_activeWorkspaceChanged: function(wm, from, to, direction) {
|
||||||
@ -352,17 +370,26 @@ const ExtraWorkspaceView = new Lang.Class({
|
|||||||
this._workspace.setReservedSlot(clone);
|
this._workspace.setReservedSlot(clone);
|
||||||
},
|
},
|
||||||
|
|
||||||
_syncGeometry: function() {
|
_syncFullGeometry: function() {
|
||||||
this._workspace.setFullGeometry(this._fullGeometry);
|
this._workspace.setFullGeometry(this._fullGeometry);
|
||||||
|
},
|
||||||
|
|
||||||
|
_syncActualGeometry: function() {
|
||||||
this._workspace.setActualGeometry(this._actualGeometry);
|
this._workspace.setActualGeometry(this._actualGeometry);
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomToOverview: function() {
|
animateToOverview: function(animationType) {
|
||||||
this._workspace.zoomToOverview();
|
if (animationType == AnimationType.ZOOM)
|
||||||
|
this._workspace.zoomToOverview();
|
||||||
|
else
|
||||||
|
this._workspace.fadeToOverview();
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomFromOverview: function() {
|
animateFromOverview: function(animationType) {
|
||||||
this._workspace.zoomFromOverview();
|
if (animationType == AnimationType.ZOOM)
|
||||||
|
this._workspace.zoomFromOverview();
|
||||||
|
else
|
||||||
|
this._workspace.fadeFromOverview();
|
||||||
},
|
},
|
||||||
|
|
||||||
syncStacking: function(stackIndices) {
|
syncStacking: function(stackIndices) {
|
||||||
@ -429,7 +456,7 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
this._workspacesViews = [];
|
this._workspacesViews = [];
|
||||||
this._primaryScrollAdjustment = null;
|
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',
|
this._settings.connect('changed::workspaces-only-on-primary',
|
||||||
Lang.bind(this,
|
Lang.bind(this,
|
||||||
this._workspacesOnlyOnPrimaryChanged));
|
this._workspacesOnlyOnPrimaryChanged));
|
||||||
@ -454,10 +481,16 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
|
return this._getPrimaryView().actor.navigate_focus(from, direction, false);
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function(fadeOnPrimary) {
|
||||||
this._updateWorkspacesViews();
|
this._updateWorkspacesViews();
|
||||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||||
this._workspacesViews[i].zoomToOverview();
|
let animationType;
|
||||||
|
if (fadeOnPrimary && i == this._primaryIndex)
|
||||||
|
animationType = AnimationType.FADE;
|
||||||
|
else
|
||||||
|
animationType = AnimationType.ZOOM;
|
||||||
|
this._workspacesViews[i].animateToOverview(animationType);
|
||||||
|
}
|
||||||
|
|
||||||
this._restackedNotifyId =
|
this._restackedNotifyId =
|
||||||
Main.overview.connect('windows-restacked',
|
Main.overview.connect('windows-restacked',
|
||||||
@ -466,9 +499,15 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
this._scrollEventId = Main.overview.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
||||||
},
|
},
|
||||||
|
|
||||||
zoomFromOverview: function() {
|
animateFromOverview: function(fadeOnPrimary) {
|
||||||
for (let i = 0; i < this._workspacesViews.length; i++)
|
for (let i = 0; i < this._workspacesViews.length; i++) {
|
||||||
this._workspacesViews[i].zoomFromOverview();
|
let animationType;
|
||||||
|
if (fadeOnPrimary && i == this._primaryIndex)
|
||||||
|
animationType = AnimationType.FADE;
|
||||||
|
else
|
||||||
|
animationType = AnimationType.ZOOM;
|
||||||
|
this._workspacesViews[i].animateFromOverview(animationType);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
@ -598,8 +637,9 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
let [x, y] = this.actor.get_transformed_position();
|
let [x, y] = this.actor.get_transformed_position();
|
||||||
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
|
let allocation = this.actor.allocation;
|
||||||
let height = this.actor.allocation.y2 - this.actor.allocation.y1;
|
let width = allocation.x2 - allocation.x1;
|
||||||
|
let height = allocation.y2 - allocation.y1;
|
||||||
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
let primaryGeometry = { x: x, y: y, width: width, height: height };
|
||||||
|
|
||||||
let monitors = Main.layoutManager.monitors;
|
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-extension-prefs.desktop.in.in
|
||||||
data/gnome-shell-wayland.desktop.in.in
|
data/gnome-shell-wayland.desktop.in.in
|
||||||
data/org.gnome.shell.gschema.xml.in.in
|
data/org.gnome.shell.gschema.xml.in.in
|
||||||
|
data/org.gnome.Shell.PortalHelper.desktop.in
|
||||||
js/extensionPrefs/main.js
|
js/extensionPrefs/main.js
|
||||||
js/gdm/authPrompt.js
|
js/gdm/authPrompt.js
|
||||||
js/gdm/loginDialog.js
|
js/gdm/loginDialog.js
|
||||||
js/gdm/util.js
|
js/gdm/util.js
|
||||||
js/misc/util.js
|
js/misc/util.js
|
||||||
|
js/portalHelper/main.js
|
||||||
js/ui/appDisplay.js
|
js/ui/appDisplay.js
|
||||||
js/ui/appFavorites.js
|
js/ui/appFavorites.js
|
||||||
js/ui/backgroundMenu.js
|
js/ui/backgroundMenu.js
|
||||||
|
353
po/lt.po
353
po/lt.po
@ -11,8 +11,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell master\n"
|
"Project-Id-Version: gnome-shell master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2014-06-02 19:26+0000\n"
|
"POT-Creation-Date: 2014-07-25 19:35+0000\n"
|
||||||
"PO-Revision-Date: 2014-06-02 23:35+0300\n"
|
"PO-Revision-Date: 2014-07-25 22:53+0300\n"
|
||||||
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
|
"Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n"
|
||||||
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
|
"Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n"
|
||||||
"Language: lt\n"
|
"Language: lt\n"
|
||||||
@ -126,18 +126,26 @@ msgstr ""
|
|||||||
"srityje."
|
"srityje."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
|
msgid "App Picker View"
|
||||||
|
msgstr "Programos pasirinkimo vaizdas"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||||
|
msgid "Index of the currently selected view in the application picker."
|
||||||
|
msgstr "Šiuo metu pasirinkto vaizdo programų vaizde indeksas."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
msgstr "Komandų (Alt-F2) dialogo retrospektyva"
|
msgstr "Komandų (Alt-F2) dialogo retrospektyva"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||||
msgid "History for the looking glass dialog"
|
msgid "History for the looking glass dialog"
|
||||||
msgstr "Didinamojo stiklo dialogo retrospektyva"
|
msgstr "Didinamojo stiklo dialogo retrospektyva"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
msgid "Always show the 'Log out' menu item in the user menu."
|
msgid "Always show the 'Log out' menu item in the user menu."
|
||||||
msgstr "Visada rodyti naudotojo meniu punktą „Atsijungti“."
|
msgstr "Visada rodyti naudotojo meniu punktą „Atsijungti“."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
||||||
"user, single-session situations."
|
"user, single-session situations."
|
||||||
@ -145,13 +153,13 @@ msgstr ""
|
|||||||
"Šis raktas perrašo automatinį meniu punkto „Atsijungti“ slėpimą vieno "
|
"Šis raktas perrašo automatinį meniu punkto „Atsijungti“ slėpimą vieno "
|
||||||
"naudotojo, vieno seanso situacijose."
|
"naudotojo, vieno seanso situacijose."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||||
msgid ""
|
msgid ""
|
||||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Ar atsiminti slaptažodį prijungiant šifruotas ar nutolusias failų sistemas"
|
"Ar atsiminti slaptažodį prijungiant šifruotas ar nutolusias failų sistemas"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||||
msgid ""
|
msgid ""
|
||||||
"The shell will request a password when an encrypted device or a remote "
|
"The shell will request a password when an encrypted device or a remote "
|
||||||
"filesystem is mounted. If the password can be saved for future use a "
|
"filesystem is mounted. If the password can be saved for future use a "
|
||||||
@ -163,70 +171,77 @@ msgstr ""
|
|||||||
"žymimasis langelis „Įsiminti slaptažodį“ bus rodomas. Šis raktas nustato "
|
"žymimasis langelis „Įsiminti slaptažodį“ bus rodomas. Šis raktas nustato "
|
||||||
"numatytąją žymimojo langelio būseną."
|
"numatytąją žymimojo langelio būseną."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "Rodyti savaitės dienas kalendoriuje"
|
msgstr "Rodyti savaitės dienas kalendoriuje"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||||
msgid "If true, display the ISO week date in the calendar."
|
msgid "If true, display the ISO week date in the calendar."
|
||||||
msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą."
|
msgstr "Jeigu reikšmė teigiama, kalendoriuje rodyti ISO savaičių datą."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||||
msgid "Keybinding to open the application menu"
|
msgid "Keybinding to open the application menu"
|
||||||
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu"
|
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu."
|
msgstr "Klavišų susiejimas, kuriuo atveriamas programų meniu."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||||
msgid "Keybinding to open the \"Show Applications\" view"
|
msgid "Keybinding to open the \"Show Applications\" view"
|
||||||
msgstr "Klavišų susiejimas, kuriuo atveriamas programų paleidimo vaizdas"
|
msgstr "Klavišų susiejimas, kuriuo atveriamas programų paleidimo vaizdas"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Klavišų susiejimas, kuriuo atveriamas „Programų paleidimas“ veiklų "
|
"Klavišų susiejimas, kuriuo atveriamas „Programų paleidimas“ veiklų "
|
||||||
"apžvalgoje."
|
"apžvalgoje."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Klavišų susiejimas, kuriuo atveriama apžvalga"
|
msgstr "Klavišų susiejimas, kuriuo atveriama apžvalga"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr "Klavišų susiejimas, kuriuo atveriama veiklų apžvalga."
|
msgstr "Klavišų susiejimas, kuriuo atveriama veiklų apžvalga."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||||
msgid "Keybinding to toggle the visibility of the message tray"
|
msgid "Keybinding to toggle the visibility of the message tray"
|
||||||
msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti"
|
msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||||
msgid "Keybinding to toggle the visibility of the message tray."
|
msgid "Keybinding to toggle the visibility of the message tray."
|
||||||
msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti."
|
msgstr "Klavišų susiejimas pranešimų juostos matomumui perjungti."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas"
|
msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||||
msgid "Keybinding to focus the active notification."
|
msgid "Keybinding to focus the active notification."
|
||||||
msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas."
|
msgstr "Klavišų susiejimas, kuriuo fokusuojamas aktyvus pranešimas."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||||
|
msgid ""
|
||||||
|
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||||
|
msgstr ""
|
||||||
|
"Klavišų susiejimas, kuris sustabdo ir pratęsia visus veikiančius elementus, "
|
||||||
|
"derinimui"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
msgstr "Kurią klaviatūrą naudoti"
|
msgstr "Kurią klaviatūrą naudoti"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||||
msgid "The type of keyboard to use."
|
msgid "The type of keyboard to use."
|
||||||
msgstr "Naudotinas klaviatūros tipas."
|
msgstr "Naudotinas klaviatūros tipas."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||||
msgid "The maximum accuracy level of location."
|
msgid "The maximum accuracy level of location."
|
||||||
msgstr "Didžiausias vietos tikslumo lygis."
|
msgstr "Didžiausias vietos tikslumo lygis."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures the maximum level of location accuracy applications are allowed "
|
"Configures the maximum level of location accuracy applications are allowed "
|
||||||
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
||||||
@ -242,11 +257,23 @@ msgstr ""
|
|||||||
"nustatyti naudotojo vietą pačios naudodamos tinklo išteklius (nors tai "
|
"nustatyti naudotojo vietą pačios naudodamos tinklo išteklius (nors tai "
|
||||||
"suteikia geriausiu atveju gatvės lygmens tikslumą)."
|
"suteikia geriausiu atveju gatvės lygmens tikslumą)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||||
|
msgid "Limit switcher to current workspace."
|
||||||
|
msgstr "Apriboti perjungėją dabartiniu darbalaukiu"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||||
|
msgid ""
|
||||||
|
"If true, only applications that have windows on the current workspace are "
|
||||||
|
"shown in the switcher. Otherwise, all applications are included."
|
||||||
|
msgstr ""
|
||||||
|
"Jei teigiama, perjungimo lange bus rodomas tik programos, turinčios langų "
|
||||||
|
"dabartiniame darbalaukyje. Priešingu atveju įtraukiamos visos programos."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
msgstr "Programos piktogramos veiksena."
|
msgstr "Programos piktogramos veiksena."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||||
@ -256,45 +283,56 @@ msgstr ""
|
|||||||
"„thumbnail-only“ (rodo lango miniatiūrą), „app-icon-only“ (rodo tik "
|
"„thumbnail-only“ (rodo lango miniatiūrą), „app-icon-only“ (rodo tik "
|
||||||
"programos piktogramą) arba „both“ (abu)."
|
"programos piktogramą) arba „both“ (abu)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||||
|
msgid ""
|
||||||
|
"If true, only windows from the current workspace are shown in the switcher. "
|
||||||
|
"Otherwise, all windows are included."
|
||||||
|
msgstr ""
|
||||||
|
"Jei teigiama, perjungimo lange rodomi tik langai iš dabartinio darbalaukio. "
|
||||||
|
"Priešingu atveju įtraukiami visi langai."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Prikabinti modalinį dialogą prie tėvinio lango"
|
msgstr "Prikabinti modalinį dialogą prie tėvinio lango"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr "Šis raktas perrašo org.gnome.mutter raktą, kai vykdoma GNOME Shell."
|
msgstr "Šis raktas perrašo org.gnome.mutter raktą, kai vykdoma GNOME Shell."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr "Įjungti kraštų išplėtimą, kai langai numetami ekrano kraštuose"
|
msgstr "Įjungti kraštų išplėtimą, kai langai numetami ekrano kraštuose"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "Darbalaukiai yra valdomi dinamiškai"
|
msgstr "Darbalaukiai yra valdomi dinamiškai"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Darbalaukiai tik pagrindiniame monitoriuje"
|
msgstr "Darbalaukiai tik pagrindiniame monitoriuje"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
msgstr "Atidėti fokuso pakeitimus pelei iki žymiklis nustos judėti"
|
msgstr "Atidėti fokuso pakeitimus pelei iki žymiklis nustos judėti"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
|
||||||
|
msgid "Captive Portal"
|
||||||
|
msgstr "Pagavimo portalas"
|
||||||
|
|
||||||
|
#: ../js/extensionPrefs/main.js:127
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:"
|
msgstr "Kilo klaida įkeliant %s nustatymų dialogą:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:157
|
#: ../js/extensionPrefs/main.js:159
|
||||||
#| msgid "Configure GNOME Shell Extensions"
|
|
||||||
msgid "GNOME Shell Extensions"
|
msgid "GNOME Shell Extensions"
|
||||||
msgstr "GNOME Shell plėtiniai"
|
msgstr "GNOME Shell plėtiniai"
|
||||||
|
|
||||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
|
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
|
||||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/network.js:878
|
#: ../js/ui/status/network.js:915
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Atsisakyti"
|
msgstr "Atsisakyti"
|
||||||
|
|
||||||
@ -325,8 +363,8 @@ msgstr "Nėra sąraše?"
|
|||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(pvz., naudotojas arba %s)"
|
msgstr "(pvz., naudotojas arba %s)"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||||
#: ../js/ui/components/networkAgent.js:280
|
#: ../js/ui/components/networkAgent.js:286
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Naudotojo vardas: "
|
msgstr "Naudotojo vardas: "
|
||||||
|
|
||||||
@ -355,45 +393,50 @@ msgstr "Nepavyko perskaityti komandos:"
|
|||||||
msgid "Execution of “%s” failed:"
|
msgid "Execution of “%s” failed:"
|
||||||
msgstr "Nepavyko įvykdyti „%s“:"
|
msgstr "Nepavyko įvykdyti „%s“:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:640
|
#: ../js/portalHelper/main.js:84
|
||||||
|
#| msgid "Authentication Required"
|
||||||
|
msgid "Web Authentication Redirect"
|
||||||
|
msgstr "Reikia patvirtinti tapatybę internete"
|
||||||
|
|
||||||
|
#: ../js/ui/appDisplay.js:641
|
||||||
msgid "Frequently used applications will appear here"
|
msgid "Frequently used applications will appear here"
|
||||||
msgstr "Čia bus matomos dažnai naudojamos programos"
|
msgstr "Čia bus matomos dažnai naudojamos programos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:751
|
#: ../js/ui/appDisplay.js:752
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Dažnai naudojamos"
|
msgstr "Dažnai naudojamos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:758
|
#: ../js/ui/appDisplay.js:759
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Visos"
|
msgstr "Visos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1571
|
#: ../js/ui/appDisplay.js:1631
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Naujas langas"
|
msgstr "Naujas langas"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
|
#: ../js/ui/appDisplay.js:1653 ../js/ui/dash.js:285
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Pašalinti iš mėgstamų"
|
msgstr "Pašalinti iš mėgstamų"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1599
|
#: ../js/ui/appDisplay.js:1659
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Pridėti prie mėgstamų"
|
msgstr "Pridėti prie mėgstamų"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1608
|
#: ../js/ui/appDisplay.js:1668
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Rodyti detalią informaciją"
|
msgstr "Rodyti detalią informaciją"
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:87
|
#: ../js/ui/appFavorites.js:122
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s has been added to your favorites."
|
msgid "%s has been added to your favorites."
|
||||||
msgstr "%s pridėta prie jūsų mėgstamų."
|
msgstr "%s pridėta prie jūsų mėgstamų."
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:121
|
#: ../js/ui/appFavorites.js:156
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s pašalinta iš jūsų mėgstamų."
|
msgstr "%s pašalinta iš jūsų mėgstamų."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:814
|
||||||
#: ../js/ui/status/system.js:337
|
#: ../js/ui/status/system.js:337
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Nustatymai"
|
msgstr "Nustatymai"
|
||||||
@ -527,35 +570,35 @@ msgid "Next month"
|
|||||||
msgstr "Kitas mėnuo"
|
msgstr "Kitas mėnuo"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events */
|
#. Translators: Text to show if there are no events */
|
||||||
#: ../js/ui/calendar.js:775
|
#: ../js/ui/calendar.js:785
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nieko nesuplanuota"
|
msgstr "Nieko nesuplanuota"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||||
#: ../js/ui/calendar.js:793
|
#: ../js/ui/calendar.js:803
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %B %d d."
|
msgstr "%A, %B %d d."
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
#: ../js/ui/calendar.js:796
|
#: ../js/ui/calendar.js:806
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %Y m. %B %d d."
|
msgstr "%A, %Y m. %B %d d."
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:807
|
#: ../js/ui/calendar.js:817
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Šiandien"
|
msgstr "Šiandien"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:811
|
#: ../js/ui/calendar.js:821
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Rytoj"
|
msgstr "Rytoj"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:822
|
#: ../js/ui/calendar.js:832
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Šią savaitę"
|
msgstr "Šią savaitę"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:830
|
#: ../js/ui/calendar.js:840
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Kitą savaitę"
|
msgstr "Kitą savaitę"
|
||||||
|
|
||||||
@ -588,40 +631,40 @@ msgstr "Slaptažodis:"
|
|||||||
msgid "Type again:"
|
msgid "Type again:"
|
||||||
msgstr "Įveskite dar kartą:"
|
msgstr "Įveskite dar kartą:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||||
msgid "Connect"
|
msgid "Connect"
|
||||||
msgstr "Prisijungti"
|
msgstr "Prisijungti"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:224
|
#: ../js/ui/components/networkAgent.js:230
|
||||||
#: ../js/ui/components/networkAgent.js:236
|
#: ../js/ui/components/networkAgent.js:242
|
||||||
#: ../js/ui/components/networkAgent.js:264
|
#: ../js/ui/components/networkAgent.js:270
|
||||||
#: ../js/ui/components/networkAgent.js:284
|
#: ../js/ui/components/networkAgent.js:290
|
||||||
#: ../js/ui/components/networkAgent.js:294
|
#: ../js/ui/components/networkAgent.js:300
|
||||||
msgid "Password: "
|
msgid "Password: "
|
||||||
msgstr "Slaptažodis: "
|
msgstr "Slaptažodis: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:229
|
#: ../js/ui/components/networkAgent.js:235
|
||||||
msgid "Key: "
|
msgid "Key: "
|
||||||
msgstr "Raktas: "
|
msgstr "Raktas: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:268
|
#: ../js/ui/components/networkAgent.js:274
|
||||||
msgid "Identity: "
|
msgid "Identity: "
|
||||||
msgstr "Tapatybė: "
|
msgstr "Tapatybė: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:270
|
#: ../js/ui/components/networkAgent.js:276
|
||||||
msgid "Private key password: "
|
msgid "Private key password: "
|
||||||
msgstr "Privataus rakto slaptažodis: "
|
msgstr "Privataus rakto slaptažodis: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:282
|
#: ../js/ui/components/networkAgent.js:288
|
||||||
msgid "Service: "
|
msgid "Service: "
|
||||||
msgstr "Tarnyba: "
|
msgstr "Tarnyba: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:311
|
#: ../js/ui/components/networkAgent.js:317
|
||||||
msgid "Authentication required by wireless network"
|
msgid "Authentication required by wireless network"
|
||||||
msgstr "Belaidžiam tinklui reikia patvirtinti tapatybę"
|
msgstr "Belaidžiam tinklui reikia patvirtinti tapatybę"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:312
|
#: ../js/ui/components/networkAgent.js:318
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Passwords or encryption keys are required to access the wireless network "
|
"Passwords or encryption keys are required to access the wireless network "
|
||||||
@ -630,35 +673,35 @@ msgstr ""
|
|||||||
"Slaptažodžiai arba šifravimo raktai yra būtini priėjimui prie belaidžio "
|
"Slaptažodžiai arba šifravimo raktai yra būtini priėjimui prie belaidžio "
|
||||||
"tinklo „%s“."
|
"tinklo „%s“."
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:316
|
#: ../js/ui/components/networkAgent.js:322
|
||||||
msgid "Wired 802.1X authentication"
|
msgid "Wired 802.1X authentication"
|
||||||
msgstr "Laidinis 802.1X tapatybės patvirtinimas"
|
msgstr "Laidinis 802.1X tapatybės patvirtinimas"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:318
|
#: ../js/ui/components/networkAgent.js:324
|
||||||
msgid "Network name: "
|
msgid "Network name: "
|
||||||
msgstr "Tinklo vardas: "
|
msgstr "Tinklo vardas: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:323
|
#: ../js/ui/components/networkAgent.js:329
|
||||||
msgid "DSL authentication"
|
msgid "DSL authentication"
|
||||||
msgstr "DSL tapatybės patvirtinimas"
|
msgstr "DSL tapatybės patvirtinimas"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:330
|
#: ../js/ui/components/networkAgent.js:336
|
||||||
msgid "PIN code required"
|
msgid "PIN code required"
|
||||||
msgstr "Reikalingas PIN kodas"
|
msgstr "Reikalingas PIN kodas"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:331
|
#: ../js/ui/components/networkAgent.js:337
|
||||||
msgid "PIN code is needed for the mobile broadband device"
|
msgid "PIN code is needed for the mobile broadband device"
|
||||||
msgstr "Reikalingas PIN kodas mobiliajam plačiajuosčiam įrenginiui"
|
msgstr "Reikalingas PIN kodas mobiliajam plačiajuosčiam įrenginiui"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:332
|
#: ../js/ui/components/networkAgent.js:338
|
||||||
msgid "PIN: "
|
msgid "PIN: "
|
||||||
msgstr "PIN: "
|
msgstr "PIN: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:338
|
#: ../js/ui/components/networkAgent.js:344
|
||||||
msgid "Mobile broadband network password"
|
msgid "Mobile broadband network password"
|
||||||
msgstr "Mobiliojo plačiajuosčio tinklo slaptažodis"
|
msgstr "Mobiliojo plačiajuosčio tinklo slaptažodis"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:339
|
#: ../js/ui/components/networkAgent.js:345
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "A password is required to connect to “%s”."
|
msgid "A password is required to connect to “%s”."
|
||||||
msgstr "Būtinas slaptažodis norint prisijungti prie „%s“."
|
msgstr "Būtinas slaptažodis norint prisijungti prie „%s“."
|
||||||
@ -956,7 +999,7 @@ msgstr "Rodyti paskyrą"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Nežinoma priežastis"
|
msgstr "Nežinoma priežastis"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Langai"
|
msgstr "Langai"
|
||||||
|
|
||||||
@ -968,22 +1011,22 @@ msgstr "Paleisti programas"
|
|||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Paleidimo sritis"
|
msgstr "Paleidimo sritis"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Atverti kalendorių"
|
msgstr "Atverti kalendorių"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:101
|
#: ../js/ui/dateMenu.js:100
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Atverti laikrodžius"
|
msgstr "Atverti laikrodžius"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:108
|
#: ../js/ui/dateMenu.js:107
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Datos ir laiko nustatymai"
|
msgstr "Datos ir laiko nustatymai"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#. */
|
#. */
|
||||||
#: ../js/ui/dateMenu.js:205
|
#: ../js/ui/dateMenu.js:204
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %Y m. %B %d d."
|
msgstr "%A, %Y m. %B %d d."
|
||||||
|
|
||||||
@ -1132,7 +1175,7 @@ msgstr "Įdiegti"
|
|||||||
msgid "Download and install “%s” from extensions.gnome.org?"
|
msgid "Download and install “%s” from extensions.gnome.org?"
|
||||||
msgstr "Parsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
|
msgstr "Parsiųsti ir įdiegti „%s“ iš extensions.gnome.org?"
|
||||||
|
|
||||||
#: ../js/ui/keyboard.js:645 ../js/ui/status/keyboard.js:339
|
#: ../js/ui/keyboard.js:653 ../js/ui/status/keyboard.js:339
|
||||||
msgid "Keyboard"
|
msgid "Keyboard"
|
||||||
msgstr "Klaviatūra"
|
msgstr "Klaviatūra"
|
||||||
|
|
||||||
@ -1164,7 +1207,7 @@ msgstr "Įjungta"
|
|||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Išjungta"
|
msgstr "Išjungta"
|
||||||
|
|
||||||
@ -1188,43 +1231,43 @@ msgstr "Žiūrėti šaltinį"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Tinklalapis"
|
msgstr "Tinklalapis"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1326
|
#: ../js/ui/messageTray.js:1325
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "Atverti"
|
msgstr "Atverti"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1333
|
#: ../js/ui/messageTray.js:1332
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Pašalinti"
|
msgstr "Pašalinti"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1630
|
#: ../js/ui/messageTray.js:1629
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Pranešimai"
|
msgstr "Pranešimai"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1637
|
#: ../js/ui/messageTray.js:1636
|
||||||
msgid "Clear Messages"
|
msgid "Clear Messages"
|
||||||
msgstr "Išvalyti pranešimus"
|
msgstr "Išvalyti pranešimus"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1656
|
#: ../js/ui/messageTray.js:1655
|
||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Pranešimų nustatymai"
|
msgstr "Pranešimų nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1709
|
#: ../js/ui/messageTray.js:1708
|
||||||
msgid "Tray Menu"
|
msgid "Tray Menu"
|
||||||
msgstr "Dėklo meniu"
|
msgstr "Dėklo meniu"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1926
|
#: ../js/ui/messageTray.js:1925
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Nėra pranešimų"
|
msgstr "Nėra pranešimų"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1964
|
#: ../js/ui/messageTray.js:1963
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Pranešimų juosta"
|
msgstr "Pranešimų juosta"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2967
|
#: ../js/ui/messageTray.js:2966
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Sistemos informacija"
|
msgstr "Sistemos informacija"
|
||||||
|
|
||||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Nežinoma"
|
msgstr "Nežinoma"
|
||||||
@ -1253,32 +1296,37 @@ msgstr "Apžvalga"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Rašykite, ko ieškote…"
|
msgstr "Rašykite, ko ieškote…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:516
|
#: ../js/ui/panel.js:515
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Užverti"
|
msgstr "Užverti"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview". */
|
#. in your language, you can use the word for "Overview". */
|
||||||
#: ../js/ui/panel.js:568
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Apžvalga"
|
msgstr "Apžvalga"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:915
|
#: ../js/ui/panel.js:919
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Viršutinė juosta"
|
msgstr "Viršutinė juosta"
|
||||||
|
|
||||||
#: ../js/ui/popupMenu.js:279
|
#: ../js/ui/popupMenu.js:283
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:74
|
#: ../js/ui/runDialog.js:70
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Įveskite komandą"
|
msgstr "Įveskite komandą"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
|
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Užverti"
|
msgstr "Užverti"
|
||||||
|
|
||||||
|
#: ../js/ui/runDialog.js:273
|
||||||
|
#| msgid "Estimating…"
|
||||||
|
msgid "Restarting…"
|
||||||
|
msgstr "Perleidžiama…"
|
||||||
|
|
||||||
#. Translators: This is a time format for a date in
|
#. Translators: This is a time format for a date in
|
||||||
#. long format */
|
#. long format */
|
||||||
#: ../js/ui/screenShield.js:88
|
#: ../js/ui/screenShield.js:88
|
||||||
@ -1309,11 +1357,11 @@ msgstr "Nepavyksta užrakinti"
|
|||||||
msgid "Lock was blocked by an application"
|
msgid "Lock was blocked by an application"
|
||||||
msgstr "Programa užblokavo užrakinimą"
|
msgstr "Programa užblokavo užrakinimą"
|
||||||
|
|
||||||
#: ../js/ui/search.js:606
|
#: ../js/ui/search.js:614
|
||||||
msgid "Searching…"
|
msgid "Searching…"
|
||||||
msgstr "Ieškoma…"
|
msgstr "Ieškoma…"
|
||||||
|
|
||||||
#: ../js/ui/search.js:652
|
#: ../js/ui/search.js:660
|
||||||
msgid "No results."
|
msgid "No results."
|
||||||
msgstr "Nerasta atitikmenų."
|
msgstr "Nerasta atitikmenų."
|
||||||
|
|
||||||
@ -1389,9 +1437,9 @@ msgstr "Didelis tekstas"
|
|||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||||
#: ../js/ui/status/rfkill.js:114
|
#: ../js/ui/status/rfkill.js:114
|
||||||
msgid "Turn Off"
|
msgid "Turn Off"
|
||||||
msgstr "Išjungti"
|
msgstr "Išjungti"
|
||||||
@ -1408,7 +1456,7 @@ msgstr[0] "%d prijungtas įrenginys"
|
|||||||
msgstr[1] "%d prijungti įrenginiai"
|
msgstr[1] "%d prijungti įrenginiai"
|
||||||
msgstr[2] "%d prijungtų įrenginių"
|
msgstr[2] "%d prijungtų įrenginių"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
|
||||||
msgid "Not Connected"
|
msgid "Not Connected"
|
||||||
msgstr "Atsijungta"
|
msgstr "Atsijungta"
|
||||||
|
|
||||||
@ -1436,156 +1484,156 @@ msgstr "Įjungti"
|
|||||||
msgid "In Use"
|
msgid "In Use"
|
||||||
msgstr "Naudojama"
|
msgstr "Naudojama"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:74
|
#: ../js/ui/status/network.js:101
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<nežinoma>"
|
msgstr "<nežinoma>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||||
#: ../js/ui/status/network.js:1464
|
#: ../js/ui/status/network.js:1511
|
||||||
msgid "Off"
|
msgid "Off"
|
||||||
msgstr "Išjungta"
|
msgstr "Išjungta"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:422
|
#: ../js/ui/status/network.js:459
|
||||||
msgid "Connected"
|
msgid "Connected"
|
||||||
msgstr "Prisijungta"
|
msgstr "Prisijungta"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu) */
|
#. under NetworkManager's control (and thus cannot be used in the menu) */
|
||||||
#: ../js/ui/status/network.js:426
|
#: ../js/ui/status/network.js:463
|
||||||
msgid "Unmanaged"
|
msgid "Unmanaged"
|
||||||
msgstr "Nevaldomas"
|
msgstr "Nevaldomas"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:428
|
#: ../js/ui/status/network.js:465
|
||||||
msgid "Disconnecting"
|
msgid "Disconnecting"
|
||||||
msgstr "Atsijungiama"
|
msgstr "Atsijungiama"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
|
||||||
msgid "Connecting"
|
msgid "Connecting"
|
||||||
msgstr "Jungiamasi"
|
msgstr "Jungiamasi"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password */
|
#. Translators: this is for network connections that require some kind of key or password */
|
||||||
#: ../js/ui/status/network.js:437
|
#: ../js/ui/status/network.js:474
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Reikia patvirtinti tapatybę"
|
msgstr "Reikia patvirtinti tapatybę"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing */
|
#. module, which is missing */
|
||||||
#: ../js/ui/status/network.js:445
|
#: ../js/ui/status/network.js:482
|
||||||
msgid "Firmware missing"
|
msgid "Firmware missing"
|
||||||
msgstr "Trūksta integruotos programinės įrangos (firmware)"
|
msgstr "Trūksta integruotos programinės įrangos (firmware)"
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage */
|
#. is disabled by rfkill, or it has no coverage */
|
||||||
#: ../js/ui/status/network.js:449
|
#: ../js/ui/status/network.js:486
|
||||||
msgid "Unavailable"
|
msgid "Unavailable"
|
||||||
msgstr "Nepasiekiamas"
|
msgstr "Nepasiekiamas"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Nepavyko prisijungti"
|
msgstr "Nepavyko prisijungti"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:467
|
#: ../js/ui/status/network.js:504
|
||||||
msgid "Wired Settings"
|
msgid "Wired Settings"
|
||||||
msgstr "Laidinio ryšio nustatymai"
|
msgstr "Laidinio ryšio nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
|
||||||
msgid "Mobile Broadband Settings"
|
msgid "Mobile Broadband Settings"
|
||||||
msgstr "Mobiliojo plačiajuosčio tinklo nustatymai"
|
msgstr "Mobiliojo plačiajuosčio tinklo nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
|
||||||
msgid "Hardware Disabled"
|
msgid "Hardware Disabled"
|
||||||
msgstr "Aparatinė įranga išjungta"
|
msgstr "Aparatinė įranga išjungta"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:595
|
#: ../js/ui/status/network.js:632
|
||||||
msgid "Use as Internet connection"
|
msgid "Use as Internet connection"
|
||||||
msgstr "Naudoti kaip interneto ryšį"
|
msgstr "Naudoti kaip interneto ryšį"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:776
|
#: ../js/ui/status/network.js:813
|
||||||
msgid "Airplane Mode is On"
|
msgid "Airplane Mode is On"
|
||||||
msgstr "Skrydžio veiksena įjungta"
|
msgstr "Skrydžio veiksena įjungta"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:777
|
#: ../js/ui/status/network.js:814
|
||||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||||
msgstr "Belaidis ryšys yra išjungta skrydžio veiksenoje."
|
msgstr "Belaidis ryšys yra išjungta skrydžio veiksenoje."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:778
|
#: ../js/ui/status/network.js:815
|
||||||
msgid "Turn Off Airplane Mode"
|
msgid "Turn Off Airplane Mode"
|
||||||
msgstr "Išjungti skrydžio veikseną"
|
msgstr "Išjungti skrydžio veikseną"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:787
|
#: ../js/ui/status/network.js:824
|
||||||
msgid "Wi-Fi is Off"
|
msgid "Wi-Fi is Off"
|
||||||
msgstr "Belaidžio ryšys išjungtas"
|
msgstr "Belaidžio ryšys išjungtas"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:788
|
#: ../js/ui/status/network.js:825
|
||||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||||
msgstr "Norint prisijungti prie tinklo reikia įjungti belaidį ryšį."
|
msgstr "Norint prisijungti prie tinklo reikia įjungti belaidį ryšį."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:789
|
#: ../js/ui/status/network.js:826
|
||||||
msgid "Turn On Wi-Fi"
|
msgid "Turn On Wi-Fi"
|
||||||
msgstr "Įjungti belaidį ryšį"
|
msgstr "Įjungti belaidį ryšį"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:814
|
#: ../js/ui/status/network.js:851
|
||||||
msgid "Wi-Fi Networks"
|
msgid "Wi-Fi Networks"
|
||||||
msgstr "Wi-Fi tinklai"
|
msgstr "Wi-Fi tinklai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:816
|
#: ../js/ui/status/network.js:853
|
||||||
msgid "Select a network"
|
msgid "Select a network"
|
||||||
msgstr "Pasirinkite tinklą"
|
msgstr "Pasirinkite tinklą"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:845
|
#: ../js/ui/status/network.js:882
|
||||||
msgid "No Networks"
|
msgid "No Networks"
|
||||||
msgstr "Nėra tinklų"
|
msgstr "Nėra tinklų"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
|
||||||
msgid "Use hardware switch to turn off"
|
msgid "Use hardware switch to turn off"
|
||||||
msgstr "Išjungimui naudoti aparatinį jungiklį"
|
msgstr "Išjungimui naudoti aparatinį jungiklį"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1136
|
#: ../js/ui/status/network.js:1173
|
||||||
msgid "Select Network"
|
msgid "Select Network"
|
||||||
msgstr "Pasirinkite tinklą"
|
msgstr "Pasirinkite tinklą"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1142
|
#: ../js/ui/status/network.js:1179
|
||||||
msgid "Wi-Fi Settings"
|
msgid "Wi-Fi Settings"
|
||||||
msgstr "Belaidžio ryšio nustatymai"
|
msgstr "Belaidžio ryšio nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:1281
|
||||||
msgid "Turn On"
|
msgid "Turn On"
|
||||||
msgstr "Įjungti"
|
msgstr "Įjungti"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1251
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "Hotspot Active"
|
msgid "Hotspot Active"
|
||||||
msgstr "Prieigos taškas aktyvus"
|
msgstr "Prieigos taškas aktyvus"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1362
|
#: ../js/ui/status/network.js:1409
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "jungiamasi..."
|
msgstr "jungiamasi..."
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password */
|
#. Translators: this is for network connections that require some kind of key or password */
|
||||||
#: ../js/ui/status/network.js:1365
|
#: ../js/ui/status/network.js:1412
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "reikia patvirtinti tapatybę"
|
msgstr "reikia patvirtinti tapatybę"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1367
|
#: ../js/ui/status/network.js:1414
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "nepavyko prisijungti"
|
msgstr "nepavyko prisijungti"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Tinklo nustatymai"
|
msgstr "Tinklo nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1435
|
#: ../js/ui/status/network.js:1482
|
||||||
msgid "VPN Settings"
|
msgid "VPN Settings"
|
||||||
msgstr "VPN nustatymai"
|
msgstr "VPN nustatymai"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1454
|
#: ../js/ui/status/network.js:1501
|
||||||
msgid "VPN"
|
msgid "VPN"
|
||||||
msgstr "VPN"
|
msgstr "VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1607
|
#: ../js/ui/status/network.js:1656
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Tinklo valdymas"
|
msgstr "Tinklo valdymas"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1647
|
#: ../js/ui/status/network.js:1696
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Tinklo ryšio nepavyko aktyvuoti"
|
msgstr "Tinklo ryšio nepavyko aktyvuoti"
|
||||||
|
|
||||||
@ -1667,11 +1715,11 @@ msgstr "Prisijungti kitu naudotoju"
|
|||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Atrakinimo langas"
|
msgstr "Atrakinimo langas"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:100
|
#: ../js/ui/viewSelector.js:233
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Programos"
|
msgstr "Programos"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:104
|
#: ../js/ui/viewSelector.js:237
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Ieškoti"
|
msgstr "Ieškoti"
|
||||||
|
|
||||||
@ -1680,22 +1728,22 @@ msgstr "Ieškoti"
|
|||||||
msgid "“%s” is ready"
|
msgid "“%s” is ready"
|
||||||
msgstr "„%s“ yra pasirengusi"
|
msgstr "„%s“ yra pasirengusi"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:57
|
#: ../js/ui/windowManager.js:58
|
||||||
msgid "Do you want to keep these display settings?"
|
msgid "Do you want to keep these display settings?"
|
||||||
msgstr "Ar nori įrašyti šiuos vaizduoklio nustatymus?"
|
msgstr "Ar nori įrašyti šiuos vaizduoklio nustatymus?"
|
||||||
|
|
||||||
#. Translators: this and the following message should be limited in lenght,
|
#. Translators: this and the following message should be limited in lenght,
|
||||||
#. to avoid ellipsizing the labels.
|
#. to avoid ellipsizing the labels.
|
||||||
#. */
|
#. */
|
||||||
#: ../js/ui/windowManager.js:76
|
#: ../js/ui/windowManager.js:77
|
||||||
msgid "Revert Settings"
|
msgid "Revert Settings"
|
||||||
msgstr "Grąžinti nustatymus"
|
msgstr "Grąžinti nustatymus"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:80
|
#: ../js/ui/windowManager.js:81
|
||||||
msgid "Keep Changes"
|
msgid "Keep Changes"
|
||||||
msgstr "Įrašyti pakeitimus"
|
msgstr "Įrašyti pakeitimus"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:99
|
#: ../js/ui/windowManager.js:100
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Settings changes will revert in %d second"
|
msgid "Settings changes will revert in %d second"
|
||||||
msgid_plural "Settings changes will revert in %d seconds"
|
msgid_plural "Settings changes will revert in %d seconds"
|
||||||
@ -1771,19 +1819,19 @@ msgstr[2] "%u įvesčių"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Sistemos garsai"
|
msgstr "Sistemos garsai"
|
||||||
|
|
||||||
#: ../src/main.c:349
|
#: ../src/main.c:371
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Išvesti versijos numerį"
|
msgstr "Išvesti versijos numerį"
|
||||||
|
|
||||||
#: ../src/main.c:355
|
#: ../src/main.c:377
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Veiksena, naudojama GDM prisijungimo ekrane"
|
msgstr "Veiksena, naudojama GDM prisijungimo ekrane"
|
||||||
|
|
||||||
#: ../src/main.c:361
|
#: ../src/main.c:383
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr "Naudoti konkrečią veikseną, pvz., „gdm“ prisijungimo ekranui"
|
msgstr "Naudoti konkrečią veikseną, pvz., „gdm“ prisijungimo ekranui"
|
||||||
|
|
||||||
#: ../src/main.c:367
|
#: ../src/main.c:389
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Išvardinti galimas veiksenas"
|
msgstr "Išvardinti galimas veiksenas"
|
||||||
|
|
||||||
@ -1803,4 +1851,3 @@ msgstr "Slaptažodis negali būti tuščias"
|
|||||||
#: ../src/shell-polkit-authentication-agent.c:346
|
#: ../src/shell-polkit-authentication-agent.c:346
|
||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"
|
msgstr "Naudotojas užvėrė tapatybės patvirtinimo dialogą"
|
||||||
|
|
||||||
|
342
po/pt_BR.po
342
po/pt_BR.po
@ -21,8 +21,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2014-06-03 07:28+0000\n"
|
"POT-Creation-Date: 2014-07-18 07:33+0000\n"
|
||||||
"PO-Revision-Date: 2014-06-03 10:26-0300\n"
|
"PO-Revision-Date: 2014-07-18 13:24-0300\n"
|
||||||
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
|
||||||
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
"Language-Team: Brazilian Portuguese <gnome-pt_br-list@gnome.org>\n"
|
||||||
"Language: pt_BR\n"
|
"Language: pt_BR\n"
|
||||||
@ -139,18 +139,27 @@ msgstr ""
|
|||||||
"área de favoritos."
|
"área de favoritos."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
|
msgid "App Picker View"
|
||||||
|
msgstr "Visualização do seletor de aplicativos"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
||||||
|
msgid "Index of the currently selected view in the application picker."
|
||||||
|
msgstr ""
|
||||||
|
"Índice da visualização atualmente selecionada no seletor de aplicativos."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
msgstr "Histórico do diálogo de comandos (Alt-F2)"
|
msgstr "Histórico do diálogo de comandos (Alt-F2)"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:10
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||||
msgid "History for the looking glass dialog"
|
msgid "History for the looking glass dialog"
|
||||||
msgstr "Histórico do diálogo do shell looking glass"
|
msgstr "Histórico do diálogo do shell looking glass"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
msgid "Always show the 'Log out' menu item in the user menu."
|
msgid "Always show the 'Log out' menu item in the user menu."
|
||||||
msgstr "Sempre mostrar o item de menu \"Encerrar sessão\" no menu de usuário."
|
msgstr "Sempre mostrar o item de menu \"Encerrar sessão\" no menu de usuário."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
"This key overrides the automatic hiding of the 'Log out' menu item in single-"
|
||||||
"user, single-session situations."
|
"user, single-session situations."
|
||||||
@ -159,14 +168,14 @@ msgstr ""
|
|||||||
"sessão\" quando houver somente um usuário, em situações de somente uma "
|
"sessão\" quando houver somente um usuário, em situações de somente uma "
|
||||||
"sessão."
|
"sessão."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||||
msgid ""
|
msgid ""
|
||||||
"Whether to remember password for mounting encrypted or remote filesystems"
|
"Whether to remember password for mounting encrypted or remote filesystems"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Se lembra ou não as senhas para montar sistemas de arquivos criptografados "
|
"Se lembra ou não as senhas para montar sistemas de arquivos criptografados "
|
||||||
"ou remotos"
|
"ou remotos"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
||||||
msgid ""
|
msgid ""
|
||||||
"The shell will request a password when an encrypted device or a remote "
|
"The shell will request a password when an encrypted device or a remote "
|
||||||
"filesystem is mounted. If the password can be saved for future use a "
|
"filesystem is mounted. If the password can be saved for future use a "
|
||||||
@ -178,70 +187,78 @@ msgstr ""
|
|||||||
"posterior, a caixa de seleção 'Lembrar senha' estará presente. Esta chave "
|
"posterior, a caixa de seleção 'Lembrar senha' estará presente. Esta chave "
|
||||||
"ajusta o estado padrão da caixa de seleção."
|
"ajusta o estado padrão da caixa de seleção."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "Mostrar o número da semana na agenda"
|
msgstr "Mostrar o número da semana na agenda"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:16
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
||||||
msgid "If true, display the ISO week date in the calendar."
|
msgid "If true, display the ISO week date in the calendar."
|
||||||
msgstr "Se verdadeiro, exibe o número da semana na agenda."
|
msgstr "Se verdadeiro, exibe o número da semana na agenda."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:17
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
||||||
msgid "Keybinding to open the application menu"
|
msgid "Keybinding to open the application menu"
|
||||||
msgstr "Atalho de teclado para abrir um menu de aplicativo"
|
msgstr "Atalho de teclado para abrir um menu de aplicativo"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:18
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Atalho de teclado para abrir um menu de aplicativo."
|
msgstr "Atalho de teclado para abrir um menu de aplicativo."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:19
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||||
msgid "Keybinding to open the \"Show Applications\" view"
|
msgid "Keybinding to open the \"Show Applications\" view"
|
||||||
msgstr "Atalho de teclado para abrir a visualização \"Mostrar aplicativos\""
|
msgstr "Atalho de teclado para abrir a visualização \"Mostrar aplicativos\""
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Atalho de teclado para abrir a visualização \"Mostrar aplicativos\" do "
|
"Atalho de teclado para abrir a visualização \"Mostrar aplicativos\" do "
|
||||||
"panorama de atividades."
|
"panorama de atividades."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||||
msgid "Keybinding to open the overview"
|
msgid "Keybinding to open the overview"
|
||||||
msgstr "Atalho de teclado para abrir o panorama"
|
msgstr "Atalho de teclado para abrir o panorama"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
||||||
msgid "Keybinding to open the Activities Overview."
|
msgid "Keybinding to open the Activities Overview."
|
||||||
msgstr "Atalho de teclado para abrir o panorama de atividades."
|
msgstr "Atalho de teclado para abrir o panorama de atividades."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||||
msgid "Keybinding to toggle the visibility of the message tray"
|
msgid "Keybinding to toggle the visibility of the message tray"
|
||||||
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação"
|
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:24
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||||
msgid "Keybinding to toggle the visibility of the message tray."
|
msgid "Keybinding to toggle the visibility of the message tray."
|
||||||
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação."
|
msgstr "Atalho de teclado para alternar a visibilidade da área de notificação."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||||
msgid "Keybinding to focus the active notification"
|
msgid "Keybinding to focus the active notification"
|
||||||
msgstr "Atalho de teclado para ativar a notificação ativa"
|
msgstr "Atalho de teclado para ativar a notificação ativa"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
||||||
msgid "Keybinding to focus the active notification."
|
msgid "Keybinding to focus the active notification."
|
||||||
msgstr "Atalho de teclado para ativar a notificação ativa."
|
msgstr "Atalho de teclado para ativar a notificação ativa."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
# Tween pode significar uma contração de Between ou se referir a um termo "in-between" usado em animação gráfica. -- Enrico
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||||
|
msgid ""
|
||||||
|
"Keybinding that pauses and resumes all running tweens, for debugging purposes"
|
||||||
|
msgstr ""
|
||||||
|
"Atalho de teclado que pausa e continua todos os intermediários em execução, "
|
||||||
|
"a fim de depuração"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
msgstr "Qual teclado usar"
|
msgstr "Qual teclado usar"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:28
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||||
msgid "The type of keyboard to use."
|
msgid "The type of keyboard to use."
|
||||||
msgstr "O tipo do teclado para usar."
|
msgstr "O tipo do teclado para usar."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
||||||
msgid "The maximum accuracy level of location."
|
msgid "The maximum accuracy level of location."
|
||||||
msgstr "O nível máximo de precisão de local."
|
msgstr "O nível máximo de precisão de local."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures the maximum level of location accuracy applications are allowed "
|
"Configures the maximum level of location accuracy applications are allowed "
|
||||||
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
"to see. Valid options are 'off' (disable location tracking), 'country', "
|
||||||
@ -259,11 +276,24 @@ msgstr ""
|
|||||||
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
|
"recursos de rede (apesar de na melhor hipótese usarem precisão à nível de "
|
||||||
"rua)."
|
"rua)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
||||||
|
msgid "Limit switcher to current workspace."
|
||||||
|
msgstr "Limitar o alternador ao espaço de trabalho atual."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
||||||
|
msgid ""
|
||||||
|
"If true, only applications that have windows on the current workspace are "
|
||||||
|
"shown in the switcher. Otherwise, all applications are included."
|
||||||
|
msgstr ""
|
||||||
|
"Se verdadeiro, o alternador mostrará somente os aplicativos que possuem "
|
||||||
|
"janelas no espaço de trabalho atual. Caso contrário, todos os aplicativos "
|
||||||
|
"serão incluídos."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
||||||
msgid "The application icon mode."
|
msgid "The application icon mode."
|
||||||
msgstr "O modo ícone do aplicativo."
|
msgstr "O modo ícone do aplicativo."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:32
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
||||||
msgid ""
|
msgid ""
|
||||||
"Configures how the windows are shown in the switcher. Valid possibilities "
|
"Configures how the windows are shown in the switcher. Valid possibilities "
|
||||||
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
|
||||||
@ -273,48 +303,59 @@ msgstr ""
|
|||||||
"válidas são 'thumbnail-only' (mostra uma miniatura da janela), 'app-icon-"
|
"válidas são 'thumbnail-only' (mostra uma miniatura da janela), 'app-icon-"
|
||||||
"only' (mostra apenas o ícone do aplicativo) ou 'both'."
|
"only' (mostra apenas o ícone do aplicativo) ou 'both'."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:33
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
||||||
|
msgid ""
|
||||||
|
"If true, only windows from the current workspace are shown in the switcher. "
|
||||||
|
"Otherwise, all windows are included."
|
||||||
|
msgstr ""
|
||||||
|
"Se verdadeiro, o alternador mostrará somente as janelas do espaço de "
|
||||||
|
"trabalho atual. Caso contrário, todos as janelas serão incluídas."
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:39
|
||||||
msgid "Attach modal dialog to the parent window"
|
msgid "Attach modal dialog to the parent window"
|
||||||
msgstr "Anexar diálogo modal à janela pai"
|
msgstr "Anexar diálogo modal à janela pai"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:34
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:40
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do "
|
"Esta chave sobrescreve a chave em org.gnome.mutter ao executar o Shell do "
|
||||||
"GNOME."
|
"GNOME."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:35
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:41
|
||||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Habilitar contorno ladrilhado ao arrastar janelas sobre as bordas da tela"
|
"Habilitar contorno ladrilhado ao arrastar janelas sobre as bordas da tela"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:36
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:42
|
||||||
msgid "Workspaces are managed dynamically"
|
msgid "Workspaces are managed dynamically"
|
||||||
msgstr "Espaços de trabalho são gerenciados dinamicamente"
|
msgstr "Espaços de trabalho são gerenciados dinamicamente"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:37
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:43
|
||||||
msgid "Workspaces only on primary monitor"
|
msgid "Workspaces only on primary monitor"
|
||||||
msgstr "Espaços de trabalho apenas no monitor primário"
|
msgstr "Espaços de trabalho apenas no monitor primário"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:38
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:44
|
||||||
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
msgid "Delay focus changes in mouse mode until the pointer stops moving"
|
||||||
msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
|
msgstr "Atrasar foco altera o modo do mouse até o ponteiro parar de mover"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.Shell.PortalHelper.desktop.in.h:1
|
||||||
|
msgid "Captive Portal"
|
||||||
|
msgstr "Portal cativo"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:125
|
#: ../js/extensionPrefs/main.js:125
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
|
msgstr "Ocorreu um erro ao carregar o dialogo de preferências para %s:"
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:157
|
#: ../js/extensionPrefs/main.js:157
|
||||||
#| msgid "Configure GNOME Shell Extensions"
|
|
||||||
msgid "GNOME Shell Extensions"
|
msgid "GNOME Shell Extensions"
|
||||||
msgstr "Extensões do Shell do GNOME"
|
msgstr "Extensões do Shell do GNOME"
|
||||||
|
|
||||||
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:136
|
#: ../js/gdm/authPrompt.js:147 ../js/ui/components/networkAgent.js:142
|
||||||
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
#: ../js/ui/components/polkitAgent.js:166 ../js/ui/endSessionDialog.js:429
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:399
|
||||||
#: ../js/ui/status/network.js:878
|
#: ../js/ui/status/network.js:915
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Cancelar"
|
msgstr "Cancelar"
|
||||||
|
|
||||||
@ -345,8 +386,8 @@ msgstr "Não está listado?"
|
|||||||
msgid "(e.g., user or %s)"
|
msgid "(e.g., user or %s)"
|
||||||
msgstr "(ex.: usuário ou %s)"
|
msgstr "(ex.: usuário ou %s)"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:262
|
#: ../js/gdm/loginDialog.js:619 ../js/ui/components/networkAgent.js:268
|
||||||
#: ../js/ui/components/networkAgent.js:280
|
#: ../js/ui/components/networkAgent.js:286
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "Nome de usuário: "
|
msgstr "Nome de usuário: "
|
||||||
|
|
||||||
@ -375,31 +416,35 @@ msgstr "Não foi possível analisar comando:"
|
|||||||
msgid "Execution of “%s” failed:"
|
msgid "Execution of “%s” failed:"
|
||||||
msgstr "A execução de \"%s\" falhou:"
|
msgstr "A execução de \"%s\" falhou:"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:640
|
#: ../js/portalHelper/main.js:84
|
||||||
|
msgid "Web Authentication Redirect"
|
||||||
|
msgstr "Redirecionamento para autenticação web"
|
||||||
|
|
||||||
|
#: ../js/ui/appDisplay.js:641
|
||||||
msgid "Frequently used applications will appear here"
|
msgid "Frequently used applications will appear here"
|
||||||
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
msgstr "Aplicativos usados frequentemente vão aparecer aqui"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:751
|
#: ../js/ui/appDisplay.js:752
|
||||||
msgid "Frequent"
|
msgid "Frequent"
|
||||||
msgstr "Frequente"
|
msgstr "Frequente"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:758
|
#: ../js/ui/appDisplay.js:759
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "Todos"
|
msgstr "Todos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1571
|
#: ../js/ui/appDisplay.js:1613
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nova janela"
|
msgstr "Nova janela"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1593 ../js/ui/dash.js:285
|
#: ../js/ui/appDisplay.js:1635 ../js/ui/dash.js:285
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Remover dos favoritos"
|
msgstr "Remover dos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1599
|
#: ../js/ui/appDisplay.js:1641
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Adicionar aos favoritos"
|
msgstr "Adicionar aos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1608
|
#: ../js/ui/appDisplay.js:1650
|
||||||
msgid "Show Details"
|
msgid "Show Details"
|
||||||
msgstr "Mostrar detalhes"
|
msgstr "Mostrar detalhes"
|
||||||
|
|
||||||
@ -413,7 +458,7 @@ msgstr "%s foi adicionado aos seus favoritos."
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s foi removido dos seus favoritos."
|
msgstr "%s foi removido dos seus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:810
|
#: ../js/ui/backgroundMenu.js:19 ../js/ui/panel.js:809
|
||||||
#: ../js/ui/status/system.js:337
|
#: ../js/ui/status/system.js:337
|
||||||
msgid "Settings"
|
msgid "Settings"
|
||||||
msgstr "Configurações"
|
msgstr "Configurações"
|
||||||
@ -547,35 +592,35 @@ msgid "Next month"
|
|||||||
msgstr "Próximo mês"
|
msgstr "Próximo mês"
|
||||||
|
|
||||||
#. Translators: Text to show if there are no events */
|
#. Translators: Text to show if there are no events */
|
||||||
#: ../js/ui/calendar.js:775
|
#: ../js/ui/calendar.js:785
|
||||||
msgid "Nothing Scheduled"
|
msgid "Nothing Scheduled"
|
||||||
msgstr "Nada agendado"
|
msgstr "Nada agendado"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
#. Translators: Shown on calendar heading when selected day occurs on current year */
|
||||||
#: ../js/ui/calendar.js:793
|
#: ../js/ui/calendar.js:803
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d"
|
msgid "%A, %B %d"
|
||||||
msgstr "%A, %d de %B"
|
msgstr "%A, %d de %B"
|
||||||
|
|
||||||
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
#. Translators: Shown on calendar heading when selected day occurs on different year */
|
||||||
#: ../js/ui/calendar.js:796
|
#: ../js/ui/calendar.js:806
|
||||||
msgctxt "calendar heading"
|
msgctxt "calendar heading"
|
||||||
msgid "%A, %B %d, %Y"
|
msgid "%A, %B %d, %Y"
|
||||||
msgstr "%A, %d de %B de %Y"
|
msgstr "%A, %d de %B de %Y"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:807
|
#: ../js/ui/calendar.js:817
|
||||||
msgid "Today"
|
msgid "Today"
|
||||||
msgstr "Hoje"
|
msgstr "Hoje"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:811
|
#: ../js/ui/calendar.js:821
|
||||||
msgid "Tomorrow"
|
msgid "Tomorrow"
|
||||||
msgstr "Amanhã"
|
msgstr "Amanhã"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:822
|
#: ../js/ui/calendar.js:832
|
||||||
msgid "This week"
|
msgid "This week"
|
||||||
msgstr "Esta semana"
|
msgstr "Esta semana"
|
||||||
|
|
||||||
#: ../js/ui/calendar.js:830
|
#: ../js/ui/calendar.js:840
|
||||||
msgid "Next week"
|
msgid "Next week"
|
||||||
msgstr "Próxima semana"
|
msgstr "Próxima semana"
|
||||||
|
|
||||||
@ -608,40 +653,40 @@ msgstr "Senha:"
|
|||||||
msgid "Type again:"
|
msgid "Type again:"
|
||||||
msgstr "Digite novamente:"
|
msgstr "Digite novamente:"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:131 ../js/ui/status/network.js:240
|
#: ../js/ui/components/networkAgent.js:137 ../js/ui/status/network.js:277
|
||||||
#: ../js/ui/status/network.js:322 ../js/ui/status/network.js:881
|
#: ../js/ui/status/network.js:359 ../js/ui/status/network.js:918
|
||||||
msgid "Connect"
|
msgid "Connect"
|
||||||
msgstr "Conectar"
|
msgstr "Conectar"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:224
|
#: ../js/ui/components/networkAgent.js:230
|
||||||
#: ../js/ui/components/networkAgent.js:236
|
#: ../js/ui/components/networkAgent.js:242
|
||||||
#: ../js/ui/components/networkAgent.js:264
|
#: ../js/ui/components/networkAgent.js:270
|
||||||
#: ../js/ui/components/networkAgent.js:284
|
#: ../js/ui/components/networkAgent.js:290
|
||||||
#: ../js/ui/components/networkAgent.js:294
|
#: ../js/ui/components/networkAgent.js:300
|
||||||
msgid "Password: "
|
msgid "Password: "
|
||||||
msgstr "Senha: "
|
msgstr "Senha: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:229
|
#: ../js/ui/components/networkAgent.js:235
|
||||||
msgid "Key: "
|
msgid "Key: "
|
||||||
msgstr "Chave: "
|
msgstr "Chave: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:268
|
#: ../js/ui/components/networkAgent.js:274
|
||||||
msgid "Identity: "
|
msgid "Identity: "
|
||||||
msgstr "Identidade: "
|
msgstr "Identidade: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:270
|
#: ../js/ui/components/networkAgent.js:276
|
||||||
msgid "Private key password: "
|
msgid "Private key password: "
|
||||||
msgstr "Senha da chave privada: "
|
msgstr "Senha da chave privada: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:282
|
#: ../js/ui/components/networkAgent.js:288
|
||||||
msgid "Service: "
|
msgid "Service: "
|
||||||
msgstr "Serviço: "
|
msgstr "Serviço: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:311
|
#: ../js/ui/components/networkAgent.js:317
|
||||||
msgid "Authentication required by wireless network"
|
msgid "Authentication required by wireless network"
|
||||||
msgstr "Autenticação requisitada pela rede sem fio"
|
msgstr "Autenticação requisitada pela rede sem fio"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:312
|
#: ../js/ui/components/networkAgent.js:318
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Passwords or encryption keys are required to access the wireless network "
|
"Passwords or encryption keys are required to access the wireless network "
|
||||||
@ -650,35 +695,35 @@ msgstr ""
|
|||||||
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
|
"Senhas ou chaves criptografadas são necessárias para acessar a rede sem fio "
|
||||||
"\"%s\"."
|
"\"%s\"."
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:316
|
#: ../js/ui/components/networkAgent.js:322
|
||||||
msgid "Wired 802.1X authentication"
|
msgid "Wired 802.1X authentication"
|
||||||
msgstr "Autenticação 802.1X cabeada"
|
msgstr "Autenticação 802.1X cabeada"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:318
|
#: ../js/ui/components/networkAgent.js:324
|
||||||
msgid "Network name: "
|
msgid "Network name: "
|
||||||
msgstr "Nome da rede: "
|
msgstr "Nome da rede: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:323
|
#: ../js/ui/components/networkAgent.js:329
|
||||||
msgid "DSL authentication"
|
msgid "DSL authentication"
|
||||||
msgstr "Autenticação DSL"
|
msgstr "Autenticação DSL"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:330
|
#: ../js/ui/components/networkAgent.js:336
|
||||||
msgid "PIN code required"
|
msgid "PIN code required"
|
||||||
msgstr "Código PIN requisitado"
|
msgstr "Código PIN requisitado"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:331
|
#: ../js/ui/components/networkAgent.js:337
|
||||||
msgid "PIN code is needed for the mobile broadband device"
|
msgid "PIN code is needed for the mobile broadband device"
|
||||||
msgstr "O código PIN é necessário para o dispositivo móvel de banda larga"
|
msgstr "O código PIN é necessário para o dispositivo móvel de banda larga"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:332
|
#: ../js/ui/components/networkAgent.js:338
|
||||||
msgid "PIN: "
|
msgid "PIN: "
|
||||||
msgstr "PIN: "
|
msgstr "PIN: "
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:338
|
#: ../js/ui/components/networkAgent.js:344
|
||||||
msgid "Mobile broadband network password"
|
msgid "Mobile broadband network password"
|
||||||
msgstr "Senha da rede de banda larga móvel"
|
msgstr "Senha da rede de banda larga móvel"
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:339
|
#: ../js/ui/components/networkAgent.js:345
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "A password is required to connect to “%s”."
|
msgid "A password is required to connect to “%s”."
|
||||||
msgstr "Uma senha é necessária para se conectar a \"%s\""
|
msgstr "Uma senha é necessária para se conectar a \"%s\""
|
||||||
@ -976,7 +1021,7 @@ msgstr "Visualizar conta"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Razão desconhecida"
|
msgstr "Razão desconhecida"
|
||||||
|
|
||||||
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:96
|
#: ../js/ui/ctrlAltTab.js:29 ../js/ui/viewSelector.js:229
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
msgstr "Janelas"
|
msgstr "Janelas"
|
||||||
|
|
||||||
@ -988,23 +1033,23 @@ msgstr "Mostrar aplicativos"
|
|||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "Dash"
|
msgstr "Dash"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:97
|
#: ../js/ui/dateMenu.js:96
|
||||||
msgid "Open Calendar"
|
msgid "Open Calendar"
|
||||||
msgstr "Abrir agenda"
|
msgstr "Abrir agenda"
|
||||||
|
|
||||||
#: ../js/ui/dateMenu.js:101
|
#: ../js/ui/dateMenu.js:100
|
||||||
msgid "Open Clocks"
|
msgid "Open Clocks"
|
||||||
msgstr "Abrir relógios"
|
msgstr "Abrir relógios"
|
||||||
|
|
||||||
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
|
# O "&" foi inserido como "e" para versão 3.8.0 no gnome-control-center
|
||||||
#: ../js/ui/dateMenu.js:108
|
#: ../js/ui/dateMenu.js:107
|
||||||
msgid "Date & Time Settings"
|
msgid "Date & Time Settings"
|
||||||
msgstr "Configurações de data & hora"
|
msgstr "Configurações de data & hora"
|
||||||
|
|
||||||
#. Translators: This is the date format to use when the calendar popup is
|
#. Translators: This is the date format to use when the calendar popup is
|
||||||
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
|
||||||
#. */
|
#. */
|
||||||
#: ../js/ui/dateMenu.js:205
|
#: ../js/ui/dateMenu.js:204
|
||||||
msgid "%A %B %e, %Y"
|
msgid "%A %B %e, %Y"
|
||||||
msgstr "%A, %e de %B de %Y"
|
msgstr "%A, %e de %B de %Y"
|
||||||
|
|
||||||
@ -1085,7 +1130,7 @@ msgstr[1] "O sistema irá reiniciar automaticamente em %d segundos."
|
|||||||
#: ../js/ui/endSessionDialog.js:121
|
#: ../js/ui/endSessionDialog.js:121
|
||||||
msgctxt "title"
|
msgctxt "title"
|
||||||
msgid "Restart & Install Updates"
|
msgid "Restart & Install Updates"
|
||||||
msgstr "Reiniciar & Instalar atualizações"
|
msgstr "Reiniciar & instalar atualizações"
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:123
|
#: ../js/ui/endSessionDialog.js:123
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
@ -1181,7 +1226,7 @@ msgstr "Habilitado"
|
|||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
#: ../js/ui/lookingGlass.js:719 ../js/ui/status/location.js:164
|
||||||
#: ../js/ui/status/network.js:555 ../src/gvc/gvc-mixer-control.c:1830
|
#: ../js/ui/status/network.js:592 ../src/gvc/gvc-mixer-control.c:1830
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Desabilitado"
|
msgstr "Desabilitado"
|
||||||
|
|
||||||
@ -1205,43 +1250,43 @@ msgstr "Ver fonte"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Página web"
|
msgstr "Página web"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1326
|
#: ../js/ui/messageTray.js:1325
|
||||||
msgid "Open"
|
msgid "Open"
|
||||||
msgstr "Abrir"
|
msgstr "Abrir"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1333
|
#: ../js/ui/messageTray.js:1332
|
||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "Remover"
|
msgstr "Remover"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1630
|
#: ../js/ui/messageTray.js:1629
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Notificações"
|
msgstr "Notificações"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1637
|
#: ../js/ui/messageTray.js:1636
|
||||||
msgid "Clear Messages"
|
msgid "Clear Messages"
|
||||||
msgstr "Sem mensagens"
|
msgstr "Sem mensagens"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1656
|
#: ../js/ui/messageTray.js:1655
|
||||||
msgid "Notification Settings"
|
msgid "Notification Settings"
|
||||||
msgstr "Configurações de notificação"
|
msgstr "Configurações de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1709
|
#: ../js/ui/messageTray.js:1708
|
||||||
msgid "Tray Menu"
|
msgid "Tray Menu"
|
||||||
msgstr "Menu de notificação"
|
msgstr "Menu de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1926
|
#: ../js/ui/messageTray.js:1925
|
||||||
msgid "No Messages"
|
msgid "No Messages"
|
||||||
msgstr "Sem mensagens"
|
msgstr "Sem mensagens"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1964
|
#: ../js/ui/messageTray.js:1963
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "Área de notificação"
|
msgstr "Área de notificação"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2967
|
#: ../js/ui/messageTray.js:2966
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Informações do sistema"
|
msgstr "Informações do sistema"
|
||||||
|
|
||||||
#: ../js/ui/notificationDaemon.js:516 ../src/shell-app.c:425
|
#: ../js/ui/notificationDaemon.js:513 ../src/shell-app.c:425
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Desconhecido"
|
msgstr "Desconhecido"
|
||||||
@ -1269,32 +1314,37 @@ msgstr "Panorama"
|
|||||||
msgid "Type to search…"
|
msgid "Type to search…"
|
||||||
msgstr "Digite para pesquisar…"
|
msgstr "Digite para pesquisar…"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:516
|
#: ../js/ui/panel.js:515
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "Sair"
|
msgstr "Sair"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview". */
|
#. in your language, you can use the word for "Overview". */
|
||||||
#: ../js/ui/panel.js:568
|
#: ../js/ui/panel.js:567
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Atividades"
|
msgstr "Atividades"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:915
|
#: ../js/ui/panel.js:914
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "Barra superior"
|
msgstr "Barra superior"
|
||||||
|
|
||||||
#: ../js/ui/popupMenu.js:279
|
#: ../js/ui/popupMenu.js:274
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:74
|
#: ../js/ui/runDialog.js:70
|
||||||
msgid "Enter a Command"
|
msgid "Enter a Command"
|
||||||
msgstr "Digite um comando"
|
msgstr "Digite um comando"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:114 ../js/ui/windowMenu.js:120
|
#: ../js/ui/runDialog.js:110 ../js/ui/windowMenu.js:120
|
||||||
msgid "Close"
|
msgid "Close"
|
||||||
msgstr "Fechar"
|
msgstr "Fechar"
|
||||||
|
|
||||||
|
#: ../js/ui/runDialog.js:273
|
||||||
|
#| msgid "Estimating…"
|
||||||
|
msgid "Restarting…"
|
||||||
|
msgstr "Reiniciando…"
|
||||||
|
|
||||||
#. Translators: This is a time format for a date in
|
#. Translators: This is a time format for a date in
|
||||||
#. long format */
|
#. long format */
|
||||||
#: ../js/ui/screenShield.js:88
|
#: ../js/ui/screenShield.js:88
|
||||||
@ -1404,9 +1454,9 @@ msgstr "Texto grande"
|
|||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:151
|
#: ../js/ui/status/bluetooth.js:51 ../js/ui/status/network.js:178
|
||||||
#: ../js/ui/status/network.js:323 ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:360 ../js/ui/status/network.js:1281
|
||||||
#: ../js/ui/status/network.js:1345 ../js/ui/status/rfkill.js:86
|
#: ../js/ui/status/network.js:1392 ../js/ui/status/rfkill.js:86
|
||||||
#: ../js/ui/status/rfkill.js:114
|
#: ../js/ui/status/rfkill.js:114
|
||||||
msgid "Turn Off"
|
msgid "Turn Off"
|
||||||
msgstr "Desligar"
|
msgstr "Desligar"
|
||||||
@ -1422,7 +1472,7 @@ msgid_plural "%d Connected Devices"
|
|||||||
msgstr[0] "%d dispositivo conectado"
|
msgstr[0] "%d dispositivo conectado"
|
||||||
msgstr[1] "%d dispositivos conectados"
|
msgstr[1] "%d dispositivos conectados"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1262
|
#: ../js/ui/status/bluetooth.js:106 ../js/ui/status/network.js:1309
|
||||||
msgid "Not Connected"
|
msgid "Not Connected"
|
||||||
msgstr "Não conectado"
|
msgstr "Não conectado"
|
||||||
|
|
||||||
@ -1450,157 +1500,157 @@ msgstr "Habilitar"
|
|||||||
msgid "In Use"
|
msgid "In Use"
|
||||||
msgstr "Em uso"
|
msgstr "Em uso"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:74
|
#: ../js/ui/status/network.js:101
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<desconhecido>"
|
msgstr "<desconhecido>"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:420 ../js/ui/status/network.js:1260
|
#: ../js/ui/status/network.js:457 ../js/ui/status/network.js:1307
|
||||||
#: ../js/ui/status/network.js:1464
|
#: ../js/ui/status/network.js:1511
|
||||||
msgid "Off"
|
msgid "Off"
|
||||||
msgstr "Off"
|
msgstr "Off"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:422
|
#: ../js/ui/status/network.js:459
|
||||||
msgid "Connected"
|
msgid "Connected"
|
||||||
msgstr "Conectado"
|
msgstr "Conectado"
|
||||||
|
|
||||||
# Não gerenciável para transmitir a idéia que o Networkmanager não consegue gerenciar o dispositivo --Enrico
|
# Não gerenciável para transmitir a idéia que o Networkmanager não consegue gerenciar o dispositivo --Enrico
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu) */
|
#. under NetworkManager's control (and thus cannot be used in the menu) */
|
||||||
#: ../js/ui/status/network.js:426
|
#: ../js/ui/status/network.js:463
|
||||||
msgid "Unmanaged"
|
msgid "Unmanaged"
|
||||||
msgstr "Não gerenciável"
|
msgstr "Não gerenciável"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:428
|
#: ../js/ui/status/network.js:465
|
||||||
msgid "Disconnecting"
|
msgid "Disconnecting"
|
||||||
msgstr "Desconectando"
|
msgstr "Desconectando"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:434 ../js/ui/status/network.js:1254
|
#: ../js/ui/status/network.js:471 ../js/ui/status/network.js:1301
|
||||||
msgid "Connecting"
|
msgid "Connecting"
|
||||||
msgstr "Conectando"
|
msgstr "Conectando"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password */
|
#. Translators: this is for network connections that require some kind of key or password */
|
||||||
#: ../js/ui/status/network.js:437
|
#: ../js/ui/status/network.js:474
|
||||||
msgid "Authentication required"
|
msgid "Authentication required"
|
||||||
msgstr "Autenticação necessária"
|
msgstr "Autenticação necessária"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing */
|
#. module, which is missing */
|
||||||
#: ../js/ui/status/network.js:445
|
#: ../js/ui/status/network.js:482
|
||||||
msgid "Firmware missing"
|
msgid "Firmware missing"
|
||||||
msgstr "Firmware em falta"
|
msgstr "Firmware em falta"
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage */
|
#. is disabled by rfkill, or it has no coverage */
|
||||||
#: ../js/ui/status/network.js:449
|
#: ../js/ui/status/network.js:486
|
||||||
msgid "Unavailable"
|
msgid "Unavailable"
|
||||||
msgstr "Indisponível"
|
msgstr "Indisponível"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:451 ../js/ui/status/network.js:1646
|
#: ../js/ui/status/network.js:488 ../js/ui/status/network.js:1695
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "Falha de conexão"
|
msgstr "Falha de conexão"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:467
|
#: ../js/ui/status/network.js:504
|
||||||
msgid "Wired Settings"
|
msgid "Wired Settings"
|
||||||
msgstr "Configurações da rede cabeada"
|
msgstr "Configurações da rede cabeada"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:509 ../js/ui/status/network.js:587
|
#: ../js/ui/status/network.js:546 ../js/ui/status/network.js:624
|
||||||
msgid "Mobile Broadband Settings"
|
msgid "Mobile Broadband Settings"
|
||||||
msgstr "Configurações de banda larga móvel"
|
msgstr "Configurações de banda larga móvel"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:551 ../js/ui/status/network.js:1258
|
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1305
|
||||||
msgid "Hardware Disabled"
|
msgid "Hardware Disabled"
|
||||||
msgstr "Hardware desabilitado"
|
msgstr "Hardware desabilitado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:595
|
#: ../js/ui/status/network.js:632
|
||||||
msgid "Use as Internet connection"
|
msgid "Use as Internet connection"
|
||||||
msgstr "Usar como conexão de Internet"
|
msgstr "Usar como conexão de Internet"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:776
|
#: ../js/ui/status/network.js:813
|
||||||
msgid "Airplane Mode is On"
|
msgid "Airplane Mode is On"
|
||||||
msgstr "Modo avião ligado"
|
msgstr "Modo avião ligado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:777
|
#: ../js/ui/status/network.js:814
|
||||||
msgid "Wi-Fi is disabled when airplane mode is on."
|
msgid "Wi-Fi is disabled when airplane mode is on."
|
||||||
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
|
msgstr "O Wi-Fi é desabilitado quando o modo avião está ligado."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:778
|
#: ../js/ui/status/network.js:815
|
||||||
msgid "Turn Off Airplane Mode"
|
msgid "Turn Off Airplane Mode"
|
||||||
msgstr "Desligar modo avião"
|
msgstr "Desligar modo avião"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:787
|
#: ../js/ui/status/network.js:824
|
||||||
msgid "Wi-Fi is Off"
|
msgid "Wi-Fi is Off"
|
||||||
msgstr "Wi-Fi desligado"
|
msgstr "Wi-Fi desligado"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:788
|
#: ../js/ui/status/network.js:825
|
||||||
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
msgid "Wi-Fi needs to be turned on in order to connect to a network."
|
||||||
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
|
msgstr "O Wi-Fi precisa ser ligado a fim de conectar-se a uma rede."
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:789
|
#: ../js/ui/status/network.js:826
|
||||||
msgid "Turn On Wi-Fi"
|
msgid "Turn On Wi-Fi"
|
||||||
msgstr "Ligar Wi-Fi"
|
msgstr "Ligar Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:814
|
#: ../js/ui/status/network.js:851
|
||||||
msgid "Wi-Fi Networks"
|
msgid "Wi-Fi Networks"
|
||||||
msgstr "Redes Wi-Fi"
|
msgstr "Redes Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:816
|
#: ../js/ui/status/network.js:853
|
||||||
msgid "Select a network"
|
msgid "Select a network"
|
||||||
msgstr "Selecione uma rede"
|
msgstr "Selecione uma rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:845
|
#: ../js/ui/status/network.js:882
|
||||||
msgid "No Networks"
|
msgid "No Networks"
|
||||||
msgstr "Nenhuma rede"
|
msgstr "Nenhuma rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:866 ../js/ui/status/rfkill.js:112
|
#: ../js/ui/status/network.js:903 ../js/ui/status/rfkill.js:112
|
||||||
msgid "Use hardware switch to turn off"
|
msgid "Use hardware switch to turn off"
|
||||||
msgstr "Usar alternador de hardware para desligar"
|
msgstr "Usar alternador de hardware para desligar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1136
|
#: ../js/ui/status/network.js:1173
|
||||||
msgid "Select Network"
|
msgid "Select Network"
|
||||||
msgstr "Selecione a rede"
|
msgstr "Selecione a rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1142
|
#: ../js/ui/status/network.js:1179
|
||||||
msgid "Wi-Fi Settings"
|
msgid "Wi-Fi Settings"
|
||||||
msgstr "Configurações de Wi-Fi"
|
msgstr "Configurações de Wi-Fi"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1234
|
#: ../js/ui/status/network.js:1281
|
||||||
msgid "Turn On"
|
msgid "Turn On"
|
||||||
msgstr "Ligar"
|
msgstr "Ligar"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1251
|
#: ../js/ui/status/network.js:1298
|
||||||
msgid "Hotspot Active"
|
msgid "Hotspot Active"
|
||||||
msgstr "Ponto de acesso ativo"
|
msgstr "Ponto de acesso ativo"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1362
|
#: ../js/ui/status/network.js:1409
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "conectando..."
|
msgstr "conectando..."
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password */
|
#. Translators: this is for network connections that require some kind of key or password */
|
||||||
#: ../js/ui/status/network.js:1365
|
#: ../js/ui/status/network.js:1412
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "autenticação necessária"
|
msgstr "autenticação necessária"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1367
|
#: ../js/ui/status/network.js:1414
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "conexão falhou"
|
msgstr "conexão falhou"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1433 ../js/ui/status/rfkill.js:89
|
#: ../js/ui/status/network.js:1480 ../js/ui/status/rfkill.js:89
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Configurações de rede"
|
msgstr "Configurações de rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1435
|
#: ../js/ui/status/network.js:1482
|
||||||
msgid "VPN Settings"
|
msgid "VPN Settings"
|
||||||
msgstr "Configurações de VPN"
|
msgstr "Configurações de VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1454
|
#: ../js/ui/status/network.js:1501
|
||||||
msgid "VPN"
|
msgid "VPN"
|
||||||
msgstr "VPN"
|
msgstr "VPN"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1607
|
#: ../js/ui/status/network.js:1656
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "Gerenciador de rede"
|
msgstr "Gerenciador de rede"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1647
|
#: ../js/ui/status/network.js:1696
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "Falha ao ativar a conexão da rede"
|
msgstr "Falha ao ativar a conexão da rede"
|
||||||
|
|
||||||
@ -1684,11 +1734,11 @@ msgstr "Iniciar sessão como outro usuário"
|
|||||||
msgid "Unlock Window"
|
msgid "Unlock Window"
|
||||||
msgstr "Desbloquear janela"
|
msgstr "Desbloquear janela"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:100
|
#: ../js/ui/viewSelector.js:233
|
||||||
msgid "Applications"
|
msgid "Applications"
|
||||||
msgstr "Aplicativos"
|
msgstr "Aplicativos"
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:104
|
#: ../js/ui/viewSelector.js:237
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Pesquisar"
|
msgstr "Pesquisar"
|
||||||
|
|
||||||
@ -1697,22 +1747,22 @@ msgstr "Pesquisar"
|
|||||||
msgid "“%s” is ready"
|
msgid "“%s” is ready"
|
||||||
msgstr "\"%s\" está pronto"
|
msgstr "\"%s\" está pronto"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:57
|
#: ../js/ui/windowManager.js:58
|
||||||
msgid "Do you want to keep these display settings?"
|
msgid "Do you want to keep these display settings?"
|
||||||
msgstr "Você deseja manter essas configurações de exibição?"
|
msgstr "Você deseja manter essas configurações de exibição?"
|
||||||
|
|
||||||
#. Translators: this and the following message should be limited in lenght,
|
#. Translators: this and the following message should be limited in lenght,
|
||||||
#. to avoid ellipsizing the labels.
|
#. to avoid ellipsizing the labels.
|
||||||
#. */
|
#. */
|
||||||
#: ../js/ui/windowManager.js:76
|
#: ../js/ui/windowManager.js:77
|
||||||
msgid "Revert Settings"
|
msgid "Revert Settings"
|
||||||
msgstr "Reverter configurações"
|
msgstr "Reverter configurações"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:80
|
#: ../js/ui/windowManager.js:81
|
||||||
msgid "Keep Changes"
|
msgid "Keep Changes"
|
||||||
msgstr "Manter alterações"
|
msgstr "Manter alterações"
|
||||||
|
|
||||||
#: ../js/ui/windowManager.js:99
|
#: ../js/ui/windowManager.js:100
|
||||||
#, javascript-format
|
#, javascript-format
|
||||||
msgid "Settings changes will revert in %d second"
|
msgid "Settings changes will revert in %d second"
|
||||||
msgid_plural "Settings changes will revert in %d seconds"
|
msgid_plural "Settings changes will revert in %d seconds"
|
||||||
@ -1785,19 +1835,19 @@ msgstr[1] "%u entradas"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Sons do sistema"
|
msgstr "Sons do sistema"
|
||||||
|
|
||||||
#: ../src/main.c:349
|
#: ../src/main.c:371
|
||||||
msgid "Print version"
|
msgid "Print version"
|
||||||
msgstr "Versão de impressão"
|
msgstr "Versão de impressão"
|
||||||
|
|
||||||
#: ../src/main.c:355
|
#: ../src/main.c:377
|
||||||
msgid "Mode used by GDM for login screen"
|
msgid "Mode used by GDM for login screen"
|
||||||
msgstr "Modo usado pelo GDM para a tela de início de sessão"
|
msgstr "Modo usado pelo GDM para a tela de início de sessão"
|
||||||
|
|
||||||
#: ../src/main.c:361
|
#: ../src/main.c:383
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr "Utilizar um modo específico, ex.: \"gdm\" para a tela de login"
|
msgstr "Utilizar um modo específico, ex.: \"gdm\" para a tela de login"
|
||||||
|
|
||||||
#: ../src/main.c:367
|
#: ../src/main.c:389
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
msgstr "Listar modos possíveis"
|
msgstr "Listar modos possíveis"
|
||||||
|
|
||||||
|
783
po/zh_HK.po
783
po/zh_HK.po
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user